Презентация по докладу "Корреляционный анализ ожиданий СУБД PostgreSQL"
Начата работа над докладом для осенних конференций Heisenbug и PgProDay .
Начата работа над докладом для осенних конференций Heisenbug и PgProDay .
Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).
Начало работ по использованию результатов корреляционного анализа ожиданий СУБД для подготовке процесса Continual improvement .
Провести тестирование результатов корреляционного анализа ожиданий на продуктивной СУБД по инцидентам производительности в течении недели .
Postgres Pro (enterprise certified) 15.10.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Soft 11.4.0-1), 64-bit
CPU 50
RAM 88GB
RED OS 7.3
свыше 80% инцидентов производительности имеют приоритет 4
Количество SQL запросов участвующих во всех инцидентах = 5
Количество SQL запросов участвующих в 80% инцидентов = 29
План выполнения запроса
Статистика ожиданий по типу IO
Статистика ожиданий по типу IPC
1. Событий ожидания типа IPC существенно больше чем событий по типу IO.
2. На основании результатов проведенных ранее экспериментов , принято решение добавить индекс в таблицу для решения проблемы большого количества ожиданий типа IPC.
3. После добавления индексов , провести анализ результатов .
Симптомы
При высокой нагрузке на СУБД при выполнении SELECT , возможны массовые ожидания IPC/BgWorkerShutdown.
Причина
Параллельное последовательное сканирование: блоки таблицы будут разделены на диапазоны, распределяемые между взаимодействующими процессами.
Исправление
Создание индекса по полю, участвующему в запросе , в плане выполнения которого используется Workers Planned - Workers Launched.
Подробнее
Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).
Определить причину аномальной утилизации CPU и снижения производительности СУБД
Аномальная утилизация CPU сервера СУБД
Отрицательная корреляция между снижением операционной скорости и ростом ожиданий - отсутствует.
Подробнее об индикаторе
Этот раздел отчёта pgpro_pwr основан на представлении pgpro_stats_totals расширения pgpro_stats, если оно было доступно в течение отчётного интервала. Каждая таблица в данном разделе предоставляет данные за отчётный интервал о распределении нагрузки для определённого типа объектов, для которых собирается агрегированная статистика, например, баз данных, приложений, узлов или пользователей. Каждая таблица содержит по одной строке для каждого из ресурсов (таких, как общее время или общее число записанных разделяемых блоков), где распределение нагрузки показано на графике в виде линейчатой диаграммы с накоплением для объектов с наибольшей нагрузкой по этому ресурсу. Если область диаграммы, соответствующая объекту, слишком узка для включения заголовков, наведите указатель на эту область, чтобы получить подсказку с заголовком, значением и процентом. Таблицы «Load distribution among heavily loaded databases», «Load distribution among heavily loaded applications», «Load distribution among heavily loaded hosts» и «Load distribution among heavily loaded users» показывают распределение нагрузки для соответствующих объектов.
Этот раздел добавляется в отчёт, только если в отчётном интервале было доступно расширение pgpro_stats или pg_stat_kcache.
Таблица отчёта «Top SQL by system and user time» показывает запросы с наибольшей суммой значений полей user_time и system_time в представлении pg_stat_kcache или pgpro_stats_totals.
Таблица отчёта «Top SQL by execution time» показывает запросы с наибольшей длительностью выполнения, определяемой по значению поля total_time представления pgpro_stats_statements или pg_stat_statements.
Причина аномальной утилизации CPU и снижения операционной скорости СУБД является массовый вызов хранимой функции, требующей для выполнения высоких вычислительных ресурсов.
Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).
Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).
Серверный процесс выполняющий SQL запрос к СУБД, в процессе выполнения находится в основных состояниях:
· active: серверный процесс выполняет запрос.
· idle: серверный процесс ожидает новой команды от клиента.
· idle in transaction: серверный процесс находится внутри транзакции, но в настоящее время не выполняет никакой запрос.
Если, серверный процесс находится состоянии active, то процесс может находится в либо в состоянии выполнения запроса, либо в состоянии ожидания:
wait_event_type text
Тип события, которого ждёт обслуживающий процесс, если это ожидание имеет место; в противном случае — NULL.
Чем меньше количество времени, в течении которого серверный процесс, выполняющий SQLзапрос к СУБД, имеет непустое событие ожидания, тем меньше времени серверный процесс находится в ожидании, тем быстрее завершится SQL запрос к СУБД и при многократном выполнении SQLзапросов - чем меньше ожиданий, тем больше запросов в единицу времени будет выполнено и больше полезной информации будет предоставлено клиенту.
Операционная скорость
Интегральный показатель, рассчитываемый как сумма общего числа выполненных SQL выражений и общего числа строк, полученных или затронутых операторами за выбранный промежуток времени.
Для сглаживания выбросов используется медианное сглаживание.
События ожидания в PostgreSQL
Информация о том, чего процесс базы данных ожидает, когда не выполняются активные запросы.
Коэффициент корреляции
Коэффициент корреляции в математической статистике — показатель, характеризующий силу статистической связи между двумя или несколькими случайными величинами.
Корреляция между операционной скоростью и ожиданиями
Коэффициент корреляции между значениями операционной скорости и событиями ожидания.
Ось X - значения операционной скорости за период наблюдения. Ось Y - значения ожиданий за период наблюдений.
Корреляция между ожиданиями
Коэффициент корреляции между всеми ожиданиями и событиями ожидания по определенному типу
Ось X - значения ожиданий за период наблюдений. Ось Y - значения ожиданий типа IPC за период наблюдений.
При постоянном сценарии нагрузки (неизменяемые SQL запросы) и при постоянных конфигурационных параметрах СУБД - коэффициент корреляции между значениями операционной скорости и количеством ожиданий определяет степень влияния событий ожидания на снижение операционной скорости.
При отсутствии влияния инфраструктуры (CPU, сеть), наибольшее влияние на снижение операционной скорости имеет тип ожидания, имеющее наибольшее значение коэффициента корреляции со всеми ожиданиями СУБД.
Следовательно – снизив количество ожиданий данного типа время выполнения SQL запроса уменьшится и количество запросов за отрезок времени увеличится. Т.е. операционная скорость возрастет.
Иногда случается ситуация : нужно завершить долгий SQL запрос (кильнуть сессию).
Стандартный способ, рекомендованный в документации :
select pg_terminate_backend( pid );
Однако, иногда, если запрос очень долгий , даже после прерывания процесса, pid всё равно еще остается в результате запроса select ... from pg_stat_activity ;
И в этой ситуации может возникнуть соблазн "kill -9 pid"
Чтобы побыстрее ...
После выполнения kill , кластер PostgreSQL аварийно перезапустится , со всеми вытекающими последствиями .
Быстрее - не получится .
Нужно просто подождать завершения отката изменений, выполненных в ходе транзакции начатой pid .
P.S. Ну и как обычно , мнение ИИ. Страшилка о 'kill -9" от DeepSeek:
После выполнения команды `kill -9` для процесса PostgreSQL, выполняющего долгий запрос, возникают следующие последствия:
### 1. **Прерывание транзакции**
- Транзакция, связанная с убитым процессом, **не будет завершена корректно**. Поскольку `SIGKILL` (сигнал 9) нельзя перехватить или обработать, PostgreSQL не успевает выполнить откат (`ROLLBACK`) транзакции. Это может привести к:
- **Незавершенным изменениям данных**: Если транзакция выполняла модификацию данных (INSERT/UPDATE/DELETE), изменения останутся в состоянии "под вопросом" до восстановления.
- **Блокировкам (locks)**: Ресурсы (строки, таблицы), заблокированные транзакцией, могут остаться занятыми до очистки процесса.
### 2. **Автоматическое восстановление PostgreSQL**
- PostgreSQL обнаруживает аварийное завершение процесса и автоматически выполняет:
- **Очистку блокировок**: Все удерживаемые процессом блокировки освобождаются.
- **Откат транзакции**: Незавершенная транзакция откатывается с помощью механизма восстановления на основе **WAL (Write-Ahead Logging)**. Это гарантирует целостность данных, но может занять время, особенно если транзакция была крупной.
### 3. **Влияние на производительность**
- **Долгое восстановление**: Если убитый процесс работал с большим объемом данных, откат транзакции через WAL может задержать другие операции.
- **Возможные задержки**: Другие сессии, ожидавшие блокировок от убитого процесса, получат доступ к ресурсам только после завершения восстановления.
### 4. **Ошибки в клиентских приложениях**
- Клиент, инициировавший запрос, получит ошибку соединения (например, `connection terminated unexpectedly`). Приложение должно быть готово к таким сценариям (повторные попытки, обработка исключений).
### 5. **Риск для репликации (если используется)**
- В режимах синхронной репликации аварийное завершение процесса может временно нарушить синхронизацию данных между primary и standby-серверами. Однако механизм WAL гарантирует восстановление согласованности.
### 6. **Журналирование (логи)**
- В логах PostgreSQL появится запись об аварийном завершении процесса, например:
```
FATAL: terminating connection due to administrator command
LOG: server process (PID 12345) was terminated by signal 9: Killed
LOG: aborting any active transactions
```
---
### Рекомендации:
1. **Избегайте `kill -9`**, если это возможно. Используйте `pg_cancel_backend()` или `pg_terminate_backend()` для безопасного завершения запросов.
2. Для долгих транзакций настройте `statement_timeout` или `idle_in_transaction_session_timeout`.
3. Мониторьте активные транзакции через `pg_stat_activity`.
**Итог**: `kill -9` не повредит данные благодаря WAL, но может вызвать временные задержки и требует времени на автоматическое восстановление.
Какую часть работы администраторов баз данных уже можно заменить ИИ, а какую вряд ли удастся автоматизировать?
Он также может находить неочевидные корреляции между различными параметрами производительности СУБД.
Какой навык у администратора баз данных станет самым важным в ближайшие 5 лет?
Однако, учитывая активное развитие средств автоматизации и искусственного интеллекта, которые могут взять на себя часть рутинных операций по мониторингу или предложению стандартных оптимизаций, наиболее важным качеством для DBA станет глубокая экспертиза и способность решать сложные, нетривиальные проблемы производительности и стабильности.
