Сообщество - Postgres DBA

Postgres DBA

157 постов 27 подписчиков

Популярные теги в сообществе:

Презентация по докладу "Корреляционный анализ ожиданий СУБД PostgreSQL"

Взято с основного технического канала Postgres DBA

Начата работа над докладом для осенних конференций Heisenbug и PgProDay .

Показать полностью 5
2

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL

Взято с основного технического канала 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

Приоритеты инцидентов

Подробнее о приоритетах

Ось X - инцидент производительности СУБД . Ось Y - приоритет инцидента

Ось X - инцидент производительности СУБД . Ось Y - приоритет инцидента

Ось X - инцидент производительности СУБД . Ось Y - приоритет инцидента

Ось X - инцидент производительности СУБД . Ось Y - приоритет инцидента

Результат

  • свыше 80% инцидентов производительности имеют приоритет 4

Количество SQL запросов по инцидентам

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос.

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос.

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос

SQL запросы участвующие в более 80% инцидентов

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос.

Ось X - queryid запроса. Ось Y - количество инцидентов в которых участвовал запрос.

  • Количество SQL запросов участвующих во всех инцидентах = 5

  • Количество SQL запросов участвующих в 80% инцидентов = 29

Ожидания СУБД

wait_event_type

Ось X - тип ожидания СУБД . Ось Y - количество ожиданий

Ось X - тип ожидания СУБД . Ось Y - количество ожиданий

wait_event

Ось X - событие ожидания. Ось Y - количество событий ожиданий

Ось X - событие ожидания. Ось Y - количество событий ожиданий

События ожидания составляющие 80% от общего числа ожиданий.

События ожидания составляющие 80% от общего числа ожиданий.

SQL запросы для оптимизации

Список SQL запросов участувующих в инцидентах

Список SQL запросов участувующих в инцидентах

queryid = 1214551160677155501

План выполнения запроса

Статистика ожиданий по типу IO

События ожидания по типу IO

События ожидания по типу IO

История выполнения и событий ожидания по типу IO для queryid = 1214551160677155501

Ось X - точка наблюдения. Ось Y - количество выполнений запроса.

Ось X - точка наблюдения. Ось Y - количество выполнений запроса.

Ось X - точка наблюдения. Ось Y - количество событий ожидания DSMFillZeroWrite

Ось X - точка наблюдения. Ось Y - количество событий ожидания DSMFillZeroWrite

Статистика ожиданий по типу IPC

События ожидания по типу IPC

События ожидания по типу IPC

История выполнения и событий ожидания по типу IPC для queryid = 1214551160677155501

Ось X - точка наблюдения. Ось Y - количество выполнений запроса.

Ось X - точка наблюдения. Ось Y - количество выполнений запроса.

Ось X - точка наблюдения. Ось Y - количество событий ожидания BgWorkerShutdown

Ось X - точка наблюдения. Ось Y - количество событий ожидания BgWorkerShutdown

Ось X - точка наблюдения. Ось Y - количество событий ожидания ExecuteGather

Ось X - точка наблюдения. Ось Y - количество событий ожидания ExecuteGather

Ось X - точка наблюдения. Ось Y - количество событий ожидания ParallelFinish

Ось X - точка наблюдения. Ось Y - количество событий ожидания ParallelFinish

Результаты анализа по SQL queryid = 1214551160677155501

1. Событий ожидания типа IPC существенно больше чем событий по типу IO.

2. На основании результатов проведенных ранее экспериментов , принято решение добавить индекс в таблицу для решения проблемы большого количества ожиданий типа IPC.

3. После добавления индексов , провести анализ результатов .

Показать полностью 19
1

Ожидания IPC при отсутствии индекса в СУБД PostgreSQL

Симптомы

При высокой нагрузке на СУБД при выполнении SELECT , возможны массовые ожидания IPC/BgWorkerShutdown.

Ожидания IPC при отсутствии индекса в СУБД PostgreSQL

Причина

Параллельное последовательное сканирование: блоки таблицы будут разделены на диапазоны, распределяемые между взаимодействующими процессами.

Исправление

Создание индекса по полю, участвующему в запросе , в плане выполнения которого используется Workers Planned - Workers Launched.

Подробнее

PG_HAZEL : ожидания СУБД PostgreSQL при отсутствии индексов.

Показать полностью

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr

Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).

У любого события есть причина .

У любого события есть причина .

Задача

Определить причину аномальной утилизации CPU и снижения производительности СУБД

Симптомы

Аномальная утилизация CPU сервера СУБД

Ось X - точка времени. Ось Y - метрика утилизации CPU.

Ось X - точка времени. Ось Y - метрика утилизации CPU.

Наблюдаемая проблема

Снижение операционной скорости СУБД

Ось X - точка времени. Ось Y - операционная скорость СУБД

Ось X - точка времени. Ось Y - операционная скорость СУБД

Корреляционный анализ

Отрицательная корреляция между снижением операционной скорости и ростом ожиданий - отсутствует.

Ось X - точка времени. Ось Y - ожидания СУБД

Ось X - точка времени. Ось Y - ожидания СУБД

Ось X - точка времени. Ось Y - значение индикатора деградации скорости СУБД

Ось X - точка времени. Ось Y - значение индикатора деградации скорости СУБД

Подробнее об индикаторе

https://dzen.ru/a/Z-FQYUcB3gepNYzA

Отчеты pgpro_pwr

G.3.11.2. Load distribution (Распределение нагрузки)

Этот раздел отчёта 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» показывают распределение нагрузки для соответствующих объектов.

Наибольшую нагрузку создает DB-1

Наибольшую нагрузку создает DB-1

Статистика утилизации CPU

G.3.11.4.1. rusage statistics (Статистика использования ресурсов)

Этот раздел добавляется в отчёт, только если в отчётном интервале было доступно расширение pgpro_stats или pg_stat_kcache.

Таблица отчёта «Top SQL by system and user time» показывает запросы с наибольшей суммой значений полей user_time и system_time в представлении pg_stat_kcache или pgpro_stats_totals.

SQL запрос с наибольшим потреблением CPU

SQL запрос с наибольшим потреблением CPU

Наиболее длительные SQL

Таблица отчёта «Top SQL by execution time» показывает запросы с наибольшей длительностью выполнения, определяемой по значению поля total_time представления pgpro_stats_statements или pg_stat_statements.

SQL запрос с наибольшей длительностью выполнения

SQL запрос с наибольшей длительностью выполнения

Причина инцидента и проблемный запрос

Проблемный запрос

Проблемный запрос

Причина аномальной утилизации CPU и снижения операционной скорости СУБД является массовый вызов хранимой функции, требующей для выполнения высоких вычислительных ресурсов.

Показать полностью 9

PG_HAZEL : тестирование рекомендаций ChatPPG на сценариях нагрузочного тестирования PostgreSQL

Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).

Человек и чат-бот - уже коллеги по работе.

Человек и чат-бот - уже коллеги по работе.

PG_HAZEL : Влияние изменения параметра max_parallel_workers_per_gather на скорость и ожидания СУБД.

Подробности экспериментов

PG_HAZEL : Влияние изменения параметра shared_buffer на скорость и ожидания СУБД.

Подробности экспериментов

Показать полностью

Гипотеза об ожиданиях СУБД PostgreSQL

Взято с основного технического канала Postgres DBA ( возможны правки и дополнения в исходной статье ).

Время - деньги.

Время - деньги.

Определение ожидания СУБД

Серверный процесс выполняющий SQL запрос к СУБД, в процессе выполнения находится в основных состояниях:

· active: серверный процесс выполняет запрос.

· idle: серверный процесс ожидает новой команды от клиента.

· idle in transaction: серверный процесс находится внутри транзакции, но в настоящее время не выполняет никакой запрос.

Postgres Pro Enterprise : Документация: 15: 27.2. Система накопительной статистики : Компания Postgres Professional

Если, серверный процесс находится состоянии active, то процесс может находится в либо в состоянии выполнения запроса, либо в состоянии ожидания:

wait_event_type text

Тип события, которого ждёт обслуживающий процесс, если это ожидание имеет место; в противном случае — NULL.

Postgres Pro Enterprise : Документация: 15: 27.2. Система накопительной статистики : Компания Postgres Professional

Вывод

Чем меньше количество времени, в течении которого серверный процесс, выполняющий SQLзапрос к СУБД, имеет непустое событие ожидания, тем меньше времени серверный процесс находится в ожидании, тем быстрее завершится SQL запрос к СУБД и при многократном выполнении SQLзапросов - чем меньше ожиданий, тем больше запросов в единицу времени будет выполнено и больше полезной информации будет предоставлено клиенту.

Термины и определения:

Операционная скорость

Интегральный показатель, рассчитываемый как сумма общего числа выполненных SQL выражений и общего числа строк, полученных или затронутых операторами за выбранный промежуток времени.

Для сглаживания выбросов используется медианное сглаживание.

Ось X - точка наблюдения. Ось Y - значение операционной скорости.

Ось X - точка наблюдения. Ось Y - значение операционной скорости.

События ожидания в PostgreSQL

Информация о том, чего процесс базы данных ожидает, когда не выполняются активные запросы.

Ось X - точка наблюдения. Ось Y - общее количество ожиданий за отрезок наблюдения.

Ось X - точка наблюдения. Ось Y - общее количество ожиданий за отрезок наблюдения.

Коэффициент корреляции

Коэффициент корреляции в математической статистике — показатель, характеризующий силу статистической связи между двумя или несколькими случайными величинами.

Корреляция между операционной скоростью и ожиданиями

Коэффициент корреляции между значениями операционной скорости и событиями ожидания.

Ось X - значения операционной скорости за период наблюдения. Ось Y - значения ожиданий за период наблюдений.

Ось X - значения операционной скорости за период наблюдения. Ось Y - значения ожиданий за период наблюдений.

Корреляция между ожиданиями

Коэффициент корреляции между всеми ожиданиями и событиями ожидания по определенному типу

Ось X - значения ожиданий за период наблюдений. Ось Y - значения ожиданий типа IPC за период наблюдений.

Ось X - значения ожиданий за период наблюдений. Ось Y - значения ожиданий типа IPC за период наблюдений.

Практический вывод

При постоянном сценарии нагрузки (неизменяемые SQL запросы) и при постоянных конфигурационных параметрах СУБД - коэффициент корреляции между значениями операционной скорости и количеством ожиданий определяет степень влияния событий ожидания на снижение операционной скорости.

При отсутствии влияния инфраструктуры (CPU, сеть), наибольшее влияние на снижение операционной скорости имеет тип ожидания, имеющее наибольшее значение коэффициента корреляции со всеми ожиданиями СУБД.

Следовательно – снизив количество ожиданий данного типа время выполнения SQL запроса уменьшится и количество запросов за отрезок времени увеличится. Т.е. операционная скорость возрастет.

Показать полностью 4
7

Заметка на память - как не надо завершать процесс в PostgreSQL

Иногда случается ситуация : нужно завершить долгий 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, но может вызвать временные задержки и требует времени на автоматическое восстановление.

Показать полностью 3

Переход из Oracle в Postgres Pro: не просто смена СУБД, а сдвиг подхода. Интервью с Марком Ривкиным

Какую часть работы администраторов баз данных уже можно заменить ИИ, а какую вряд ли удастся автоматизировать?

Он также может находить неочевидные корреляции между различными параметрами производительности СУБД.

Какой навык у администратора баз данных станет самым важным в ближайшие 5 лет?

Однако, учитывая активное развитие средств автоматизации и искусственного интеллекта, которые могут взять на себя часть рутинных операций по мониторингу или предложению стандартных оптимизаций, наиболее важным качеством для DBA станет глубокая экспертиза и способность решать сложные, нетривиальные проблемы производительности и стабильности.

Переход из Oracle в Postgres Pro: не просто смена СУБД, а сдвиг подхода. Интервью с Марком Ривкиным

Отличная работа, все прочитано!