powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Lock Escalations & Lock Timeouts
14 сообщений из 14, страница 1 из 1
Lock Escalations & Lock Timeouts
    #35839684
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!
DB2 8.1.14

Есть web-приложение под WAS, которое работает с базой DB2. В основном идет работа по поиску (имеется в наличии фильтр), добавлению и редактированию записей. Структура базы не сложная. 3 таблицы, связанных между собой - TAB1 ->> TAB2 ->> TAB3.

Пользователи иногда замечают сбои в работе программы. При изменении записи редко возникают ошибки. Лог ВебСферы systemout.log говорит об исключении
Код: plaintext
com.ibm.db2.jcc.c.SqlException: The current transaction has been rolled back because of a deadlock or timeout.  Reason code "68".

db2diag.log в эти моменты говорит:

Код: plaintext
1.
2.
3.
4.
5.
6.
2009-02-26-14.40.41.587690+180 E379085597G465     LEVEL: Warning
PID     : 16677                TID  : 3086862016  PROC : db2agent (PENSTRAN)
INSTANCE: db2inst              NODE : 000         DB   : PENSTRAN
APPHDL  : 0-630                APPID: GA0700FC.KB82.090225062943
FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:3
MESSAGE : ADM5502W  The escalation of "15874" locks on table
          "PENSTRAN.TRANSITS" to lock intent "S" was successful.

Программка сбора статистики показывает, что с момента активации базы набралось 45 Lock Escalations и 10 Lock Timeouts. Ещё программка статистики говорит, что очень много переполнений по сортировкам (Sort Overflows). Web-приложение и скрипты, которые импользуются, не совершенны. Много используется конструкций ORDER BY и условий where по полям таблиц, индексы на которые не созданы.

Что можно подкрутить в базе, чтобы избежать блокировок или уменьшить? SortHeap, MaxLocks, LockTimeout? Или может еще чего? Размер буферпула увеличить? Может пойти на создание индексов по используемым полям?

P.S. Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20.

С уважением, Семен Попов
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35840535
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov
Что можно подкрутить в базе, чтобы избежать блокировок или уменьшить? SortHeap, MaxLocks, LockTimeout? Или может еще чего? Размер буферпула увеличить? Может пойти на создание индексов по используемым полям?



Блокировки и сортировки прямо не связаны между собой. Из всего перечисленного только индексы могут реально помочь. Надо изучать планы выполнения запросов и создавать индексы.

Против sort overflows - те же индексы и, возможно, sortheap, но могут быть побочные явления (например, оптимизатор будет предпочитать table scan с последующей сортировкой доступу по индексу).
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35841400
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Будем работать. Данных не много, и структура базы сравнительно не сложная. Поэтому, думаю, индексы нужно создать и использовать.
А вот чтобы уменьшить количество расширений блокирововк, думаю, увеличить параметр процент списков блокировки на программу (MAXLOCKS). Сейчас ситуация такая:

Код: plaintext
1.
2.
LOCKLIST=1000
MAXLOCKS=60
LOCKTIMEOUT=30

Появление ожиданий блокировки (Lock Timeouts) говорит о том, что часто возникают расширения блокировок. Если увеличить процент списка блокировки (MAXLOCKS), то раширений блокировок будет меньше, а там и ожидания реже пойдут. Так?
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35842657
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov

Появление ожиданий блокировки (Lock Timeouts) говорит о том, что часто возникают расширения блокировок. Если увеличить процент списка блокировки (MAXLOCKS), то раширений блокировок будет меньше, а там и ожидания реже пойдут. Так?

Не обязательно. Вам, я думаю, стоит посмотреть на lock snapshot, чтобы узнать правду. В любом случае этим стоит заняться после создания подходящих индексов, поскольку они могут разрешить проблему.
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35845386
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Понял. Сейчас посмотрел планы часто выполняющихся запросов (даже опреация select), и там, действительно, на некоторых шагах выполнения запроса встречается "INTENT SHARE table lock". Например один из шагов выполнения запроса выглядит так

Код: plaintext
1.
2.
3.
Row Identifier (RID) Scan 
(826 rows sorted, CURSOR STABILITY, FORWARD, INTENT SHARE table lock, NEXT KEY SHARE row lock, JN INPUT, 
Prefetched: SEQUENTIAL, 826 rows sorted, CURSOR STABILITY, FORWARD, INTENT SHARE table lock, NEXT KEY SHARE row lock, JN INPUT, Prefetched: SEQUENTIAL),
PENSTRAN.TRANSITS,Table,57.28, 1.31

Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы.

Вопрос по индексам. Хочу создать новые индексы в отдельном табличном пространстве. Какие рекомендации (по настройке пространства, размещению или еще чего-нибудь) можете дать?
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35846035
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovСейчас посмотрел планы часто выполняющихся запросов (даже опреация select), и там, действительно, на некоторых шагах выполнения запроса встречается "INTENT SHARE table lock". Например один из шагов выполнения запроса выглядит так

Код: plaintext
1.
2.
3.
Row Identifier (RID) Scan 
(826 rows sorted, CURSOR STABILITY, FORWARD, INTENT SHARE table lock, NEXT KEY SHARE row lock, JN INPUT, 
Prefetched: SEQUENTIAL, 826 rows sorted, CURSOR STABILITY, FORWARD, INTENT SHARE table lock, NEXT KEY SHARE row lock, JN INPUT, Prefetched: SEQUENTIAL),
PENSTRAN.TRANSITS,Table,57.28, 1.31

Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы.Перед накладыванием S строчной блокировки всегда накладывается IS табличная блокировка (на соотв. таблицу, если ещё её не было), и это не эскалация блокировок .
Она несовместима с X и Z табличными блокировками, и это - её единственный side effect, так сказать...
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35846478
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen Popov

Получается, что из-за неоптимальности запроса при выполнении раширяются блокировки на уровень таблицы, а отсюда и все проблемы.


Вам надо бояться сканирования таблиц (relation scan) и полного чтения индексов, потому что именно они вызывают эскалацию и таймауты.

Semen Popov Хочу создать новые индексы в отдельном табличном пространстве.

Думаю, что в вашей ситуации ("Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20") тратить на это время и силы не стоит. Если на сервере достаточно памяти, индексы прекрасно уживутся в одном пространстве с данными.
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35846655
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinПеред накладыванием S строчной блокировки всегда накладывается IS табличная блокировка (на соотв. таблицу, если ещё её не было), и это не эскалация блокировок.
Она несовместима с X и Z табличными блокировками, и это - её единственный side effect, так сказать...Спасибо. Но тем не менее эскалации возникают. И связаны с процентом блокировок. Возможно, не с S строчными блокировками.

mustaccioДумаю, что в вашей ситуации ("Записей не много - до 50 тыс. в каждой из таблиц. Нагрузка на базу не большая. Добавляется или изменяется около 50-100 записей в день. Пользователей - 20") тратить на это время и силы не стоит. Если на сервере достаточно памяти, индексы прекрасно уживутся в одном пространстве с данными.Спасибо. Последуем Вашему совету.

mustaccioВам надо бояться сканирования таблиц (relation scan) и полного чтения индексов, потому что именно они вызывают эскалацию и таймауты.
Вот это, думаю, уже ближе к моей ситуации. Запустил мониторинг базы со всеми ключами(switches) и сбросил все его счетчики. Через полчаса сделал snapshot и нашел в нем следующее:

Код: 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.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
            Application Snapshot

Application handle                         = 242
Application status                         = UOW Waiting
Status change time                         = 02.03.2009 14:36:58.865976
Application code page                      = 1208
Application country/region code            = 0
DUOW correlation token                     = GA0700FC.J784.090302062404
Application name                           = db2jcc_application
Application ID                             = GA0700FC.J784.090302062404
Sequence number                            = 3236
TP Monitor client user ID                  = guest
TP Monitor client workstation name         = l0070003.007.pfr.ru
TP Monitor client application name         =
TP Monitor client accounting string        =

Connection request start timestamp         = 02.03.2009 09:24:04.045132
Connect request completion timestamp       = 02.03.2009 09:24:04.045489
Application idle time                      = 7 seconds
CONNECT Authorization ID                   = GUEST
Client login ID                            = GUEST
Configuration NNAME of client              = l0070003.007.pfr.r
Client database manager product ID         = JCC02100
Process ID of client application           = 0
Platform of client application             = Unknown via DRDA
Communication protocol of client           = TCP/IP

Inbound communication address              = 10.7.0.252 14212

Database name                              = PENSTRAN
Database path                              = /home/db2inst/penstran/db/db2inst/NODE0000/SQL00001/
Client database alias                      = PENSTRAN
Input database alias                       = PENSTRAN
Last reset timestamp                       = 02.03.2009 13:23:49.684004
Snapshot timestamp                         = 02.03.2009 14:37:05.638098
The highest authority level granted        =
        Direct CONNECT authority
        Indirect CREATETAB authority
        Indirect BINDADD authority
        Indirect CONNECT authority
        Indirect IMPLICIT_SCHEMA authority
Coordinating database partition number     = 0
Current database partition number          = 0
Coordinator agent process or thread ID     = 16677
Agents stolen                              = 0
Agents waiting on locks                    = 0
Maximum associated agents                  = 1
Priority at which application agents work  = 0
Priority type                              = Dynamic

Lock timeout (seconds)                     = 30
 Locks held by application                 = 24999 
Lock waits since connect                   = 0
Time application waited on locks (ms)      = 0
Deadlocks detected                         = 0
 Lock escalations                           = 1 
Exclusive lock escalations                 = 0
Number of Lock Timeouts since connected    = 0
Total time UOW waited on locks (ms)        = 0

Total sorts                                = 4
Total sort time (ms)                       = 39
 Total sort overflows                       = 1 

Data pages copied to extended storage      = 0
Index pages copied to extended storage     = 0
Data pages copied from extended storage    = 0
Index pages copied from extended storage   = 0
Buffer pool data logical reads             = 199113
Buffer pool data physical reads            = 0
Buffer pool temporary data logical reads   = 199
Buffer pool temporary data physical reads  = 0
Buffer pool data writes                    = 0
Buffer pool index logical reads            = 172
Buffer pool index physical reads           = 1
Buffer pool temporary index logical reads  = 0
Buffer pool temporary index physical reads = 0
Buffer pool index writes                   = 0
Total buffer pool read time (milliseconds) = 20
Total buffer pool write time (milliseconds)= 0
Time waited for prefetch (ms)              = 0
Unread prefetch pages                      = 0
Direct reads                               = 14
Direct writes                              = 0
Direct read requests                       = 7
Direct write requests                      = 0
Direct reads elapsed time (ms)             = 85
Direct write elapsed time (ms)             = 0

Number of SQL requests since last commit   = 2
Commit statements                          = 221
Rollback statements                        = 0
Dynamic SQL statements attempted           = 241
Static SQL statements attempted            = 221
Failed statement operations                = 0
Select SQL statements executed             = 223
Update/Insert/Delete statements executed   = 4
DDL statements executed                    = 0
Inactive stmt history memory usage (bytes) = 0
Internal automatic rebinds                 = 0
Internal rows deleted                      = 0
Internal rows inserted                     = 0
Internal rows updated                      = 0
Internal commits                           = 0
Internal rollbacks                         = 0
Internal rollbacks due to deadlock         = 0
Binds/precompiles attempted                = 0
Rows deleted                               = 0
Rows inserted                              = 3
Rows updated                               = 1
Rows selected                              = 324
Rows read                                  = 3324284
 Rows written                               = 24625 

Мне интересны результаты в строках Locks held by application , Lock escalations , Rows written . Последний вообще удивляет. Так должно быть?
И еще. В скриптах приложения часто используются конструкции select count(*) ... . Слышал, что такие скрипты всегда сканируют таблицу. Может они создают эскалацию?
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35847057
mustaccio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, вам надо определить запросы, вызывающие эскалацию блокировок, и посмотреть на их планы. Например, следующим образом:

1. Сообщения об эскалации блокировок пишутся в db2diag.log. Выполните "db2diag -gi message:=escalation", и вы увидите таблицы, на которых это происходит.

2. Найдите в снапшоте динамических запросов те, в которых участвуют таблицы из пункта 1.

3. Постройте планы запросов из пункта 2 и найдите те, где могут возникать эскалации (присутствует relation scan или полное сканирование индекса). Если таких нет, придется запустить каждый запрос вручную и определить, какой из них вызывает проблему.

После этого можно попытаться найти индекс, который бы уменьшал размер выборки. Не всегда это удастся, впрочем.
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35847587
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovМне интересны результаты в строках Locks held by application , Lock escalations , Rows written . Последний вообще удивляет. Так должно быть?
И еще. В скриптах приложения часто используются конструкции select count(*) ... . Слышал, что такие скрипты всегда сканируют таблицу. Может они создают эскалацию?
rows_written включает операции с temporary table тоже.
Самое ужасное в этом снэпшоте, это соотношение:
Код: plaintext
1.
Rows selected                              = 324
Rows read                                  = 3324284
Если вы позиционируете своё приложение как OLTP, то соотношение не должно быть больше, чем 1 к 10-20, но никак не 1 к 10000.

Большое число в Locks held by application при:
Код: plaintext
1.
2.
3.
Application status                         = UOW Waiting
Application idle time                      = 7 seconds
...
Number of SQL requests since last commit   = 2
может говорить о том, что приложение наложило из-за табличного сканирования много блокировок, не выполнило commit или rollback и ничего не делает.
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35848443
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mustaccio, Mark Barinstein, спасибо. Получил от вас много полезной информации. Буду копать.
Еще нарыл по этой теме некоторые полезные статьи в инете
Выявление и разрешение проблем блокировки в DB2 для Linux, UNIX и Windows
Анализ ситуаций ожидания блокировок в DB2 для Linux, UNIX и Windows
Может кому-нибудь будет тоже интересно.

Вот что еще мне показал Dynamic SQL Snapshot. Это мне показалось странным.

Код: 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.
Dynamic SQL Snapshot Result

Number of executions               = 628
Number of compilations             = 1
Worst preparation time (ms)        = 2
Best preparation time (ms)         = 2
Internal rows deleted              = 0
Internal rows inserted             = 0
Rows read                          = 2260147
Internal rows updated              = 0
Rows written                       = 0
Statement sorts                    = 0
Statement sort overflows           = 0
Total sort time                    = 0
Buffer pool data logical reads     = 106760
Buffer pool data physical reads    = 0
Buffer pool temporary data logical reads   = 0
Buffer pool temporary data physical reads  = 0
Buffer pool index logical reads    = 0
Buffer pool index physical reads   = 0
Buffer pool temporary index logical reads  = 0
Buffer pool temporary index physical reads = 0
Total execution time (sec.ms)      = 3.710524
Total user cpu time (sec.ms)       = 3.430000
Total system cpu time (sec.ms)     = 0.020000
Statement text                     = select * from PENSTRAN.TAB4 where PNRID=?

Таблицы TAB1(primary key (PNRID)) и TAB4(foreign key (PNRID)) связаны. Из снапшута видно, что скрипт выполнялся 628 раз и при этом суммарно считывал строки 2260147. Делю и получаю, что за один раз считывал 3600 записей. А это и есть общее количество записей TAB4. Вытащил план запроса. В нем действительно TBSCAN - индекс не используется.
Вопрос: Почему не используется foreign key? Может ли оптимизатор в каких нибудь случаях не видеть foreign key? Может как-то подтолкнуть оптимизатор?
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35848696
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen Popov
Код: plaintext
1.
Dynamic SQL Snapshot Result
Statement text                     = select * from PENSTRAN.TAB4 where PNRID=?

Таблицы TAB1(primary key (PNRID)) и TAB4(foreign key (PNRID)) связаны. Из снапшута видно, что скрипт выполнялся 628 раз и при этом суммарно считывал строки 2260147. Делю и получаю, что за один раз считывал 3600 записей. А это и есть общее количество записей TAB4. Вытащил план запроса. В нем действительно TBSCAN - индекс не используется.
Вопрос: Почему не используется foreign key? Может ли оптимизатор в каких нибудь случаях не видеть foreign key? Может как-то подтолкнуть оптимизатор?Не используется foreign key?
Когда вы создаёте foreign key, индекс не создаеётся автоматически по этим полям.
Если вам нужен индекс по этому полю, то вы создаёте его сами и собираете статистику на саму таблицу и этот индекс.
Даже при наличии индекса оптимизатор может выбрать табличное сканирование.
Например, когда достаточно большой процент записей таблицы будет отбираться этим запросом (такое предположение может браться оптимизатором из собранной статистики).
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35848797
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinНе используется foreign key?
Когда вы создаёте foreign key, индекс не создаеётся автоматически по этим полям.
Опа! Век живи - век учись. Не знал. А для primary key и unique key индексы создаются автоматически? По крайней мере я их не создавал, а они видны в базе. А foreign-индекс не проверял и попался. Сейчас убедился, что foreign-индексов нет. Просто я пришел в DB2 из другой СУБД, а там связь между таблицами невозможна без индекса связи. Да и понятия "индекс" и "ключ" сопоставимы. Спасибо.
...
Рейтинг: 0 / 0
Lock Escalations & Lock Timeouts
    #35848867
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovА для primary key и unique key индексы создаются автоматически?Да.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Lock Escalations & Lock Timeouts
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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