powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
15 сообщений из 15, страница 1 из 1
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38712616
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Грустная сага с дикими показателями в трейсе при не очень большой нагрузке ФБ - увы, продолжается.

Итак. Жила-была база, тестовая. И накинулось на неё 50 молотилок, имитирующих OLTP (а дело происходило в FB 2.5.3 SC).
И полезло в трейсе всякое неприятное:
Код: 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.
2014-08-04T22:57:04.6770 (10706:0x7f982e5edf70) EXECUTE_STATEMENT_FINISH
        oltp25 (ATT_1429, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:1852
                (TRA_44628, CONCURRENCY | NOWAIT | READ_WRITE)

Statement 123256:
-------------------------------------------------------------------------------
select count(*) from sp_add_invoice_to_stock
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (FN_DOC_FIX_STATE NATURAL)(FN_DOC_OPEN_STATE NATURAL)(FN_DOC_CLOS_STATE NATURAL)(FN_OPER_INVOICE_GET NATURAL)(FN_OPER_INVOICE_ADD NATURAL)(FN_REMOTE_PROCESS NATURAL)(FN_GET_RANDOM_ID NATURAL)(SP_GET_DEPENDEND_DOCS NATURAL)(H INDEX (PK_DOC_LIST))(V A INDEX (PK_AGENTS))(FN_IS_LOCK_TROUBLE NATURAL)(SP_GET_CLO_FOR_INVOICE NATURAL)(FN_HALT_SIGN NATURAL)
1 records fetched
   99448 ms, 5567 read(s), 167 write(s), 44814 fetch(es), 1669 mark(s) 

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$INDICES                                       2
RDB$RELATION_CONSTRAINTS                          1
TMP$DEP_DOCS                                     29                  30                   1
OPTYPES                                           2
DOC_LIST                                         32         1
DOC_DATA                                         36        18
MONEY_TURNOVER_LOG                                                    1
Z_USED_VIEWS                                      1
QDISTR                                          361       123                                                12
PDISTR                                          398       149        11        29
PSTORNED                                                             20
AGENTS                                           29
INVNT_TURNOVER_LOG                                                   18
PERF_LOG                                                             23
TMP$PERF_LOG                                     69        23        23        23
И был сделан снимок лок-таблицы (в какой-то наугад взятый момент времени рядом с вышеприведенным):

Код: plaintext
$ /opt/fb25sc/bin/fb_lock_print -c -a -d /var/db/fb25/oltp25.fdb >/var/db/fb25/fblp_a.txt

А затем из него вытащены все строки с ненулевыми "pending request count"

Код: plaintext
$ grep -n -i "pending request count:" fblp_a.txt | grep -v "count:      0"

Результат:

Код: plaintext
1.
2.
3.
4.
5.
224578: Key: 0001:000253, Flags: 0x00, Pending request count:      4
243274: Key: 0001:068344, Flags: 0x00, Pending request count:     33
282061: Key: 0001:011064, Flags: 0x00, Pending request count:      1
284313: Key: 0001:077886, Flags: 0x00, Pending request count:      2
284393: Key: 0001:077893, Flags: 0x00, Pending request count:      6

Строкам лога, которые выведены в первом столбе, соотв-вуют вот эти вещи:
Код: 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.
LOCK BLOCK 626696
        Series: 3, Parent: 189968, State: 6, size: 8 length: 8 data: 0
        Key: 0001:000253, Flags: 0x00, Pending request count:      4
        Hash que (2):   forward: 1363968, backward:   2404
        Requests (5):   forward: 2009856, backward: 770024
                Request 2009856, Owner: 1588408, State: 6 (6), Flags: 0x100
                Request 1586424, Owner: 1166904, State: 0 (6), Flags: 0x02
                Request 1659280, Owner: 807384, State: 0 (3), Flags: 0x02
                Request 1197936, Owner: 1166272, State: 0 (3), Flags: 0x02
                Request 770024, Owner: 1771432, State: 0 (3), Flags: 0x02
. . .
LOCK BLOCK 3023944
        Series: 3, Parent: 189968, State: 3, size: 8 length: 8 data: 0
        Key: 0001:068344, Flags: 0x00, Pending request count:     33
        Hash que (2):   forward: 1315008, backward:  16468
        Requests (34):  forward: 1624288, backward: 1572600
                Request 1624288, Owner: 1563016, State: 3 (3), Flags: 0x100
                Request 906184, Owner: 1253216, State: 0 (6), Flags: 0x02
                Request 441736, Owner: 1223152, State: 0 (3), Flags: 0x02
                Request 1045424, Owner: 1272600, State: 0 (6), Flags: 0x02
                Request 1332672, Owner: 189720, State: 0 (3), Flags: 0x02
                Request 2295952, Owner: 1572096, State: 0 (3), Flags: 0x02
                Request 3071368, Owner: 1675608, State: 0 (6), Flags: 0x02
                Request 611152, Owner: 1153864, State: 0 (3), Flags: 0x02
                Request 3462856, Owner: 1400256, State: 0 (3), Flags: 0x02
                Request 1977256, Owner: 947656, State: 0 (3), Flags: 0x02
                Request 2875912, Owner: 1620776, State: 0 (3), Flags: 0x02
                Request 3184008, Owner: 1498272, State: 0 (3), Flags: 0x02
                Request 2852232, Owner: 269088, State: 0 (3), Flags: 0x02
                Request 2283536, Owner: 1689552, State: 0 (6), Flags: 0x02
                Request 1729592, Owner: 750008, State: 0 (6), Flags: 0x02
                Request 1113904, Owner: 281688, State: 0 (6), Flags: 0x02
                Request 1403128, Owner: 1800416, State: 0 (3), Flags: 0x02
                Request 765416, Owner: 1435640, State: 0 (6), Flags: 0x02
                Request 891208, Owner: 1756144, State: 0 (3), Flags: 0x02
                Request 3493128, Owner: 1559056, State: 0 (3), Flags: 0x02
                Request 3098760, Owner: 783200, State: 0 (3), Flags: 0x02
                Request 2112272, Owner: 761072, State: 0 (3), Flags: 0x02
                Request 1333056, Owner: 200872, State: 0 (3), Flags: 0x02
                Request 1177648, Owner: 1607536, State: 0 (6), Flags: 0x02
                Request 1985920, Owner: 1707848, State: 0 (6), Flags: 0x02
                Request 1892184, Owner: 1489832, State: 0 (6), Flags: 0x02
                Request 3082952, Owner: 830416, State: 0 (3), Flags: 0x02
                Request 2889032, Owner: 782760, State: 0 (3), Flags: 0x02
                Request 3302024, Owner: 1721152, State: 0 (3), Flags: 0x02
                Request 1079600, Owner: 635416, State: 0 (3), Flags: 0x02
                Request 2709256, Owner: 1294408, State: 0 (3), Flags: 0x02
                Request 1643352, Owner: 1466352, State: 0 (3), Flags: 0x02
                Request 3455688, Owner: 1283088, State: 0 (3), Flags: 0x02
                Request 1572600, Owner: 429776, State: 0 (3), Flags: 0x02
. . .
LOCK BLOCK 3254024
        Series: 3, Parent: 189968, State: 3, size: 8 length: 8 data: 0
        Key: 0001:011064, Flags: 0x00, Pending request count:      1
        Hash que (4):   forward:  88892, backward: 2446416
        Requests (2):   forward: 751984, backward: 2520272
                Request 751984, Owner: 618192, State: 3 (3), Flags: 0x01
                Request 2520272, Owner: 1588408, State: 0 (6), Flags: 0x02
. . .
LOCK BLOCK 1277136
        Series: 3, Parent: 189968, State: 6, size: 8 length: 8 data: 0
        Key: 0001:077886, Flags: 0x00, Pending request count:      2
        Hash que (2):   forward:  92804, backward: 3027976
        Requests (3):   forward: 3381256, backward: 3382856
                Request 3381256, Owner: 1544344, State: 6 (6), Flags: 0x100
                Request 1308352, Owner: 1231912, State: 0 (6), Flags: 0x02
                Request 3382856, Owner: 1733688, State: 0 (6), Flags: 0x02
. . .
LOCK BLOCK 728296
        Series: 3, Parent: 189968, State: 6, size: 8 length: 8 data: 0
        Key: 0001:077893, Flags: 0x00, Pending request count:      6
        Hash que (2):   forward:  92860, backward: 2152784
        Requests (7):   forward: 2682056, backward: 622792
                Request 2682056, Owner: 618192, State: 6 (6), Flags: 0x100
                Request 2267856, Owner: 965240, State: 0 (6), Flags: 0x02
                Request 1048048, Owner: 964800, State: 0 (6), Flags: 0x02
                Request 1191920, Owner: 450224, State: 0 (3), Flags: 0x02
                Request 1565248, Owner: 1141392, State: 0 (3), Flags: 0x02
                Request 886728, Owner: 1638880, State: 0 (6), Flags: 0x02
                Request 622792, Owner: 1649368, State: 0 (6), Flags: 0x02
Что вообще можно понять из того, что под спойлером ? "Обо что" там всё спотыкается ?

ЗЫ.
Код: plaintext
1.
2.
3.
4.
DefaultDbCachePages = 512
FileSystemCacheThreshold = 1000000
TempCacheLimit = 2147483647
LockHashSlots = 22111
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38712623
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, чуть не забыл :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LOCK_HEADER BLOCK
        Version: 145, Active owner:      0, Length: 4194304, Used: 3527560
        Flags: 0x0001
        Enqs: 73026368, Converts: 2690979, Rejects: 3474850, Blocks: 21303622
        Deadlock scans:      0, Deadlocks:      0, Scan interval:  10
        Acquires: 155709352, Acquire blocks: 53810837, Spin count:   0
         Mutex wait: 34.6% 
        Hash slots: 22111, Hash lengths (min/avg/max):    0/   0/   5
        Remove node:      0, Insert queue:      0, Insert prior:      0
        Owners (50):    forward: 189720, backward: 1800416
        Free owners (1):        forward: 2609552, backward: 2609552
        Free locks (2573):      forward: 190992, backward: 2499216
        Free requests (8234):   forward: 2841672, backward: 1024176
        Lock Ordering: Enabled
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38712637
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЧто вообще можно понять из того, что под спойлером ? "Обо что" там всё спотыкается ?
ожидания на страничных блокировках
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38712689
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrожидания на страничных блокировкахИз "Большой Книги" (глава 40) следует, что вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
LOCK BLOCK 3023944
         Series: 3 , Parent: 189968, State: 3, size: 8 length: 8 data: 0
         Key: 0001:068344 , Flags: 0x00, Pending request count:      33 
        Hash que (2):   forward: 1315008, backward:  16468
        Requests (34):  forward: 1624288, backward: 1572600
                Request 1624288, Owner: 1563016, State: 3 (3), Flags: 0x100
                Request 906184, Owner: 1253216, State: 0 (6), Flags: 0x02
                Request 441736, Owner: 1223152, State: 0 (3), Flags: 0x02
                Request 1045424, Owner: 1272600, State: 0 (6), Flags: 0x02
- означает, что 33 транзакции ждали доступа к странице базы данных (series: 3) с номером 0001:068344.
Как понять, что это за ресурс такой: это была страница с данными таблицы или индексов ? или генераторов ?

У мну есть только три идейки на тему уменьшения числа этих конфликтов:
1) если драки за страницы с данными таблиц, то уменьшить размер страницы до 4К;
2) если драки из-за массового добавления возрастающих ID'шников в индекс, то делать вместо вызовов gen_id(g, 1) что-то другое (менять местами байты, как это сделано в орацле для reverse index'ов);
4) если драки из-за генераторов, то поменять алгоритмы и хапать пачки ID'шников вместо gen_id(g, 1).
Есть ли еще методы ?
зы. интим переписывание теста "с нуля" не предлагать! :)
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38712758
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидКак понять, что это за ресурс такой: это была страница с данными таблицы или индексов ? или генераторов ?
IBSurgeonViewer

и это не страницы генераторов, за исключением (возможно) страницы 77886.
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38720646
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrи это не страницы генераторов, за исключением (возможно) страницы 77886.А правильно ли я понимать, что вот в этих строках:
Код: plaintext
1.
2.
3.
4.
224578: Key: 0001: 000253 , Flags: 0x00, Pending request count:      4
243274: Key: 0001: 068344 , Flags: 0x00, Pending request count:     33
282061: Key: 0001: 011064 , Flags: 0x00, Pending request count:      1
284313: Key: 0001: 077886 , Flags: 0x00, Pending request count:      2
284393: Key: 0001: 077893 , Flags: 0x00, Pending request count:      6
- выделенные цифирки - это и есть физ. номера страниц (то есть, именно их надо вводить в IB Surgeon по Ctrl-G, дабы получить сведения о том, что же это за страница такая) - ?
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38720686
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильно
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38720706
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrправильнотогда я в культурологическом кризисе...
1) сделал примерно 20 снимков ЛТ, с интервалом 5 сек.
2) выполнил временный лок базы для её копирования:
nbackup -L
cp oltp25.fdb oltp25.copy.fdb
nbackup -N
nbackup -F oltp25.copy.fdb
3) отпарсил логи ЛТ, выдрав из них только сведения о наличии ненулевых page request count'ов, и упорядочил новые данные по убыванию этих count'ов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
fb_home=/opt/fb25sc
lp_list=./tmp_lp_list.tmp
ls -1 ./logs/lp25sc_*.log>$lp_list
while read txt
do
  echo $txt. . .
  grep -n -i "pending request count:" $txt | grep -v "count:      0"| sort -rnk9 >$txt.prc
done<$lp_list
rm -f $lp_list
4) открыл логи, открыл базу oltp25.copy.fdb в IBSurgeon.

И вижу, что основная часть траблов относится к DP-страницам одной и той же таблицы (doc_data), с которой как раз не очень много возни. Также есть траблы с PP этой же таблицы. Но вот по индексным страницам проблем оказалось немного, 1 или 2.

Что получается, есть смысл уменьшить страницу базы с 8 до 4К?
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721253
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЧто получается, есть смысл уменьшить страницу базы с 8 до 4К?
Есть смысл не жать разблокировки страницы в которую уже кто-то пишет. Попробовать писать в незаблокированную. Или нужно обязательно в эту? :)
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721256
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТаблоидЧто получается, есть смысл уменьшить страницу базы с 8 до 4К?
Есть смысл не жать разблокировки страницы в которую уже кто-то пишет. Попробовать писать в незаблокированную. Или нужно обязательно в эту? :)
не жать не ждать :)
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721271
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЕсть смысл не жать разблокировки страницы в которую уже кто-то пишет.

Для update/delete/select это невозможно. Для insert проверяли, результаты спорные: у меня
до 30% ускорения, у Влада - 0. Патч в дерево не пошёл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721305
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТаблоидЧто получается, есть смысл уменьшить страницу базы с 8 до 4К?Есть смысл не жать разблокировки страницы в которую уже кто-то пишет. Попробовать писать в незаблокированную. Или нужно обязательно в эту? :)Речь идёт о физических страницах базы и низкоуровневых блокировках. Даже если бы все update & delete поменять на insert'ы, то последние всё равно будут стремиться влезть на первую незанятую страницу. Драки будут и за DP, и за PP.

На странице размером 8192 байта может размещаться сотня записей этой таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DOC_DATA (147)
    Primary pointer page: 251, Index root page: 252
    Total formats: 1, used formats: 1
    Average record length: 47.62, total records: 610139
    Average version length: 41.26, total versions: 1702, max versions: 4
    Average fragment length: 0.00, total fragments: 0, max fragments: 0
    Average unpacked length: 72.00, compression ratio: 1.51
    Pointer pages: 4, data page slots: 6704
    Data pages: 6704, average fill: 72%

Вроде бы не очень много, но выжимка номеров страниц с page_request_count > 5 (из лога fb_lock_print) + запрос по ним к IBSurgeon'у всё время говорят: проблема именно в этой таблице, и чаще упоминаются её data pages, а не PP.
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721540
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.firebirdsql.org/manual/fbint-page-5.html
data page:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct data_page
{
    pag dpg_header;
    SLONG dpg_sequence;
    USHORT dpg_relation;
    USHORT dpg_count;
    struct dpg_repeat {
        USHORT dpg_offset;
        USHORT dpg_length;
    } dpg_rpt[1];
};



При insert:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    USHORT count;
    // 1*
    count = dp.dpg_count;
    if хватает_места_для_вставки {
        dpg_repeat rpt; 
        rpt.dpg_offset = нужное_смещение;
        rpt.dpg_length = data_length;
        if (_InterlockedCompareExchange(&dpg_repeat[count], long(*rpt), 0) = 0) {
            пишем данные;
            dp.dpg_count++;
        } else {
            // кто-то уже пишет данные, так что ждём увеличения dp.dpg_count и делаем повтор c 1*
        }
    }



При update: создаём новую версию для записи, спинлочим запись, пишем номер текущей транзакции, пишем ссылку на новую версию, отпускаем лок.

При delete: по типу update.

При select: читаем только записи до dp.dpg_count, т.к. другие нам пригодиться при фетче не могут, т.к. явно были созданы позже и не подлежат считыванию (это если у нас курсор видит состояние базы на момент старта стэйтмента, а у нас оно вроде именно так). Т.е. лока вообще нет.

Итого, лочить всю страницу при insert, update, delete и select не нужно.
Но у нас есть сборщик мусора и всякие тулзы, и ради них лок придётся делать, многочитательский-однописательский. Тем самым операции с данными мешать друг-другу не будут.

В целом как-то так :)
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721544
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

а теперь прикрути это к классику :-)
...
Рейтинг: 0 / 0
fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
    #38721558
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у мну вообще тут д э бильная мыслишка родилась: создать вместо таблицы doc_data вьюху с тем же именем (дабы не перелопачивать весь код), и вьюха эта должна быть такой:
Код: sql
1.
2.
3.
4.
5.
select * from real_table_doc_data_01
union all
select * from real_table_doc_data_02
union all
select * from real_table_doc_data_03

А в триггере на insert для этой вьюхи делать вставку в ту real_table_doc_data_NN, куда фишка ляжет укажет 1 + mod(gen_id(. . .,1), 2) . И тем самым, модификации над одной и той же real_таблицей будут в три раза реже, чем сейчас. Такой вот типа "кластер" :-)
Тока с запросами к этой вьюхе, чую, беда будет полная.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / fb_lock_print -a: что там означают 'pending request count: N', когда N>0 ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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