|
|
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Всем привет PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit pgq 3.1.0.0 Есть функции, время выполнения которых десятки минут. Источником данных для функции являются pgq очереди. Сегодня произошел deadlock при работе с pgq. Вроде как pgq.finish_batch и pgq.ticker() законфликтовали ниже лог: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:39 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, offtop Код: sql 1. -- вы перекрыли системный "=" для int/bigint-а ? а назачем ? я как -то накатил intarray -- и то плевался -- всю динамику пришлось переписывать на "OPERATOR(pg_catalog" -- проклял гурьев теодора и олега. а вы -- своей смертью -- да этакое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 13:58 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
qwwq-- вы перекрыли системный "=" для int/bigint-а ? а назачем ? нет. Работает системное "=" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 14:21 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, > pgq.maint_rotate_tables_step2() эта штука насквозь апдейтит очереди. а тикер тикает на все очереди. где-то там случилось всё похоже (там fk с тиков на очереди). ордер бай там расставить что ли. хотя я, если честно, пока не вижу точно (ночь может), при чем ту finish_batch и его блокировки. хотя, он ждет апдейта (rotate), а апдейт и tick сами себя друг друг ждут. таких штук не видел раньше. найди в логе, кто в итоге то отвалился по исключению deadlock а ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 02:29 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
хотя они там могут и вперемешку ждать, например, finish успел попасть между взаимной блокировкой rotate и tick. например, finish (хочет share на queue через fk при update subscription) начал ждать rotate (update queue), в этот момент tick (хочет share на queue при insert в tick) уже ждал rotate, но и взял уже себе блокировок, которых далее начал ждать сам rotate, т. е. и rotate начал ждать tick -- вот и приехали. // ну или вариант наоборот между tick и rotate. походу точно надо ордер бай по queue_name или queue_id и в tick и в rotate при выборе очередей. там у вех времена (duration) по 70 секунд примерно были, всё в одно время завязалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 02:52 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, Вопросы 1)ваши хранимки случайно не пытаются с несколькими очередями одновременно работать в пределах 1 вызова или одной транзакции? 2)ваши хранимки случайно не пытаются несколько батчей за один вызов отработать в пределах 1 вызова или одной транзакции? Любой из этих вариантов является неверным использованием PGQ. PS: конкретно этот deadlock вылечится при переходе на 9.3+ версию так как это как раз случай: ======================================= Prevent non-key-field row updates from blocking foreign key checks (Álvaro Herrera, Noah Misch, Andres Freund, Alexander Shulgin, Marti Raudsepp, Alexander Shulgin) This change improves concurrency and reduces the probability of deadlocks when updating tables involved in a foreign-key constraint. UPDATEs that do not change any columns referenced in a foreign key now take the new NO KEY UPDATE lock mode on the row, while foreign key checks use the new KEY SHARE lock mode, which does not conflict with NO KEY UPDATE. So there is no blocking unless a foreign-key column is changed. ======================================= --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 08:26 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, спасибо на помощь [quot Maxim Boguk]Gold_, Вопросы 1)ваши хранимки случайно не пытаются с несколькими очередями одновременно работать в пределах 1 вызова или одной транзакции? 2)ваши хранимки случайно не пытаются несколько батчей за один вызов отработать в пределах 1 вызова или одной транзакции? Любой из этих вариантов является неверным использованием PGQ. PS: конкретно этот deadlock вылечится при переходе на 9.3+ версию так как это как раз случай: Да для обоих вопросов. - хранимка работает до первого не пустого батча. - хранимка с двумя очередями: если одна очередь не имеет батчей - начинает работать со второй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:34 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, я тут посмотрел и понял, что сломали всё в 3-ем скайтулзе (мы, в авито, на втором сидим). как сломали -- чуть более, чем было "надломано" во 2-ом. во втором не было сортировки и при ticker и при rotate -- и оно сексканом с очень большой вероятностью выбиралось в одном порядке и там и там -- следовательно и локи брались в одном порядке, дедлока практически не случалось! а в третьем зачем-то добавили ордер бай при ticker. ну и порядок взятия локов разошелся -- вероятность дедлоков драматически выросла! ссылки было: https://github.com/markokr/skytools/blob/skytools_2_1_stable/sql/pgq/functions/pgq.ticker.sql#L82 -- ! нет ордера https://github.com/markokr/skytools/blob/skytools_2_1_stable/sql/pgq/functions/pgq.maint_rotate_tables.sql#L104 -- нет ордера стало: https://github.com/markokr/skytools/blob/master/sql/pgq/functions/pgq.ticker.sql#L156 -- ! ордер https://github.com/markokr/skytools/blob/master/sql/pgq/functions/pgq.maint_rotate_tables.sql#L113 -- не поменялось по-хорошему надо щас писать Марко. как я уже предлагал выше, ордер бай и там и там (и везде, где есть еще подобное) по queue_id надо добавить. -- в 93+ оно конечно по-другому, как писал Максим, но я не 146% доверяю всему этому:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:59 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, Самый быстрый способ "подлечить" - убрать сортировку как во втором skytools? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 14:29 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, ну можно попробовать так, да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 14:58 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, Либо в maint_rotate_tables_step2 делать UPDATE по одной записи в нужном порядке? Что по Вашему лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 16:13 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_, порядок при ротейте нужен такой же, как и при тике. а уж по одной или по две -- даз нот маттер эт олл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 16:53 |
|
||
|
pgq deadlock
|
|||
|---|---|---|---|
|
#18+
Gold_Misha Tyurin, Либо в maint_rotate_tables_step2 делать UPDATE по одной записи в нужном порядке? Что по Вашему лучше? Проще обновится до 9.4.1. PS: работать не на (пред)последних минорных версиях базы - к проблемам (это я про 9.2.4 когда текущая 9.2.10) и винить будет некого. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 17:04 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38935147&tid=1998047]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 447ms |

| 0 / 0 |
