В многоядерных высоконагруженных системах с высокой конкурентностью часто бывает сложно определить, чем занят отдельный процесс PostgreSQL. Он может находиться в ожидании локов высокого уровня, таких как локи таблиц, внутренних локов, используемых для синхронизации процессов, ввода-вывода и многих других.
В настоящий момент среди всех событий ожидания мониторить можно только локи высокого уровня с помощью представлений PostgreSQL. Другие типы ожиданий требуют использования низкоуровневых утилит типа perf, systemtap и других. Эти утилиты требуют специальных знаний и могут быть платформозависимыми. В то же время другие enterprise базы данных уже включают в себя инструменты для мониторинга ожиданий.
Мы разработали патч, который реализует мониторинг ожиданий в PostgreSQL. С минимальной настройкой (несколько конфигурационных параметров) этот патч показывает полную информацию о текущих ожиданиях в режиме реального времени и с небольшим оверхедом на всю систему. Этот патч уже работает на продакшен серверах Яндекса и показал свою полезность.
3. Мониторинг ожиданий
• отслеживание событий
ожидания и построение
их профиля (времени и
количества) для
идентификации "узких"
мест в системе
4. Где и зачем это нужно?
• высоконагруженные конкурентные системы
• enterprise базы данных должны иметь встроенный
мониторинг. Oracle имеет wait интерфейс из коробки,
это также упрощает миграцию
• информация по состоянию системы в любой момент
времени в production системе с минимальным оверхедом
9. Минусы
• отдельную задачу выполняют
хорошо, но не дают полную
картину
• внешние по отношению к
Postgres (perf)
• иногда требуют нетривиальных
знаний от DBA (gdb)
16. Неизвестно время наступления
событий (нужно привязывать ко
времени выгрузки)
Точность измерения
Возможность строить графики в
реальном времени
Плюсы-минусы профайлинга
18. История событий
b1=# SELECT * FROM pg_stat_wait_history;
-[ RECORD 1 ]-----------------------------
pid | 1809
sample_ts | 2015-10-29 04:58:53.85285-04
class_id | 3
class_name | Storage
event_id | 0
event_name | SMGR_READ
wait_time | 10299
p1 | 1663
p2 | 16384
p3 | 12214
p4 | 0
p5 | 1
Тип события
Oid базы данных и таблицы
19. Много дополнительных параметров
(для storage событий вплоть до блока
записи)
Может пропускать события (сэмплинг)
Содержит время события
Содержит ограниченное количество
событий
Плюсы-минусы истории
26. pg_stat_wait выключен
transaction type: SELECT only
scaling factor: 500
query mode: simple
number of clients: 96
number of threads: 4
duration: 300 s
number of transactions: 39349816
latency average: 0.732 ms
tps = 131130.859559
tps = 131153.752204
27. pg_stat_wait включен
transaction type: SELECT only
scaling factor: 500
query mode: simple
number of clients: 96
number of threads: 4
duration: 300 s
number of transactions: 39172607
latency average: 0.735 ms
tps = 130574.626755
tps = 130600.767440
28. Итоги теста
• Минимальный оверхед - 0.42 %
• Выключив историю, можно
получить еще более низкий
оверхед
• Тест синтетический, оверхед
будет другим в реальных
системах
29. Продвижение в PostgreSQL
Целевая версия - PostgreSQL 9.6
Этапы:
• Рефакторинг легковесных локов
• Поле в pg_stat_activity
• Профайлинг в ядре Postgres
30. Open source
• Ссылка на презентацию
https://goo.gl/M005wM
• Ссылка на исходный код
https://goo.gl/M0GrFI