powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
25 сообщений из 71, страница 1 из 3
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530448
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all.

Дано: новая база (alias = huge_noext), page_size=8K, FW = OFF, buffers=512K, LI-T3.0.0.30824, SuperServer.

Изменённые параметры firebird.conf:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
$ grep "^[^#;]" firebird.conf
DefaultDbCachePages = 512K
FileSystemCacheThreshold = 1024K
AuthServer = Legacy_Auth,Srp
AuthClient = Legacy_Auth,Srp,Win_Sspi
UserManager = Legacy_UserManager
BugcheckAbort = 1
WireCrypt = Disabled
RemoteServicePort = 3333

В базе создаются мастер и деталь таблицы, связанные FK. Кроме того, на каждую таблицу навешено еще по 2 "простых" индекса.
Запускаю скрипт, вставляющий большое число строк (2 млн в мастер таблицу и 200 млн в деталь):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
--/*
set autoddl on;
show version;
commit;
set term ^;create or alter procedure sp_huge_ext as begin end^set term ;^
commit;
recreate table tdetl(id int); commit;
recreate table tmain(id int); commit;
recreate table tlog(id int); commit;

recreate sequence gmain;
recreate sequence gdetl;
recreate table tdetl(id bigint primary key using index tdetl_pk_idx, pid bigint, s01 varchar(36), s02 varchar(36));
recreate table tmain(id bigint primary key using index tmain_pk_idx, s01 varchar(36), s02 varchar(36));
recreate table tlog( gmain bigint, gdetl bigint, dts_before timestamp, dts_after timestamp, elapsed_ms computed by(datediff(millisecond from dts_before to dts_after)) );

alter table tdetl add constraint tdetl_fk foreign key(pid) references tmain using index tdetl_fk_idx;
create index tmain_s01 on tmain(s01);
create index tmain_s02 on tmain(s02);
create index tdetl_s01 on tdetl(s01);
create index tdetl_s02 on tdetl(s02);
commit;
set stat on;
set list on;
select * from mon$database;
commit;
set list off;
set stat off;
--*/

set term ^;
create or alter procedure sp_huge_ext(a_n_main int = -1) returns(msg varchar(100)) as
  declare n_main int = 2000000;
  declare n_detl int = 100; -- child records in tdetl per each parent row in tmain
  declare v_id bigint;
  declare i int;
  declare j int;
  declare verbose_step int=100;
  declare tx timestamp;
  declare tc timestamp;
  declare elapsed_ms_now int;
  declare elapsed_ms_min int = 999999999;
  declare elapsed_ms_max int = -1;
  declare msg4min varchar(25);
  declare msg4max varchar(25);
begin
  n_main=iif(a_n_main > 0, a_n_main, n_main);
  tx=cast('now' as timestamp);
  while(n_main>0) do begin
    j=verbose_step;
    while(j>0) do begin

        n_main = n_main-1; -- main counter

        insert into tmain(id, s01, s02)
        values( gen_id(gmain,1), uuid_to_char(gen_uuid()), uuid_to_char(gen_uuid()) )
        returning :j-1, id into j, v_id;

        i=n_detl;
        while (i>0) do
          insert into tdetl(id, pid, s01,s02)
          values( gen_id(gdetl,1), :v_id, uuid_to_char(gen_uuid()), uuid_to_char(gen_uuid()) )
          returning :i-1 into i;
    end -- j=verbose_step downto 1

    tc=cast('now' as timestamp);
    insert into tlog(gmain, gdetl, dts_before, dts_after)
    values( gen_id(gmain,0), gen_id(gdetl,0), :tx, :tc )
    returning elapsed_ms into elapsed_ms_now;

    if ( elapsed_ms_min > elapsed_ms_now ) then begin
      elapsed_ms_min=elapsed_ms_now;
      msg4min='min_ms='||elapsed_ms_min||' at '||left(right(tc,13),8);
    end

    if ( elapsed_ms_max < elapsed_ms_now ) then begin
      elapsed_ms_max=elapsed_ms_now;
      msg4max='max_ms='||elapsed_ms_max||' at '||left(right(tc,13),8);
    end

    tx=cast('now' as timestamp);

    msg=left(right(tx,13),8)||': gdetl='||right(cast(1000000000+gen_id(gdetl,0) as varchar(10)),9)||'  '||msg4min||'  curr_ms='||elapsed_ms_now||'  '||msg4max;
    suspend;

  end -- while (n_main>0)
end
^set term ;^
commit;

set transaction read write read committed record_version no wait;
select * from sp_huge_ext for update;
commit;
Запускаю во втором окне .sh, который делает 20 коннект-дисконнектов и снимает данные мониторинга с интервалом между выходом и повторным запуском = 10 сек:
askmon.sh
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
delay=10
fdb=huge_noext
fbport=3333
fbhome=/opt/fb30trnk
log=./logs/mon30_$(date +'%y%m%d_%H%M%S').log
err=./logs/mon30_$(date +'%y%m%d_%H%M%S').err
rm -f $log
while :
do
  echo -----------------------------------------------------------------------------------
  echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) - starting quering mon tables
  echo check result in $log, errors in $err
  echo $fbhome/bin/isql localhost/$fbport:$fdb -user sysdba -pas masterke -pag 999 -n i ...
  $fbhome/bin/isql localhost/$fbport:$fdb -user sysdba -pas masterke -pag 999 -n \
                    -i askmon30.sql  2>>$err | sed -e "s/ \{1,\}$//" >>$log
  ls -la $log $err
  p=$delay # temply, 30.10.2013 1658, was: $(( $delay + RANDOM % 30))
  echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) - done. Now take pause $p seconds. . .
  sleep $p
done
askmon30.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
set autoddl off;
set list off;
set blob on;
set width mon_user 20;
set width remote_process 30;
set width sql_txt 50;
set width remote_ip 15;
set width rn 3;
commit;
    select
      current_time dts
      -- mon$attachments:
      ,cast(row_number()over(order by mon$attachment_id) as char(3)) rn
      ,a.mon$remote_address remote_IP
      ,a.mon$attachment_id attach_id
      ,a.mon$user mon_user
      ,a.mon$stat_id       stat_id
      ,a.mon$server_pid    server_PID
      ,a.mon$remote_pid    remote_PID
      -- mon$memory_usage:
      ,u.mon$memory_used used_memory
      ,u.mon$memory_allocated alloc_by_OS
      -- mon$io_stats:
      ,i.mon$page_reads reads
      ,i.mon$page_writes writes
      ,i.mon$page_fetches fetches
      ,i.mon$page_marks marks
      -- mon$record_stats:
      ,r.mon$record_seq_reads seq_reads
      ,r.mon$record_idx_reads idx_reads
      ,r.mon$record_inserts ins_cnt
      ,r.mon$record_updates upd_cnt
      ,r.mon$record_deletes del_cnt
      ,r.mon$record_backouts bk_outs
      ,r.mon$record_purges purges
      ,r.mon$record_expunges expunges
      -- aux info:
      ,right(a.mon$remote_process,30) remote_process
    from mon$attachments a
        left join mon$memory_usage u on a.mon$stat_id=u.mon$stat_id
        left join mon$io_stats i on a.mon$stat_id=i.mon$stat_id
        left join mon$record_stats r on a.mon$stat_id=r.mon$stat_id
    where
      a.mon$attachment_id<>current_connection
;

Скрипт отрабатывает 20 раз, вот фрагмент его лога:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
          DTS RN  REMOTE_IP          ATTACH_ID MON_USER                  STAT_ID   SERVER_PID   REMOTE_PID           USED_MEMORY           ALLOC_BY_OS                 READS                WRITES               FETCHES                 MARKS             SEQ_READS             IDX_READS               INS_CNT               UPD_CNT               DEL_CNT               BK_OUTS                PURGES              EXPUNGES REMOTE_PROCESS
============= === =============== ============ ==================== ============ ============ ============ ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ==============================
12:10:59.0000 1   <null>                    13 Cache Writer                   12        28998       <null>                  9672                131072                     0              32097624                     2                     1                     0                     0                     0                     0                     0                     0                     0                     0 <null>
12:10:59.0000 2   127.0.0.1                 14 SYSDBA                          5        28998        29279               1810928               3427992              30686726               4024446            2487716139             517814324                   319                   947              84215045                    57                    29                     9                     2                     0 /opt/fb30trnk/bin/isql
12:10:59.0000 3   <null>                    15 Garbage Collector              10        28998       <null>                188928                327680                     2                    91                  1474                   159                   502                     0                     0                     0                     0                     0                     3                    29 <null>


          DTS RN  REMOTE_IP          ATTACH_ID MON_USER                  STAT_ID   SERVER_PID   REMOTE_PID           USED_MEMORY           ALLOC_BY_OS                 READS                WRITES               FETCHES                 MARKS             SEQ_READS             IDX_READS               INS_CNT               UPD_CNT               DEL_CNT               BK_OUTS                PURGES              EXPUNGES REMOTE_PROCESS
============= === =============== ============ ==================== ============ ============ ============ ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ===================== ==============================
12:11:09.0000 1   <null>                    13 Cache Writer                   12        28998       <null>                  9672                131072                     0              32226473                     2                     1                     0                     0                     0                     0                     0                     0                     0                     0 <null>
12:11:09.0000 2   127.0.0.1                 14 SYSDBA                          5        28998        29279               1814120               3427992              30814107               4030330            2491296812             518546973                   319                   947              84334190                    57                    29                     9                     2                     0 /opt/fb30trnk/bin/isql
12:11:09.0000 3   <null>                    15 Garbage Collector              10        28998       <null>                188928                327680                     2                    91                  1474                   159                   502                     0                     0                     0                     0                     0                     3                    29 <null>

Этот лог далее затаскивается в эксель, из него удаляются лишние строки с заголовками и пропусками, после чего он упорядочивается по графам {MON_USER, DTS}.
Затем добавляется графа diffWrites, в которую пишутся разности значений графы WRITES (это алиас столба MON$IOSTATS.mon$page_writes).

Ну, и вот: диву даюсь. Получается так, что поток CACHE_WRITER'а пишет за каждые 10 сек по 60-80 тыс страниц. А основной поток, который инсертит в базу, пишет за то же время по 2...3 тысячи.

Чем это объяснить ?
(в аттаче - причёсанный эксельный лист; сравните там значения в графе diffWrites для групп строк с mon_user = cache_writer vs sysdba).
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530455
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

а что именно тебе не нравится? Рабочий поток изменил страницу в кеше, пошел делать дальше свою работу, грязные страницы он писать на диск начнет только когда засрет весь кеш. А пока суть да дело, кешрайтер пишет грязные страницы сам, так что в кеше почти всегда остаются свободные буферы и рабочий поток не тормозится на ненужный I/O. Объем работы (с точки зрения CPU) у кешрайтера намного меньше, поэтому он успевает больше. А основной поток пока запись на страницу положит, пока две-три индексных страницы прочитает, пока ключ вставит...
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530459
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrОбъем работы (с точки зрения CPU) у кешрайтера намного меньше, поэтому он успевает больше. А основной поток пока запись на страницу положит, пока две-три индексных страницы прочитает, пока ключ вставит...Если так, то кешрайтер рано или поздно должен будет некоторое время сидеть сложа руки: он пишет в ДВАДЦАТЬ раз больше страниц, чем рабочий поток и должен когда-нить "догнать и перегнать Америку".
Значит, я могу сейчас запустить мониторинг на 2-3 часа и увидеть в его отчете длительные периоды с diffWrites = 0 - так ?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530466
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кешрайтер пишет ровно столько, сколько рабочий поток пачкает. Отдыхать он будет когда хотя бы четверть кеша станет доступной для повторного использования. Если он успеет писать быстрее, чем рабочий поток пачкать, то да - периодически кешрайтер будет простаивать.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530469
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкешрайтер пишет ровно столько, сколько рабочий поток пачкает. Отдыхать он будет когда хотя бы четверть кеша станет доступной для повторного использования. Если он успеет писать быстрее, чем рабочий поток пачкать, то да - периодически кешрайтер будет простаивать.Какой интервал между снимками посоветуешь сделать, чтобы это увидеть ? Мну кажется, что 10 сек - слишком большой.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530487
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидКакой интервал между снимками посоветуешь сделать, чтобы это увидеть ? Мну кажется, что 10 сек - слишком большой.Ты не теми единицами оперируешь :) Он может простаивать, например, по 1-10 мс между циклами записи - микроскоп бери :)

Чего узнать-то хочешь ?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530502
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladОн может простаивать, например, по 1-10 мс между циклами записи - микроскоп бери :)

Чего узнать-то хочешь ?фигасе... про 1...10 мс - не знал. Это сильно меняет дело :-)
А узнать хотел, как всегда, одно: что так тормозит добавление записей на странице 8К (да и на 16 К будет, наверное, то же самое).
При том, что уже writes barrier = 0 и выставлен noatime. Осталось только data=writeback добавить, но это уже крайняк.

Вот и решил в mon$ покопаться.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530505
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

можешь этот же тест повторить для классика ? Там нет cache writer'а, сравним статистику.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530510
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladможешь этот же тест повторить для классика ? Там нет cache writer'а, сравним статистику.Сейчас не смогу - заливка еще идёт. А обязательно ли для Classic'a ? Нельзя ли для SC ?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530513
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидhvladможешь этот же тест повторить для классика ? Там нет cache writer'а, сравним статистику.Сейчас не смогу - заливка еще идёт. А обязательно ли для Classic'a ? Нельзя ли для SC ?Нет, срочно сейчас - всё бросай !
Есс-но, можно и для SC.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530522
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladможно и для SC.Да, но там вопрос об интервале между запросами к монам - очень актуальный, в отличие от супера. Каким его задать ?

PS. А сохраню-ка сюда еще и батничек, который генерит .sql-скрипт, выполняющий без переконнектов любое число таких запросов к mon$-таблицам, который показан выше. И с любой паузой между окончанием N-го запроса и началом (N+1)-го.
То есть, если ввести вот это:
Код: plaintext
mkaskmon.bat 10 0.5
- то будет сгенерён вот такой монстрик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
-- created auto, do NOT edit!
-- run: $fbhome/bin/isql localhost/$fbport:$fdb -pag 999 -n -i askmon.tmp 2>>$err | sed -e "s/ \{1,\}$//" >>$log 
set autoddl off;
set list off;
set blob on;
set width dts 12;
set width mon_user 20;
set width remote_process 30;
set width sql_txt 50;
set width remote_ip 15;
set width rn 3;
set heading off;
select substring(cast(current_timestamp as varchar(25)) from 12 for 12) dts,'iter #'||1 msg from rdb$database;
set heading on;
 commit; 
select
     substring(cast(current_timestamp as varchar(25)) from 12 for 12) dts
     -- mon$attachments:
     ,cast(row_number()over(order by mon$attachment_id) as char(3)) rn
     . . . 
;
where
      a.mon$attachment_id<>current_connection
;
shell sleep 0.5;


set heading off;
select substring(cast(current_timestamp as varchar(25)) from 12 for 12) dts,'iter #'||2 msg from rdb$database;
 commit; 
select
     substring(cast(current_timestamp as varchar(25)) from 12 for 12) dts
     -- mon$attachments:
     ,cast(row_number()over(order by mon$attachment_id) as char(3)) rn
   . . . 
where
      a.mon$attachment_id<>current_connection
;
shell sleep 0.5;
. . . и так далее 10 раз . . .
- и будет вроде как имитация работы в isql без переконнекта .

Вот этот батник (запускать на винде, копировать затем скрипт askmon.tmp на линух):
mkaskmon.bat
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
@echo off
cls
set sql=askmon.tmp
set n=%1
set p=%2
if .%1.==.. set n=5
if .%2.==.. set p=10

echo -- created auto, do NOT edit!>%sql%
echo -- run: $fbhome/bin/isql localhost/$fbport:$fdb -pag 999 -n -i %sql% 2^>^>$err ^| sed -e "s/ \{1,\}$//" ^>^>$log >>%sql%
echo set autoddl off;>>%sql%
echo set list off;>>%sql%
echo set blob on;>>%sql%
echo set width dts 12;>>%sql%
echo set width mon_user 20;>>%sql%
echo set width remote_process 30;>>%sql%
echo set width sql_txt 50;>>%sql%
echo set width remote_ip 15;>>%sql%
echo set width rn 3;>>%sql%
for /l %%x in (1, 1, %n%) do (
  echo set heading off;>>%sql%
  echo select substring(cast(current_timestamp as varchar(25^)^) from 12 for 12^) dts,'iter #'^|^|%%x msg from rdb$database;>>%sql%
  if .%%x.==.1. echo set heading on;>>%sql%
  echo commit;>>%sql%
  echo select>>%sql%
  echo      substring(cast(current_timestamp as varchar(25^)^) from 12 for 12^) dts>>%sql%
  echo      -- mon$attachments:>>%sql%
  echo      ,cast^(row_number^(^)over^(order by mon$attachment_id^) as char^(3^)^) rn>>%sql%
  echo      ,a.mon$remote_address remote_IP>>%sql%
  echo      ,a.mon$attachment_id attach_id>>%sql%
  echo      ,a.mon$user mon_user>>%sql%
  echo      ,a.mon$stat_id       stat_id>>%sql%
  echo      ,a.mon$server_pid    server_PID>>%sql%
  echo      ,a.mon$remote_pid    remote_PID>>%sql%
  echo      -- mon$memory_usage:>>%sql%
  echo      ,u.mon$memory_used used_memory>>%sql%
  echo      ,u.mon$memory_allocated alloc_by_OS>>%sql%
  echo      -- mon$io_stats:>>%sql%
  echo      ,i.mon$page_reads reads>>%sql%
  echo      ,i.mon$page_writes writes>>%sql%
  echo      ,i.mon$page_fetches fetches>>%sql%
  echo      ,i.mon$page_marks marks>>%sql%
  echo      -- mon$record_stats:>>%sql%
  echo      ,r.mon$record_seq_reads seq_reads>>%sql%
  echo      ,r.mon$record_idx_reads idx_reads>>%sql%
  echo      ,r.mon$record_inserts ins_cnt>>%sql%
  echo      ,r.mon$record_updates upd_cnt>>%sql%
  echo      ,r.mon$record_deletes del_cnt>>%sql%
  echo      ,r.mon$record_backouts bk_outs>>%sql%
  echo      ,r.mon$record_purges purges>>%sql%
  echo      ,r.mon$record_expunges expunges>>%sql%
  echo      -- aux info:>>%sql%
  echo      ,right(a.mon$remote_process,30^) remote_process>>%sql%
  echo      -- mon$statements:>>%sql%
  echo      --,left(cast(s.mon$sql_text as varchar(32760^)^),50^) sql_txt>>%sql%
  echo from mon$attachments a>>%sql%
  echo       left join mon$memory_usage u on a.mon$stat_id=u.mon$stat_id>>%sql%
  echo       left join mon$io_stats i on a.mon$stat_id=i.mon$stat_id>>%sql%
  echo       left join mon$record_stats r on a.mon$stat_id=r.mon$stat_id>>%sql%
  echo where>>%sql%
  echo       a.mon$attachment_id^<^>current_connection>>%sql%
  echo ;>>%sql%
  if .%%x.==.%n%. exit
  echo shell sleep %p%;>>%sql%
  echo.>>%sql%
  echo.>>%sql%
)
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530526
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидтам вопрос об интервале между запросами к монам - очень актуальный
при одном рабочем коннекте?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530529
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидтам вопрос об интервале между запросами к монам - очень актуальный
при одном рабочем коннекте?Про один коннект не могу пока сказать - проверить надо, какой там отклик будет при аналогичных вставках. А вот когда idx_under_load грузил, то там была видна сильная разница (в пользу SS).
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530647
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сгенерил скриптик на 7200 итераций, с паузой 0.5 сек между окончанием текущей и commit + select следующей.
Затем всё также вытряхнул в эксель, оставил там первые 7000 строк (иначе нельзя сюда приаттачить .rar). Далее провёл всё теже манипуляции со значениями в графе WRITES для CW.
Может, он и отдыхал в какие-то моменты по 1...10 мс, не знаю.
Но эксель показывает, что он всё время со следующим старанием РАБОТАЛ:
1) строк, в которых кол-во writes в диапазоне от 100 до 1000 - около 100;
2) от 1001 до 2000 - около 450;
3) от 2001 до 3000 - около 1000;
4) от 3001 до 3000 - около 1100;
. . .
5) свыше 10'000 - около 700 строк.

Значительная доля строк показывает, что CW передавал в кеш линуха от 6 до 9 тыс страниц каждые 500 мс. То есть, моменты отдыха этого потока если и были, то какие-то нечастые, ИМХО.

Но главный вопрос в следующем.

С базой работает только ОДИН аттач (в мониторинге - поток от sysdba).
Разность значений writes для него на момент начала и окончания теста = ~1.4 млн.
А разность значений writes для Cache Writer'a за эти же моменты времени составляет 40 млн.

Я не могу осилить причину этого дифферента %-/
В аттаче - эксель для CW. В следующем посте - для рабочего потока от SYSDBA.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530648
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
окончание предыдущего поста - см второй аттач, для рабочего потока от SYSDBA.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530706
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... а еще вопрос: если я начинаю вставку (скрипт см тут) в пустую базу небольшого числа строк (20'000 в tmain, 2'000'000 в tdetl) - то может ли поток CacheWriter'a иметь нулевое изменение статистики в mon$iostats.writes ? (см аттач)
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530709
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидскрипт см тутимелся в виду стартовый пост, вызов ХП с входным параметром = 20000.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530723
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отгадку можно найти в моих ответах выше. Пока рабочий поток не испачкает своими вставками 3/4 кеша, то кешрайтер не пошевелится писать что-либо на диск.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530763
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrотгадку можно найти в моих ответах выше. Пока рабочий поток не испачкает своими вставками 3/4 кеша, то кешрайтер не пошевелится писать что-либо на диск.Да, но когда скрипт заканчивает свою работу commit'ом, кто-то же должен записать страницы на диск ? В отчете на момент после окончания скрипта значения writes для CW так и остаются прежними. И "кто" тогда передаёт данные в файловый кеш операционки из страничного кеша ФБ ?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530789
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нескладуха какая-то со статистикой, КМК.
0) рестартовал ФБ, установил в database.conf на пустой базе нищенский кеш = 128 страниц;
1) запустил isql, выяснил ID его аттача; добавил в конфиг трейса фильтр на отлов событий только для этого attach_id;
2) запустил трейс;
3) запустил огромный скрипт, делающий без переконнектов снимки с мониторных таблиц и складывающий их в лог, с интервалом = 0.5 сек (пример его я приводил выше в этом топеге);
4) запустил на выполнение скрипт, добавляющий 20 тыс строк в tmain и 2 млн в tdetl:
Код: plaintext
1.
select * from sp_huge_ext(20000) for update;
commit;
5) дождался окончания работы ХП, после чего остановил также скрипт снимков мониторинга.

Далее смотрю статистику трейса:
99833 write(s)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
2014-01-19T01:26:06.1380 (19458:0x7f1cd9294d08) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/askmon_n.fdb (ATT_84, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30/bin/isql:23275
                (TRA_2028, CONCURRENCY | WAIT | READ_WRITE)

Statement 172:
-------------------------------------------------------------------------------
select * from sp_huge_ext(20000) for update
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (SP_HUGE_EXT NATURAL)
200 records fetched
 422175 ms, 7850564 read(s), 99833 write(s), 58629037 fetch(es), 12358863 mark(s)

Table                             Natural     Index    Update    Insert    Delete
unge
*********************************************************************************
****
RDB$PAGES                                                            20          

RDB$INDICES                                       9                              

RDB$RELATION_CONSTRAINTS                          2                              

TDETL                                                           2000000          

TMAIN                                                             20000          

TLOG                                                                200          


Вытряхнул лог мониторинга в эскель (см аттач), причесал его там.
В итоге вижу в экселе, что дельта в графе writes между последними и первыми значениями:
1) для рабочего потока от SYSDBA: 99'907 - 5 = 99'902 - вполне объяснимое значение, близкое к данным трейса;
2) для Cache Writer'a: 4'124'841 - 0 = 4'124'841 страниц. Разница в 41 раз. Опять соотношение в 3..4 десятка раз.

Чего он (CW) делал в 40 раз больше, чем поток-молотилка ?!
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530790
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

тот, кто делает коммит, есс-но.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530792
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты с SC\CS сравнил те же действия ?
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530795
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladтот, кто делает коммит, есс-но.Это делает коннект-молотилка. "Кому" он передаёт грязные страницы - непосредственно файловому кешу, получается ? (раз CW сидит без дела)
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530796
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladТы с SC\CS сравнил те же действия ?Нет пока... всё еще с SS "борьба" идёт. Завтра, надеюсь, смогу и к Вильяму нашему Шекспиру SC подступиться.
...
Рейтинг: 0 / 0
Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
    #38530800
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид"Кому" он передаёт грязные страницы - непосредственно файловому кешу, получается ?Нет, он на деревню деду письма пишет.
У тебя какие-то совершенно дикие представления о том, как всё устроено... где ты их только берёшь ?
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вставка в индексир.таблицы: cache writer в 1 ед времени пишет в 20 раз > раб. потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]