|
|
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
Добрый день! PostgreSQL 9.3, Centos 6.5. Периодически база данных подвисает: все запросы, которые выполнялись за доли секунды, начинают выполняться десятки секунд. В pgAdmin окно "Состояние сервера" показывает резкое увеличение числа активных запросов. Само это окно также подвисает. Примерно через полминуты (иногда быстрее) все приходит в норму. Логирование запросов никаких аномалий, которые предшествуют данной проблеме, не выявляет. Единственное - показывает частое выполнение autovacuum по нескольким таблицам, но за доли секунды. Нагрузка на процессор (смотрю через top) не растет - процессор не нагружен совсем. Памяти свободной (точнее, кешированной) достаточно. PostgreSQL настроен с помощью pgtune. Подскажите пожалуйста (я новичок в администрировании PostgreSQL) - каким образом можно поймать причину этих зависаний? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2016, 16:34 |
|
||
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
Kenshin, Приведите вывод запроса: Код: sql 1. Просмотрите лог базы на наличие предупреждений и более значимых сообщений. Приведите вывод команды: Код: sql 1. Похоже на чепойнт — либо в базе, либо в ядре :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2016, 19:07 |
|
||
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
SELECT name,setting FROM pg_settings WHERE NOT source IN ('default','overdue'); Код: 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. sysctl -a|egrep '^vm.(swap|overcommit|dirty)' Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Лог за вчера содержит 227 записей про checkpoint, каждая примерно такого вида: Код: plaintext 1. 2. 3. 4. Есть сообщения вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 08:38 |
|
||
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
Kenshin Код: plaintext 1. 2. 3. 4. 5. 8 сегментов мало. Поднимите хотя бы до 64 (что соответствует 1Гб WAL). Kenshin Код: plaintext 1. 2. 3. Вам необходимо 8Гб? Если места в кэше с избытком, то будут накапливаться грязные буфера и чекпойнт будет тяжелым. Если у вас достаточно интенсивная пишущая нагрузка, я бы проверил и, возможно, понизил. поставьте расширение `pg_buffercache` и посчитайте буфера так: Код: sql 1. 2. 3. 4. ОСТОРОЖНО: запрос тяжелый и в продукции может иметь неприятный эффект. Чем выше usagecount, тем более "горячие" данные. `shared_buffers` "должны" покрывать буфера 5,4,3 — в последней колонке будут необходимые проценты от вашего текущего значенияю, я бы взял значение для `usagecount=3` и соответственно поправил бы. Kenshin Код: plaintext 1. 2. 3. Первый параметр отвечает за поведение ядра при нехватке виртуальной памяти. При вашей (умолчательной) настройке, ядро будет выдавать виртуальной памяти процессам больше, чем есть (реже встречается Not enough memory ошибка). Однако, если оно "навыдает" виртуалки и все процессы "вдруг" её потребуют, то ядро (для высвобождения физической памяти) найдет процесс, который (1) работает давно (2) отхватил существенный кусок памяти и (3) был неактивным — и прервёт его. Увы, под такие характеристики отлично попадают процессы Postgres'а (и других СУБД), что приводит к аварийному перезапуску базы. меняйте на `vm.overcommit_memory=2` на всех серверах с Postgres'ом `vm.swappiness = 60` (цифра == проценты) отвечает за то, будет ли ядро предпочитать кэширование файлов, вытесняя процессы в своп. Чем выше цифра, тем агрессивнее ядро будет вытеснять процессы для освобождения места под кэши. для хорошего времени отклика меняйте на `vm.swappiness = 0`. Это не исключает своппинга в принципе (если будет нехватка памяти), но это заставит ядро максимально держать процессы в памяти. KenshinЛог за вчера содержит 227 записей про checkpoint, каждая примерно такого вида: Код: plaintext 1. 2. 3. 4. Ничего криминального вроде нету. KenshinЕсть сообщения вида: Код: plaintext 1. 2. 3. 4. 5. Проверьте наличие `idle in transaction` сессий — они зло! Ситуаций, когда транзакции ждут какую-то сессию 4 минуты, быть не должно. Также рекомендую пониторить систему (IO, VM, CPU) системными средствами и смотреть, что происходит в моменты подвисаний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 10:48 |
|
||
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
Vyegorov, cпасибо, все попробую. Сессий в статусе "idle in transaction" постоянно висит от 10 штук. Это вопрос к разработчику? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 11:16 |
|
||
|
Периодические зависания: найти причину
|
|||
|---|---|---|---|
|
#18+
KenshinСессий в статусе "idle in transaction" постоянно висит от 10 штук. Это вопрос к разработчику? Да, но они не любят таких вопросов. Быстрее будет запилить скрипт, который idle-in-transaction сессии с началом транзакции минут 5 назад будет обрывать. Правда, можно аппликуху положить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2016, 11:25 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1997468]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 502ms |

| 0 / 0 |
