Серия «СУБД PostgreSQL»

3

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

Оптимизировать можно до бесконечности. Бесконечность - не предел.

Постановка задачи

Начало работ по использованию результатов корреляционного анализа ожиданий СУБД для подготовке процесса 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

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

Результат

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

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

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

wait_event_type

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

wait_event

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

queryid = 1214551160677155501

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

PG_HAZEL : Процесс оптимизации производительности СУБД PostgreSQL Субд, Postgresql, Оптимизация, Мониторинг, Производительность, Длиннопост

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

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

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

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

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

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

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

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

Задача

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

Симптомы

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

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

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

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

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

Наибольшую нагрузку создает 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.

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

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

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

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

Определение причины снижения производительности СУБД с использованием pg_hazel и pgpro_pwr Инженер, Субд, Postgresql, Мониторинг, Производительность, Длиннопост

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

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

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

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

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

PG_HAZEL : тестирование рекомендаций ChatPPG на сценариях нагрузочного тестирования PostgreSQL Тестирование, Инженер, Исследования, Искусственный интеллект, Нейронные сети, Postgresql, Чат-бот

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

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

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

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

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

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

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

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

Гипотеза об ожиданиях СУБД PostgreSQL Исследования, Субд, Postgresql, Производительность, Длиннопост

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

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

Серверный процесс выполняющий 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 выражений и общего числа строк, полученных или затронутых операторами за выбранный промежуток времени.

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

Гипотеза об ожиданиях СУБД PostgreSQL Исследования, Субд, Postgresql, Производительность, Длиннопост

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

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

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

Гипотеза об ожиданиях СУБД PostgreSQL Исследования, Субд, Postgresql, Производительность, Длиннопост

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

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

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

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

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

Гипотеза об ожиданиях СУБД PostgreSQL Исследования, Субд, Postgresql, Производительность, Длиннопост

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

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

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

Гипотеза об ожиданиях СУБД PostgreSQL Исследования, Субд, Postgresql, Производительность, Длиннопост

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

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

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

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

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

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

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

Иногда случается ситуация : нужно завершить долгий SQL запрос (кильнуть сессию).

Заметка на память - как не надо завершать процесс в PostgreSQL Субд, Postgresql, Полезное, Опыт, Личный опыт, Длиннопост

Стандартный способ, рекомендованный в документации :
select pg_terminate_backend( pid );


Однако, иногда, если запрос очень долгий , даже после прерывания процесса, pid всё равно еще остается в результате запроса select ... from pg_stat_activity ;


И в этой ситуации может возникнуть соблазн "kill -9 pid"
Чтобы побыстрее ...

Заметка на память - как не надо завершать процесс в PostgreSQL Субд, Postgresql, Полезное, Опыт, Личный опыт, Длиннопост

После выполнения kill , кластер PostgreSQL аварийно перезапустится , со всеми вытекающими последствиями .
Быстрее - не получится .

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

Заметка на память - как не надо завершать процесс в PostgreSQL Субд, Postgresql, Полезное, Опыт, Личный опыт, Длиннопост

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

PG_HAZEL - оперативно-тактический комплекс мониторинга и анализа производительности СУБД PostgreSQL

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

PG_HAZEL - оперативно-тактический комплекс мониторинга и анализа производительности СУБД PostgreSQL Субд, Postgresql, Производительность, Инженер, Исследования, Тестирование, Мониторинг

Скоро орешник даст плоды.

Начало

Эскизный проект

ℹ️Текущие возможности

✅Снимки pg_stat_activity , pg_locks , PostgreSQL RAM utilization.

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

✅Сбор статистических данных для оценки производительности на уровне SQL выражения.

✅История инцидентов снижения операционной скорости СУБД.

✅Связь между инцидентами и SQL выражениями.

Оперативная и сводная отчётность по инцидентам и нагрузочному тестированию.

Метрики оценки и мониторинга производительности СУБД.

Методология анализа инцидентов.

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

Сценарий №4 "HeavyWeight": CPU utilization

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

Ослик не справится , если его перегрузить

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

Начало

https://dzen.ru/a/Z_ZU4LQXlnxVJEBt

Постановка задачи

Корреляционный анализ ожиданий при проведении тестового нагрузочного тестирование по сценарию "HeavyWeight" - повышенная утилизация CPU.

Уточнить характерные признаки возникающие при нехватке вычислительной мощности CPU , при минимальном использовании IO.

Реализация теста

Виртуальная машина

cat /proc/cpuinfoprocessor  : 0model name  : Intel Xeon Processor (Skylake, IBRS, no TSX)cpu MHz  : 2693.670processor  : 1model name  : Intel Xeon Processor (Skylake, IBRS, no TSX)cpu MHz  : 2693.670

Тестовый запрос

FOR counter IN 1..10000LOOPSELECTgcd( ((random()*100.0) * (random()*100.0))::numeric , ((random()*100.0) * (random()*100.0))::numeric ) *lcm( ((random()*100.0) * (random()*100.0))::numeric , ((random()*100.0) * (random()*100.0))::numeric )*power(gcd( ((random()*100.0) * (random()*100.0))::numeric , ((random()*100.0) * (random()*100.0))::numeric ) ,lcm( ((random()*100.0) * (random()*100.0))::numeric , ((random()*100.0) * (random()*100.0))::numeric ))END LOOP;

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

explain ( analyze , buffers , summary ) select custom_test4();QUERY PLAN----------------------------------------------------------------------------------------Result  (cost=0.00..0.26 rows=1 width=4) (actual time=459.522..459.522 rows=1 loops=1)Buffers: shared hit=160Planning Time: 0.066 msExecution Time: 461.071 ms(4 rows)

Нагрузка на чтение с диска - отсутствует.

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

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

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

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

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

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

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

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

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

Сильная корреляция между ожиданиями и ожиданиями типа LWLock свидетельствует о том, что все ожидания вызваны типом LWLock.

Ожидания типа LWLock

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

Ось X - точка времени. Ось Y - ожидания типа LWLock

События ожиданий (wait_event) по тестовому запросу

Сценарий №4 "HeavyWeight": CPU utilization Субд, Postgresql, Производительность, Тестирование, Длиннопост

Фрагмент истории выполнения и ожиданий тестового запроса

Столбцы таблицы:

  • timestamp : точка времени сбора статистических данных уровня SQL.

  • datname : База данных, в которой выполнялся SQL запрос.

  • rolname : Роль, под которой выполнялся SQL запрос.

  • CALLS : Количество выполнений запроса .

  • WAITINGS : Количество ожиданий типа IO , LWLock .

  • WAITINGS TO CALLS : количество ожиданий на одно выполнение.

  • WAIT_EVENTS : события ожидания wait_event , возникающие при выполнении SQL запроса .

  • SQL : текст SQL запроса (не приведен).

События ожидания возникающие при выполнении SQL запроса:

  • ProcArray : Ожидание при обращении к общим структурам данных в рамках процесса (например, при получении снимка или чтении идентификатора транзакции в сеансе).

  • LockManager : Ожидание при чтении или изменении информации о «тяжёлых» блокировках.

Итог

Характерным признаком недостатка вычислительных ресурсов CPU является корреляция между снижением операционной скорости и ростом ожиданий ProcArray .

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

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Предельные нагрузки, лучше не превышать.

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

Постановка задачи

Корреляционный анализ ожиданий при проведении тестового нагрузочного тестирование по сценарию "HeavyWeight" - повышенная утилизация CPU.

Уточнить характерные признаки недостаточного размера shared_buffer при повышенной утилизации CPU и большом объеме чтений данных .

Реализация теста

Виртуальная машина

cat /proc/cpuinfo

processor  : 0

model name  : Intel Xeon Processor (Skylake, IBRS, no TSX)

cpu MHz  : 2693.670

processor  : 1

model name  : Intel Xeon Processor (Skylake, IBRS, no TSX)

cpu MHz  : 2693.670

Тестовый запрос

SELECTSUM(gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) *lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric )*power(gcd( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric ) ,lcm( abalance::numeric , ((random()*100.0) * (random()*100.0))::numeric )))INTO current_resultFROM pgbench_accounts  ;

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

QUERY PLAN---------------------------------------------------------------------------------------------Aggregate  (cost=232786.90..232786.91 rows=1 width=32) (actual time=14435.176..14435.177 rows=1 loops=1)

Buffers: shared hit=16235 read=16552

I/O Timings: shared read=973.889

->  Seq Scan on pgbench_accounts  (cost=0.00..52786.99 rows=1999999 width=4) (actual time=0.039..3764.889 rows=2000000 loops=1)

Buffers: shared hit=16235 read=16552

I/O Timings: shared read=973.889

Planning:Buffers: shared hit=63

Planning Time: 15.128 ms

Execution Time: 14435.289 ms

Нагрузка в ходе выполнения теста

Длительность итерации = 10 минут.

Рост нагрузки - экспоненциально.

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - номер тестовой итерации. Ось Y - количество сессий (--clints в pgbench)

Операционная скорость и время выполнения тестового запроса

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - номер тестовой итерации. Ось Y - значение операционной скорости тестового запроса.

Тест был принудительно завершен после потери работоспособности СУБД после выполнении итерации №16.

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - номер тестовой итерации. Ось Y - среднее время выполнения тестового запроса

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

Время выполнения с итерации №6 до итерации №16.

Периодичность сбора данных = 1 минута.

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

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

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

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

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

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

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

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Углы наклона линии регрессии и процентное отношение линии регрессии

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

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

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

Ожидания типа IO, IPC , LWLock

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - точка времени. Ось Y - ожидания типа IO

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - точка времени. Ось Y - ожидания типа IPC

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Ось X - точка времени. Ось Y - ожидания типа LWLock

События ожиданий (wait_event) по тестовому запросу

Сценарий №4 "HeavyWeight" - признак недостатка shared_buffer Субд, Postgresql, Тестирование, Производительность, Длиннопост

Фрагмент истории выполнения и ожиданий тестового запроса

Столбцы таблицы:

  • timestamp : точка времени сбора статистических данных уровня SQL.

  • datname : База данных, в которой выполнялся SQL запрос.

  • rolname : Роль, под которой выполнялся SQL запрос.

  • CALLS : Количество выполнений запроса .

  • WAITINGS : Количество ожиданий типа IO , LWLock .

  • WAITINGS TO CALLS : количество ожиданий на одно выполнение.

  • WAIT_EVENTS : события ожидания wait_event , возникающие при выполнении SQL запроса .

  • SQL : текст SQL запроса (не приведен).

События ожидания возникающие при выполнении SQL запроса:

  • DataFileRead : Ожидание чтения из файла данных отношения.

  • BufferIO : Ожидание завершения буферного ввода/вывода.

  • BufferMapping : Ожидание при связывании блока данных с буфером в пуле буферов.

Итог

Характерным признаком недостаточного размера общей области памяти shared_buffers является корреляция между снижением операционной скорости и ростом ожиданий BufferMapping/BufferIO.

Показать полностью 11
Отличная работа, все прочитано!