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

Postgres DBA

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

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

0

Синтез статистики и искусственного интеллекта: pg_expecto v.7 собирает данные, DeepSeek формирует отчет по нагрузочному тестированию

Серия СУБД PostgreSQL

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

Не просто цифры: pg_expecto v.7 и DeepSeek превращают метрики в стратегию

Не просто цифры: pg_expecto v.7 и DeepSeek превращают метрики в стратегию

Результаты нагрузочного тестирования

Предисловие

Настоящий отчет подготовлен по результатам комплексного корреляционного анализа производительности СУБД PostgreSQL и инфраструктуры сервера за период 12 февраля 2026 года (14:11 – 16:00). Цель работы — выявление узких мест, количественная оценка влияния различных типов событий ожидания на операционную скорость базы данных, а также анализ системных метрик (vmstat) для определения первопричин наблюдаемой деградации производительности.

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

Сводный отчет по производительности СУБД и инфраструктуры

Общая информация

  • Дата анализа: 2026-02-12 14:11 – 16:00

  • Версия PostgreSQL: 17.5 на Linux (x86_64, gcc 11.4.1)

  • Аппаратная конфигурация:
    CPU: 8 виртуальных ядер Intel Xeon (Skylake)
    RAM: 7.5 GB
    Диски: отдельные LVM-тома для данных (/data), WAL (/wal), логов (/log)

  • Ключевые настройки PostgreSQL:
    shared_buffers = 4 GB
    work_mem = 128 MB
    effective_cache_size = 6 GB
    max_parallel_workers_per_gather = 1
    checkpoint_timeout = 5 min
    autovacuum настроен агрессивно (масштабные коэффициенты 0.01/0.005)

  • Настройки ОС (vm):
    dirty_background_ratio = 5%
    dirty_ratio = 10%
    swappiness = 1
    vfs_cache_pressure = 50

Общий анализ

1. СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД

  • Общая картина: операционная скорость растет вместе с общим временем ожиданий (R²=0.69), что говорит об увеличении нагрузки.

  • Тренд ожиданий: устойчивый рост (R²=0.89, угол наклона +43.3).

  • Интегральные приоритеты типов ожиданий (чем выше, тем критичнее):
    IPC (межпроцессное взаимодействие) – 0.8482
    Timeout – 0.5919
    LWLock – 0.4048
    IO – 0.3998
    BufferPin, Extension, Lock – приоритет 0 (незначимы в данном периоде)

Итог по разделу "1. СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД"

  • Наибольший вклад в ожидания вносят IPC и Timeout.

  • Ожидания IPC требуют немедленного анализа (критическое значение ВКО).

  • Наблюдается положительная корреляция между скоростью операций и ожиданиями – система работает на пределе, рост нагрузки ведет к росту задержек.

2. ТРЕНДОВЫЙ АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ vmstat

  • procs r (очередь на выполнение) – негативный тренд (умеренный рост), R²=0.49.

  • procs b (процессы в uninterruptible sleep) – негативный тренд, R²=0.53.

  • cpu wa (ожидание I/O) – позитивный тренд (снижение), R²=0.82.

  • cpu id (простой CPU) – негативный тренд, очень высокая скорость падения (коэф. тренда +35.25, R²=0.83). Это критический сигнал.

Итог по разделу "2. ТРЕНДОВЫЙ АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ vmstat"

  • Растет конкуренция за CPU (увеличение r) и число процессов, заблокированных в I/O (рост b).

  • Падение простоя CPU (id) при одновременном снижении wa указывает на то, что процессор загружен полезной работой (user/system), а не ожиданием диска.

  • Рекомендовано создать инцидент по резкому падению cpu id.

3. СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД и МЕТРИК vmstat

  • IPC очень сильно коррелирует с:
    переключениями контекста (cs) – R=0.895, R²=0.80
    прерываниями (in) – R=0.954, R²=0.91
    системным временем (sy) – R=0.950, R²=0.90

  • Timeout сильно коррелирует с sy (R=0.972), in (R=0.936), cs (R=0.861), r (R=0.758).

  • LWLock сильно связан с sy (R=0.936), умеренно с cs (R=0.615) и swap out (R=0.623).

  • IO сильно коррелирует с чтениями с диска (bi) – R=0.928, и умеренно с записями (bo) – R=0.756.

  • Индекс приоритета корреляций (CPI) – самые высокие связи:
    cs ↔ in (0.9845)
    Timeout ↔ sy (0.9642)
    IPC ↔ in (0.9395)
    IPC ↔ sy (0.9326)

Итог по разделу "3. СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД и МЕТРИК vmstat"

  • Ожидания IPC и Timeout практически полностью объясняются системными метриками (cs, in, sy) – высокая активность ядра, переключения контекста и прерывания.

  • LWLock ожидания также связаны с системным временем, что указывает на конкуренцию за структуры в shared memory.

  • I/O ожидания напрямую зависят от объема дисковых операций.

4. ДИАГРАММЫ ПАРЕТО ПО WAIT_EVENT_TYPE и QUERYID

  • IPC: 100% ожиданий приходится на queryid 7143487894308847288 (функция scenario1).

  • Timeout: 99.48% ожиданий – тот же queryid.

  • LWLock: 94.42% ожиданий – тот же queryid.

  • IO: 67.98% – scenario1, 31.99% – queryid -1879773681171496870 (scenario3).

Итог по разделу "4. ДИАГРАММЫ ПАРЕТО ПО WAIT_EVENT_TYPE и QUERYID"

  • Доминирующий источник всех проблем – запрос select scenario1().

  • Второстепенный вклад в I/O ожидания вносит select scenario3().

  • Оптимизация этих двух запросов критически важна для снижения общей нагрузки.

Детальный анализ – граничные значения и корреляции

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

  • Медианные значения за период:
    Общие ожидания: 24 714
    IPC: 19 427
    IO: 5 015
    LWLock: 135
    Timeout: 146

  • Максимумы:
    Общие ожидания: 35 543
    IPC: 27 688
    IO: 6 937
    LWLock: 576
    Timeout: 341

  • Тренд ожиданий устойчиво растет (угол +43.3, R²=0.89).

Память и буферный кэш

  • shared_buffers = 4 GB

  • Shared buffers hit ratio:
    Минимум: 49.6%
    Медиана: 55.6%
    Максимум: 66.8%
    ALARM: критически низкое значение – более половины обращений к данным уходят на диск.

  • Корреляция операционной скорости с чтениями: R=0.801, R²=0.64 – рост скорости зависит от дисковых чтений.

  • Корреляция с записями: R=0.911, R²=0.83 – скорость еще сильнее ограничена записью на диск.

  • Dirty pages: размер растет к концу периода до ~3.1 MB (не превышает порогов dirty_ratio), но наблюдаются значимые корреляции:
    с procs b (R=0.713, R²=0.51) – процессы блокируются в I/O
    с sy (R=0.799, R²=0.64) – нагрузка на ядро при управлении памятью

Дисковая подсистема (I/O)

  • IO ожидания практически полностью объясняются объемом чтений (bi): R²=0.86.

  • Связь с записями (bo) слабее (R²=0.57), но тоже значима.

  • Грязные страницы коррелируют с procs b (R=0.713) – подтверждение I/O-узкого места.

  • Операционная скорость сильно зависит от записи – возможно, узким местом является диск под WAL или данными.

CPU и системные вызовы

  • Средняя загрузка CPU: us 27%, sy 6%, wa 16%, id 50%.

  • Корреляции переключений контекста (cs):
    с in (прерывания) – R=0.984 (закономерно)
    с sy – R=0.793
    с us – R=0.699

  • IPC и Timeout ожидания тесно связаны с sy, что указывает на высокие системные издержки.

Блокировки и ожидания LWLock

  • Приоритет LWLock – 0.4048.

  • Сильная корреляция с sy (R=0.936) – конкуренция за легковесные блокировки требует времени ядра.

  • Умеренная связь с swap out (R=0.623) – возможное влияние нехватки памяти.

Анализ запросов (queryid)

  • Основной «тяжелый» запрос: select scenario1() (7143487894308847288) – вызывает почти 100% ожиданий IPC, Timeout, LWLock и 68% IO.

  • Второй запрос: select scenario3() (-1879773681171496870) – дает 32% IO ожиданий.

Ключевые проблемы

Проблемы СУБД

  • Крайне низкий hit ratio shared buffers (<60%) – база данных слишком часто читает с диска.

  • Высокая зависимость производительности от дисковой подсистемы, особенно от записи.

  • Доминирование одного запроса (scenario1), который генерирует основную массу всех типов ожиданий.

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

  • LWLock конкуренция – указывает на борьбу за буферный кэш или другие структуры в shared memory.

Проблемы инфраструктуры

  • Резкое падение cpu id при одновременном снижении wa – CPU занят, но не I/O, а пользовательскими/системными задачами.

  • Рост очереди процессов (r) и числа процессов в uninterruptible sleep (b) – нарастает конкуренция за ресурсы.

  • Свободная RAM менее 5% в 100% времени – система постоянно находится в состоянии memory pressure.

  • Корреляции dirty pages с b и sy – признаки проблем с управлением памятью и фоновой записью.

Рекомендации

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

  1. Увеличить shared_buffers до 6–7 GB (с учетом 7.5 GB RAM), оставляя память для ОС и кэша файловой системы.

  2. Оптимизировать запросы scenario1 и scenario3 – проанализировать их планы, добавить индексы, переписать логику.

  3. Увеличить max_parallel_workers_per_gather (с 1 до 2–4), если запросы могут выполняться параллельно.

  4. Настроить контрольные точки: увеличить checkpoint_timeout до 10–15 мин и max_wal_size до 64 GB для сглаживания пиков записи.

  5. Для уменьшения IPC-ожиданий проверить параметры синхронной репликации (synchronous_commit, wal_sync_method); рассмотреть асинхронный режим, если допустимо.

  6. Мониторить и при необходимости увеличить autovacuum_work_mem для ускорения очистки горячих таблиц.

Рекомендации по настройкам операционной системы

  1. Увеличить пороги dirty pages:
    vm.dirty_background_ratio = 10 (с 5)
    vm.dirty_ratio = 20 (с 10)
    Это позволит дольше накапливать записи и сгладить нагрузку на диск.

  2. Настроить vm.vfs_cache_pressure до 100–200 для более активного освобождения кэша inode/dentry.

  3. Рассмотреть увеличение vm.swappiness до 10–20, чтобы при нехватке памяти немного активнее вытеснять редко используемые страницы (но следить за свопом).

  4. Проверить, не упирается ли диск в пропускную способность – при возможности использовать более быстрые накопители (NVMe) или разделить нагрузку по разным физическим дискам.

  5. Увеличить объем RAM – текущий дефицит свободной памяти требует масштабирования.

Заключение

Система работает в условиях высокой нагрузки, вызванной неоптимальным запросом scenario1 и недостаточным кэшированием данных в shared buffers. Низкий hit ratio приводит к интенсивному дисковому I/O, что в сочетании с ограниченной памятью вызывает рост процессорных издержек (системное время, переключения контекста). Наблюдается критическое падение простоя CPU и постоянный дефицит свободной RAM.

Первоочередные действия:

  • Оптимизация/переписывание запроса scenario1.

  • Увеличение shared_buffers.

  • Настройка порогов dirty pages ОС.

В долгосрочной перспективе – апгрейд дисковой подсистемы и добавление оперативной памяти.

Послесловие

Проведенный анализ выявил системную проблему: производительность СУБД в настоящее время ограничена неэффективным кэшированием (низкий shared buffers hit ratio) и высокой нагрузкой на дисковую подсистему, что усугубляется доминированием одного «тяжелого» запроса. Рост системных издержек (переключения контекста, прерывания) на фоне дефицита оперативной памяти сигнализирует о приближении к критическому порогу масштабируемости имеющихся ресурсов.

Реализация предложенных рекомендаций, в первую очередь оптимизация запроса scenario1 и увеличение shared_buffers, позволит снизить нагрузку на диск и уменьшить ожидания IPC и LWLock. Настройка параметров виртуальной памяти ОС (dirty_ratio) сгладит пиковые нагрузки записи. Выполнение этих мер должно перевести систему в более стабильное состояние и создать запас производительности для дальнейшего роста.

При сохранении или усилении негативных трендов после оптимизации может потребоваться более глубокая диагностика на уровне архитектуры приложений или рассмотрение вопроса о расширении аппаратных ресурсов (RAM, диски).

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

Почему не стоит ставить max_connections = 1000 просто "на всякий случай"

Серия СУБД PostgreSQL

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

Не кормите призраков. Настройте max_connections адекватно.

Не кормите призраков. Настройте max_connections адекватно.

Предисловие

При настройке PostgreSQL многие администраторы ориентируются на простое правило: «чем выше лимит соединений, тем больше соединений я могу обслужить». Казалось бы, установка max_connections = 1000 — это дальновидный запас на будущее. ⚠️Однако за этим решением скрывается неочевидная плата, которую база данных взимает ежесекундно, даже если большую часть времени вы используете лишь 20 подключений.

Вопреки распространенному мнению, проблема не сводится к «резервированию лишней памяти». В этом материале мы разберем, как статический размер структур ядра (массивы PGPROC, хеш-таблицы блокировок) влияет на алгоритмы планировщика, приводит к деградации кэша процессора и создает фоновую конкуренцию за спинлоки, поэтому работа с расчетом на «толпу» из 1000 процессов замедляет даже простые транзакции и это связано с устройством shared memory.

Теоретическая часть

⚠️При установке `max_connections = 1000` PostgreSQL не выделяет всю память сразу под все 1000 соединений при старте, ‼️но ‼️резервирует системные структуры и ограничения, которые приводят к косвенному увеличению потребления памяти и ресурсов.

ℹ️Фиксированные структуры ядра (выделяются при старте)

При запуске сервера PostgreSQL выделяет:

🔴max_connections — количество слотов для подключений (внутренние структуры `Backend` и `ProcArray`).

🔴max_prepared_transactions— если включены подготовленные транзакции.

🔴max_locks_per_transaction— количество блокировок на транзакцию (умножается на `max_connections` для расчёта общего лимита блокировок).

ℹ️Эти структуры выделяются в shared memory и не освобождаются в течение работы сервера. Их размер зависит от `max_connections` и других параметров.

✅ Итог: Что означает "резервирует память под 1000 соединений"?

ℹ️Не резервируется— 1000 × `work_mem` в оперативной памяти.

⚠️Резервируется— ‼️фиксированные структуры в shared memory‼️ (блокировки, слоты процессов, массивы транзакций).

⚠️Резервируетсясистемные лимиты(дескрипторы, память под метаданные).

Подробности о фиксированных структурах в shared memory.

ℹ️Резервирование памяти под неиспользуемые структуры — это только верхушка айсберга.

⚠️Главная проблема заключается в том, что даже в простое (при 20 активных соединениях из 1000 возможных) алгоритмы внутри PostgreSQL вынуждены работать с расчетом на "толпу" из 1000 конкурирующих процессов. Это создает постоянную фоновую нагрузку на механизмы синхронизации и планировщик.

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

1. Массив состояний процессов (PGPROC array)

ℹ️Этот массив — один из главных источников косвенных издержек (overhead). Он представляет собой список структур, где каждый потенциальный backend (процесс обслуживания соединения) имеет свой слот.

🔴Влияние на планировщик и очереди ожидания: Ядро PostgreSQL и операционная система используют эти структуры для управления видимостью процессов и очередями. Когда активны только 20 процессов, но массив рассчитан на 1000, многие внутренние алгоритмы (например, поиск следующего процесса для получения блокировки или пробуждения) могут просматривать или учитывать "пустые" слоты. Хотя алгоритмы оптимизированы, сам размер управляющих структур влияет на скорость работы хеш-функций и поиска.

🔴Кэш-промахи (CPU Cache Misses): Это наиболее осязаемое влияние. Процессорный кэш (L1/L2/L3) — это очень быстрая, но маленькая память.

‼️Когда структура PGPROC массива раздута до 1000 элементов, она занимает значительно больше места. Даже если активны только 20 процессов, их рабочие структуры данных "размазаны" по большому участку памяти.

Это снижает вероятность того, что данные текущего активного процесса находятся в быстром кэше процессора (Cache Locality), увеличивая количество обращений к медленной оперативной памяти.

2. Массив блокировок (LOCK и PROCLOCK hash tables)

⚠️Это наиболее критичная часть с точки зрения алгоритмической сложности. Эти таблицы представляют собой хеш-таблицы в разделяемой памяти.

🔴Деградация хеш-таблиц (Hash Table Degradation):

ℹ️ Размер этих таблиц изначально рассчитывается исходя из max_connections * max_locks_per_transaction . Это значение используется как max_size при создании хеш-таблицы.

⚠️Проблема: Если фактическое количество блокировок (занятых записей в таблице) значительно меньше расчетного max_size, это не страшно. Но если вы выставили max_size под 1000 соединений, а используете 20, внутренняя структура таблицы (количество "корзин" — buckets) рассчитывается под это большое значение .

ℹ️Механизм замедления: При добавлении новой блокировки (а это происходит постоянно при работе даже 20 соединений) хеш-функция вычисляет индекс "корзины". Из-за того, что корзин много, они могут быть почти пустыми, но сам процесс вычисления хеша и перехода по ссылкам происходит в контексте большой таблицы. В сценариях, где таблица блокировок почти пуста (как в нашем случае с 20 соединениями), замедление минимально, но оно есть. ⚠️Главная опасность возникает, когда количество блокировок начинает расти — производительность такой таблицы падает нелинейно.

ℹ️Комментарий в исходном коде: Разработчики PostgreSQL прямо комментируют это в функции ShmemInitHash: эффективность доступа (access efficiency) будет деградировать, если размер таблицы существенно превышен, так как это влияет на размер директории и переполнение корзин (buckets get overfull) .

🔴Конкуренция за спинлоки (Spinlock Contention): Даже если блокировок немного, сам механизм доступа к глобальным структурам данных (разделяемым хеш-таблицам) требует захвата легковесных блокировок (LW Locks) или спинлоков. Когда эти таблицы имеют большой размер, управление ими требует более сложной синхронизации, что увеличивает шансы на то, что два процесса одновременно попытаются обратиться к разным частям одной большой структуры, вызывая микро-задержки .

3. Таблица фиксированных идентификаторов

ℹ️Сюда входят различные слоты: идентификаторы транзакций (XID), идентификаторы команд (Command ID) и другие глобальные счетчики.

🔴Влияние на инфраструктуру ожидания (LWLock и семафоры):

Процессы часто ждут сигналов о завершении действий других процессов (например, записи в WAL). Инфраструктура для этих ожиданий (LWLock Wait and Wake) также завязана на количество потенциальных участников .

ℹ️Пример с WAL (журнал предзаписи): Когда 20 процессов пытаются одновременно записать изменения, они конкурируют за WALInsertLock. Механизмы, управляющие этим (например, NUM_XLOGINSERT_LOCKS), эвристически подбираются под MaxConnections . Если MaxConnections огромен (1000), механизмы синхронизации WAL могут использовать более "тяжелые" алгоритмы, ожидая высокой конкуренции, что добавляет лишние циклы CPU даже при низкой конкуренции.

🔴Пробуждение процессов: Система должна отслеживать, кого разбудить при снятии блокировки или завершении записи. ⚠️Чем больше max_connections, тем сложнее структуры данных, которые необходимо обойти для принятия решения о пробуждении (даже если спит всего 1 процесс).

Послесловие

Разбирая внутренности PostgreSQL, мы столкнулись с удивительным парадоксом: иногда «запас» работает против вас. Массив PGPROC, рассчитанный на тысячу процессов, превращает быстрый процессорный кэш в захламленный склад, а хеш-таблицы блокировок, настроенные на толпу, даже в моменты простоя вынуждают ядро использовать более тяжелые алгоритмы синхронизации.

ℹ️Это тот случай, когда невидимый глазу оверхед накапливается снежным комом. Система тратит такты не на обработку ваших данных, а на управление потенциальной, но несуществующей нагрузкой. Поэтому, настраивая PostgreSQL, стоит помнить: щедрость в отношении лимитов соединений оборачивается скупостью производительности. Оптимальная стратегия — держать max_connections на уровне разумного минимума, достаточного для работы пулера соединений и выполнения фоновых задач, чтобы ядро базы данных не «отвлекалось» на обслуживание фантомных процессов.

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

PG_EXPECTO v.7 : Комплексный статистический анализ ожиданий СУБД PostgreSQL

Серия СУБД PostgreSQL

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

Айсберг ожиданий: опасность не на поверхности.

Айсберг ожиданий: опасность не на поверхности.

Предисловие: Анализ производительности СУБД как статистическая задача

Традиционный подход к диагностике производительности PostgreSQL зачастую опирается на эвристики, «типовые чек‑листы» и интуицию администратора. Администратор видит всплеск ожиданий, находит самый массовый тип события и принимает решение: «увеличить shared_buffers» или «выключить параллельные запросы». Такой метод работает в очевидных случаях, но оказывается бессилен, когда система находится в состоянии сложного баланса между разными механизмами, а первопричина торможения скрыта за вторичными эффектами.

Статистический подход, реализованный в методике pg_expecto, принципиально меняет логику расследования. Вместо субъективного выбора «самого громкого» типа ожиданий во главу угла ставятся количественные критерии, основанные на реальном поведении системы во времени.

Применение корреляционного и регрессионного анализа позволяет решить три критически важные задачи:

  1. Отсечь иллюзорные связи. Тип ожидания может быть многочисленным, но при этом не оказывать системного влияния на рост общей задержки. Статистическая значимость (p‑value) и низкая взвешенная корреляция (ВКО)отфильтровывают такие события, экономя часы бесполезных настроек.

  2. Выявить скрытые доминанты. Нередко тип ожидания, занимающий лишь 10–15% в структуре событий, на поверку оказывается «бутылочным горлышком», с которым жёстко связан общий рост ожиданий. Именно его корректировка даёт максимальный прирост производительности. ВКО как интегральная метрика ранжирует проблемы именно по степени их фактического влияния на нагрузку, а не по частоте появления в логах.

  3. Оценить предсказуемость и устойчивость. Высокий коэффициент детерминации (R²) регрессионной модели говорит о том, что связь между типом ожидания и общей задержкой стабильна и воспроизводима. Это не разовый выброс, а системный паттерн. Низкий R², напротив, предупреждает: даже значимый по корреляции тип ожидания ведёт себя хаотично, и его оптимизация может дать непредсказуемый результат.

В практическом примере, представленном в статье , именно статистический анализ позволил объективно выделить IPC как доминирующий фактор (ВКО = 0,74) и обосновать первоочередность его настройки, несмотря на то что в «сырых» счётчиках событий он мог не бросаться в глаза. Одновременно были отсеяны типы, которые при поверхностном взгляде часто вызывают неоправданное беспокойство (например, Lock или BufferPin).

Таким образом, внедрение статистических методов превращает анализ производительности из искусства субъективных догадок в инженерную дисциплину, опирающуюся на объективные метрики и воспроизводимые выводы. Представленный отчёт — наглядная демонстрация того, как точные расчёты помогают принимать решения об оптимизации с предсказуемым положительным эффектом.

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

1. Назначение и область применения

Методика предназначена для количественной оценки производительности PostgreSQL, выявления узких мест и факторов, вызывающих задержки, на основе статистического анализа временных рядов событий ожидания(wait_event_type). Применяется при нагрузочном тестировании, мониторинге продуктивных систем или постмортем‑анализе инцидентов.

Данная методика позволяет системно подойти к выявлению причин замедления PostgreSQL, опираясь исключительно на статистические свойства собранных метрик, и даёт чёткие критерии для принятия решений об оптимизации.

2. Исходные данные

Для анализа необходимы:

  • временные ряды операционной скорости ;

  • временные ряды суммарного количества ожиданий СУБД ;

  • временные ряды событий ожидания по типам (wait_event_type): BufferPin, Extension, IO, IPC, Lock, LWLock, Timeout .

3. Этапы анализа

Шаг 1. Оценка корреляции с суммарными ожиданиями

  • Вычисляется коэффициент корреляции Пирсона между суммарными количествами ожиданий СУБД и событиями ожидания конкретного типа .

  • Проверка значимости:
    Если p‑value ≥ 0,05 – тип исключается из дальнейшего анализа (связь нестабильна).
    Если значимо – переходим к шагу 2.

Шаг 2. Расчёт взвешенной корреляции ожиданий (ВКО)
ВКО – интегральная метрика, ранжирующая типы ожиданий по степени их влияния на нагрузку. Значение ВКО лежит в пределах [0,1].

Порог отбрасывания: ВКО < 0,01 – влияние пренебрежимо мало, тип игнорируется.
Чем выше ВКО, тем критичнее проблема. Значения, близкие к 1, требуют немедленного анализа.

Шаг 3. Построение регрессионной модели
Для типов ожиданий, прошедших шаги 1 и 2, строится линейная регрессия вида:
Y = a + b·X,
где Y – суммарные ожидания, X – ожидания данного типа.

Оценивается модели .

  • R² ≥ 0,8 — исключительно сильная модель, прогноз надёжен.

  • 0,6 ≤ R² < 0,8 — качественная модель.

  • 0,4 ≤ R² < 0,6 — приемлемая модель.

  • 0,2 ≤ R² < 0,4 — слабая модель.

  • R² < 0,2 — модель непригодна для прогнозирования.

Часть 2- практический пример применения методики комплексного статистического анализа ожиданий СУБД

Ключевые разделы файла статистических данных, сформированный по итогам нагрузочного тестирования СУБД

Анализ результатов с использованием нейросети

ИТОГОВЫЙ ОТЧЕТ ПО АНАЛИЗУ ПРОИЗВОДИТЕЛЬНОСТИ И ОЖИДАНИЙ СУБД

Дата тестирования: 2026-02-12 (14:11 – 16:00)
Объект: PostgreSQL (нагрузочное тестирование)

1. ОБЩИЕ ТРЕНДЫ И КЛЮЧЕВЫЕ НАБЛЮДЕНИЯ

  • Операционная скорость: демонстрирует умеренный рост (угол наклона +38,6).
    Качество модели: хорошее (R² = 0,64). Достоверный, практически полезный тренд.

  • Общие ожидания СУБД: растут опережающими темпами (угол наклона +43,3).
    Качество модели: очень высокое (R² = 0,89). Прогнозная способность высокая, связь сильная.

  • Взаимосвязь скорости и ожиданий:
    Коэффициент детерминации R² = 0,69 — качественная модель.
    Рост ожиданий сопровождается ростом операционной скорости (положительная корреляция).
    Вывод: увеличение нагрузки приводит к соразмерному росту как производительности, так и времени ожидания. Система работает на пределе эффективности, требуется анализ узких мест.

2. ПРИОРИТЕТНЫЙ АНАЛИЗ ТИПОВ ОЖИДАНИЙ (WAIT_EVENT_TYPE)

Критерии отбора:

  • Статистическая значимость корреляции (p < 0,05).

  • Взвешенная корреляция ожиданий (ВКО) ≥ 0,01.

  • Коэффициент детерминации R² ≥ 0,2.

Отсеяны (не влияют или некоррелируют):

  • BufferPin, Extension, Lock — отрицательная/отсутствующая корреляция, дальнейший анализ не требуется.

2.1. КРИТИЧЕСКИЙ ПРИОРИТЕТ (ВКО ≥ 0,2) — НЕМЕДЛЕННЫЙ АНАЛИЗ И ДЕЙСТВИЯ

  • Тип ожидания: IPC (межпроцессное взаимодействие)
    ВКО = 0,74 — критическое значение. Основной фокус расследования.
    Корреляция с общими ожиданиями: очень сильная (R = 0,981, R² = 0,96).
    Модель регрессии: R² = 0,96 — исключительно сильная, прогноз исключительно точный.
    Рекомендации:
    Настройка параллельных запросов (max_parallel_workers_per_gather, max_parallel_workers).
    Оптимизация фоновых процессов (autovacuum, background writer, checkpointer).
    Увеличение shared_buffers для снижения конкуренции.
    Возможно выделение отдельного инстанса под тяжёлые аналитические запросы.

2.2. ВЫСОКИЙ ПРИОРИТЕТ (0,1 ≤ ВКО < 0,2) — ГЛУБОКИЙ АНАЛИЗ И ПЛАНИРОВАНИЕ

  • Тип ожидания: IO (ввод-вывод)
    ВКО = 0,18 — высокое значение.
    Корреляция: сильная (R = 0,867, R² = 0,75). Модель качественная.
    Рекомендации:
    Агрессивная настройка autovacuum для горячих таблиц (снижение порогов, частая очистка).
    Разделение таблиц и индексов по разным табличным пространствам на отдельных дисках.
    Миграция наиболее интенсивно используемых данных на быстрые накопители (NVMe/SSD).

2.3. НИЗКИЙ ПРИОРИТЕТ (0,01 ≤ ВКО < 0,04) — НАБЛЮДЕНИЕ И ДОКУМЕНТИРОВАНИЕ

  • Тип ожидания: LWLock
    ВКО = 0,01 — низкое, статистически значимая корреляция (R = 0,902, R² = 0,81).
    Влияние на общую нагрузку минимально, но модель очень сильная.
    Рекомендации (при ухудшении):
    Обновление PostgreSQL до версий с улучшенными алгоритмами LWLock.
    Выделение специализированных инстансов для разных типов нагрузки.
    Консультация с экспертами по тонкой настройке.

  • Тип ожидания: Timeout
    ВКО = 0,01 — низкое, корреляция очень сильная (R = 0,979, R² = 0,96).
    Текущее влияние незначительно, но высокая предсказуемость.
    Рекомендации (при ухудшении):
    Реорганизация длинных транзакций, уменьшение их количества.
    Внедрение механизмов повторных попыток с экспоненциальной задержкой на стороне приложения.
    Обучение разработчиков работе с асинхронными вызовами.

3. ИТОГОВЫЕ ВЫВОДЫ И ПЛАН ДЕЙСТВИЙ

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

  2. Основной источник проблем — IPC (74% взвешенного влияния). Необходима срочная диагностика и оптимизация механизмов параллелизма и фоновых процессов.

  3. Второй значимый фактор — подсистема ввода-вывода (18% влияния). Требует плановой оптимизации с акцентом на физическое размещение данных и настройку autovacuum.

  4. Остальные типы ожиданий (LWLock, Timeout) в настоящее время не создают критических задержек, но их высокие корреляции сигнализируют о наличии потенциально опасных паттернов. Рекомендуется мониторинг и превентивные архитектурные улучшения.

  5. Типы BufferPin, Extension, Lock не оказывают значимого влияния — фокусироваться на них нецелесообразно.

4. ПЕРВООЧЕРЕДНЫЕ МЕРОПРИЯТИЯ (CHECKLIST)

  • IPC
    Проверить текущие значения max_parallel_workers_per_gather, max_parallel_workers, max_worker_processes.
    Оценить загрузку autovacuum и background writer, настроить их интенсивность.
    Рассмотреть увеличение shared_buffers (при достаточном ОЗУ).

  • IO
    Выявить наиболее «горячие» таблицы и индексы.
    Настроить пороги autovacuum (autovacuum_vacuum_scale_factor, autovacuum_vacuum_threshold).
    При наличии нескольких физических дисков — распределить табличные пространства.

  • Мониторинг
    Установить длительный сбор статистики по ожиданиям IPC и IO.
    Отслеживать динамику ВКО по LWLock и Timeout.

Отчет составлен на основе статистического анализа с применением взвешенной корреляции ожиданий (ВКО), регрессионного анализа и проверки значимости связей.

Послесловие: От эвристики — к измеримой инженерии

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

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

Впервые:

  • Влияние типа ожидания оценивается не изолированно, а в системной связке с общей динамикой задержек;

  • Введена интегральная метрика ВКО (взвешенная корреляция ожиданий), позволяющая объективно ранжировать проблемы по степени их фактического воздействия на нагрузку;

  • Применён жёсткий статистический фильтр, отсекающий случайные и нестабильные корреляции;

  • Качество каждой выявленной связи верифицируется через коэффициент детерминации (R²), что даёт уверенность в воспроизводимости результата.

Практическая ценность методики уже подтверждена в ходе нагрузочного тестирования:

  • Второстепенные и шумовые типы ожиданий (BufferPin, Extension, Lock) отброшены автоматически — без затрат времени на их анализ;

  • Скрытый доминант — IPC — выявлен и обоснован как первоочередная цель оптимизации (ВКО = 0,74), хотя в структуре событий он мог не быть самым массовым;

  • По каждому значимому типу сформулированы конкретные, применимые немедленно рекомендации и контрольный чек-лист.

Таким образом, pg_expecto превращает трудно формализуемое искусство «тонкой настройки PostgreSQL» в воспроизводимый инженерный процесс, где каждое решение опирается на математически обоснованные критерии, а эффект оптимизации становится предсказуемым.

Предложенный подход не заменяет экспертизу администратора, но вооружает её точными инструментами измерения, позволяя фокусировать усилия именно там, где они принесут максимальный результат. Это первый шаг к созданию полноценной предиктивной аналитики производительности PostgreSQL, и уже сегодня он готов к промышленному применению.

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

PG_EXPECTO : Взвешенная корреляция ожиданий (ВКО)

Серия СУБД PostgreSQL

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

ВКО: Компас в мире ожиданий PostgreSQL.

ВКО: Компас в мире ожиданий PostgreSQL.

В мире администрирования PostgreSQL данные об ожиданиях (wait events) являются ключевым источником диагностики производительности. Однако отдельные метрики без аналитической обработки создают лишь информационный шум, не отвечая на главный вопрос: какой тип ожиданий действительно определяет общую нагрузку на систему?

Метод «Взвешенной корреляции ожиданий (ВКО)», реализованный в комплексе PG_EXPECTO, основан на серьёзной теоретической базе. Он сочетает корреляционный анализ для оценки силы связи между типом ожиданий и общей нагрузкой с взвешиванием по значимости, учитывающим долю каждого типа. Без этого фундамента метрика оставалась бы просто числом, а не стратегическим инструментом приоритизации.

Именно теория превращает ВКО в точный компас, который позволяет отделить системные узкие места от фонового шума и сфокусироваться на главной причине проблем — будь то ожидания IO, IPC или блокировок.

В статье рассматривается , как теоретические принципы статистики воплощаются в практический инструмент для анализа производительности PostgreSQL, способный превращать данные в чёткий план действий.

Теоретическая часть

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

Корреля́ция (от лат. correlatio «соотношение»), или корреляцио́нная зави́симость — статистическая взаимосвязь двух или более случайных величин (либо величин, которые можно с некоторой допустимой степенью точности считать таковыми), при этом изменения значений одной или нескольких из этих величин сопутствуют систематическому изменению значений другой или других величин.

Положительная корреляция

Положительная корреляция в таких условиях — это такая связь, при которой увеличение одной переменной связано с увеличением другой переменной.

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

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

Взвешенная корреляция ожиданий (ВКО)

  • Score = Corr(WaitType, Total) * P(WaitType)

  • Corr ∈ [0, 1]: коэффициент корреляции между ожиданиями данного типа wait_event_type ∈ [BufferPin, Extension, IO, IPC, Lock, LWLock, Timeout] и всеми ожиданиями СУБД за выбранный период .

  • P ∈ [0, 1]: доля в процентах(деленная на 100) количества ожиданий данного типа wait_event_type ∈ [BufferPin, Extension, IO, IPC, Lock, LWLock, Timeout] ко всем ожиданиями СУБД за выбранный период .

"Взвешенная корреляция ожиданий (ВКО)" отвечает на вопрос: "Насколько данный тип ожиданий является доминирующим и стабильным фактором, определяющим общую нагрузку ожиданиями в системе?"

Проще говоря, она помогает ранжировать проблемы и отделить системные, хронические узкие места от всплесков или шума.

Ранжирование по важности для анализа

Ранг 5 (Критический) — Score ≥ 0.20

Что это значит: Явное, системное узкое место. Данный тип ожиданий является основным драйвером проблем производительности в системе. Высокая доля и сильная связь с общей нагрузкой.

Характер проблемы: Емкостное (ресурсное) ограничение или масштабная логическая проблема, затрагивающая всю СУБД.

Типовые мероприятия:

  • Немедленный детальный анализ этого конкретного типа ожиданий

  • Оценка загрузки соответствующего ресурса ОС (если это IO — дисковые утилизации и задержки; IPC/LWLock — загрузка CPU, межпроцессное взаимодействие).

  • Анализ топ-запросов по общему времени и времени ожиданий данного типа.

  • Приоритетная настройка/оптимизация: Для IO — настройка work_mem, effective_io_concurrency, проверка индексов; для Lock — анализ долгих транзакций, оптимизация логики приложения.

  • Рассмотрение вопросов масштабирования/апгрейда (более быстрые диски, увеличение RAM, добавление CPU ядер).

Ранг 4 (Высокий) — 0.10 ≤ Score < 0.20

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

Характер проблемы: Локальное емкостное ограничение или широко распространенная логическая проблема.

Типовые мероприятия:

  • Целевой анализ запросов, создающих данный тип ожиданий.

  • Проверка конфигурации СУБД, связанной с этой областью (shared_buffers, max_connections, настройки блокировок и т.д.).

  • Глубокий мониторинг этого типа ожиданий во времени для выявления пиков и их триггеров.

  • Планирование оптимизационных работ (перестройка индексов, рефакторинг проблемных участков кода приложения, настройка пулеров соединений).
    Рассмотрение точечных улучшений инфраструктуры.

Ранг 3 (Средний) — 0.04 ≤ Score < 0.10

Что это значит: Заметная проблема второго плана. Может быть либо важной, но редко проявляющейся, либо частой, но не являющейся основным ограничителем.

Характер проблемы: Периодические всплески или симптом более глубокой проблемы.

Типовые мероприятия:

  • Анализ в связке с другими метриками: Необходимо смотреть, не маскирует ли эта проблема другую (например, высокие LWLock могут быть следствием плохого плана запроса).

  • Сбор дополнительного контекста: В какое время суток проявляется? С какими конкретными операциями (SELECT, UPDATE, VACUUM) связан?

  • Оптимизация "низко висящих фруктов": Проверка очевидных вещей — достаточно ли maintenance_work_mem для AUTOVACUUM, нет ли явных дедлоков.

  • Включение в список для регулярного аудита, но без срочных действий.

Ранг 2 (Низкий) — 0.01 ≤ Score < 0.04

Что это значит: Фоновый шум или нишевая проблема. Не оказывает значительного влияния на общую производительность системы в текущий момент.

Характер проблемы: Узкая проблема, затрагивающая специфичные операции, или стабильный фоновый шум.

Типовые мероприятия:

  • Документирование и наблюдение. Зафиксировать факт наличия ожиданий данного типа.

  • Установка базового уровня (baseline). Это норма для данной системы?

  • Проверить, не является ли это симптомом неправильной настройки мониторинга или сбора статистики.

  • Действия требуются только в случае роста Score или появления связанных с этим алертов (например, таймауты приложений).

Ранг 1 (Минимальный) — 0 < Score < 0.01

Что это значит: Статистический шум. Вклад в общие проблемы производительности пренебрежимо мал.

Характер проблемы: Практически отсутствует.

Типовые мероприятия:

  • Игнорировать в рамках анализа производительности. Не тратить время на расследование.

  • Возможно, стоит проверить корректность вычисления метрик (достаточен ли объем выборки, нет ли ошибок в запросе).

  • Учесть как часть общей картины для полноты отчета, но без выделения отдельного внимания.

Ранжирование следует использовать как фильтр для приоритизации. Даже при среднем ранге (3) проблема может быть критичной для конкретной бизнес-операции.

Практическое применение метрики "Взвешенная корреляция ожиданий (ВКО)"

Имитация нагрузки типа OLAP

Корреляционный анализ ожиданий СУБД при имитации нагрузки типа OLAP в ходе нагрузочного тестирования

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

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

Послесловие

Метрика «Взвешенная корреляция ожиданий (ВКО)», реализованная в комплексе PG_EXPECTO, представляет собой мощный инструмент для системного и объективного анализа производительности PostgreSQL. Её основная ценность заключается не просто в диагностике наличия ожиданий, а в расстановке приоритетов при устранении узких мест.

На практике администратор или разработчик часто сталкивается с десятками различных метрик и типов ожиданий, что может привести к «аналитическому параличу» — попыткам оптимизировать всё сразу без чёткого понимания, что влияет на систему больше всего. ВКО решает эту проблему, отвечая на ключевой вопрос: какой тип ожиданий является основным, стабильным драйвером проблем в данный период времени?

Использование системы рангов (от критического 5 до минимального 1) позволяет:

  1. Мгновенно сфокусироваться на главном источнике проблем (Score ≥ 0.20), игнорируя статистический шум.

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

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

  4. Создавать объективную основу для отчётности, переходя от субъективных ощущений «система тормозит» к конкретным утверждениям: «доминирующим фактором нагрузки являются ожидания типа IO с весом 0.25».

Как показано в примере с имитацией OLAP-нагрузки, метрика наглядно выделяет доминирующие типы ожиданий (например, IO и IPC), предоставляя отправную точку для углублённого анализа: изучения топ-запросов, проверки дисковых подсистем или настройки параметров параллелизма.

Таким образом, ВКО — это не просто ещё один показатель, а стратегический фильтр и компас для специалистов по производительности. Она позволяет превратить разрозненные данные о событиях ожидания в чёткий план действий, экономя время и ресурсы и направляя усилия туда, где они дадут максимальный эффект для устойчивой и предсказуемой работы СУБД PostgreSQL.

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

PG_EXPECTO v.6 : имитация OLTP/OLAP , дополненные чек-листы IO и RAM, статистика vm_dirty и shared_buffers

Серия СУБД PostgreSQL

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

Вся статистика — в фокусе.

Вся статистика — в фокусе.

Тестирование производительности PostgreSQL часто упирается в вопрос: как система поведёт себя под реальной, смешанной нагрузкой? Методы «на глазок» и разрозненные метрики не дают полной картины. PG_EXPECTO v.6 — инструмент, который целенаправленно создаёт реалистичную имитацию OLTP и OLAP-нагрузки, дополняя её структурированными чек-листами по вводу-выводу и памяти, а также ключевой статистикой по vm_dirty и shared_buffers для глубокой диагностики.

Версия 6

Конфигурационный файл нагрузочного тестирования

# НАСТРОЙКИ НАГРУЗОЧНОГО ТЕСТИРОВАНИЯ

# 6.0

# Максимальная нагрузка

finish_load = 20

# Тестовая БД

testdb = default

# testdb = demo

# Тип синтетической нагрузки

load_mode = oltp

#load_mode = olap

# Веса сценариев по умолчанию

scenario1 = 0.7

scenario2 = 0.2

scenario3 = 0.1

# Инициализировать тестовую БД

init_test_db = on

#init_test_db = off

# Размер тестовой БД

# ~200MB

#scale = 20

#~10GB

scale = 685

Тип имитируемой нагрузки определяется значением параметра "load_mode":

  • oltp : Нагрузочное тестирование под синтетической нагрузкой, имитирующей OLTP.

  • olap : Нагрузочное тестирование под синтетической нагрузкой, имитирующей OLAP.

Характерные паттерны операционной скорости и ожиданий СУБД при имитации нагрузки OLTP и OLAP

Корреляция ожиданий СУБД при имитации нагрузки OLTP

Корреляция ожиданий СУБД при имитации нагрузки OLAP

Операционная скорость СУБД при имитации нагрузки OLTP

Операционная скорость СУБД при имитации нагрузки OLAP

Сравнительный чек-лист IO

Сравнительный чек-лист RAM

Отчет по статистике shared_buffers

Исходный файл: postgres.1.1.shared_buffers.report.txt

Время чтения/записи блоков shared_buffers при имитации нагрузки OLTP

Время чтения/записи блоков shared_buffers при имитации нагрузки OLAP

Отчет по статистике vm_dirty*

Исходный файл: linux.5.1.vm_dirty.txt

Объем "грязных страниц кэша ОС" при имитации нагрузки OLTP

Объем "грязных страниц кэша ОС" при имитации нагрузки OLAP

Послесловие

Имитация нагрузки — это лишь первый шаг. Истинная ценность подхода, реализованного в PG_EXPECTO v.6, — в целостной интерпретации результатов. Когда данные с «датчиков» vm_dirty и shared_buffers рассматриваются через призму чек-листов по IO и RAM, вы перестаётся быть пассивным наблюдателем за сбоями. Вы становитесь инженером, который понимает язык своей системы и может проактивно устранять риски, обеспечивая её устойчивость и скорость. Добро пожаловать в эпоху осознанной производительности.

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

Настройки производительности CPU в Linux

Серия СУБД PostgreSQL

Эффективность параметров настройки CPU для PostgreSQL сильно зависит от типа нагрузки: OLTP требует минимальной задержки и эффективной обработки множества коротких операций, а OLAP — максимальной пропускной способности для сложных вычислений.

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

⚙️ Параметры управления частотой и состоянием CPU

  • Управляющий драйвер (governor)
    Для OLTP:
    performance. Фиксация на максимальной частоте снижает задержку каждой транзакции.
    Для OLAP: performance или schedutil. Стабильно высокая частота или интеллектуальное управление от планировщика ядра ускоряют обработку объемных данных.

  • Состояния простоя (C-states)
    Для OLTP:
    Ограничение глубоких состояний (например, processor.max_cstate=1). Снижает латентность при частых переходах от простоя к активности, что критично для отклика транзакций.
    Для OLAP: Менее критично. Можно разрешить более глубокие состояния для энергосбережения, так как запросы длительные и массовые.

🔄 Параметры параллельной обработки и планирования

  • Планировщик задач ядра Linux
    Для OLTP:
    Отключение sched_autogroup_enabled. Предотвращает несправедливое распределение CPU между фоновыми процессами СУБД (например, autovacuum) и обработкой запросов.
    Общая рекомендация: Настройка sched_min_granularity_ns. Увеличение значения может снизить накладные расходы на переключение контекста при высокой конкуренции за CPU.

  • Параметры параллелизма PostgreSQL
    Для OLAP:
    Крайне важны. Увеличение max_parallel_workers_per_gather, max_worker_processes. Позволяют одним аналитическим запросом задействовать несколько ядер, значительно ускоряя выполнение.
    Для OLTP: Обычно не требуют изменений. Короткие транзакции редко используют параллельное выполнение.

🧩 Параметры изоляции и привязки ресурсов

  • Изоляция CPU (cgroups, systemd, isolcpus)
    Для смешанных нагрузок (OLTP+OLAP):
    Выделение отдельных ядер для фоновых процессов PostgreSQL (autovacuum, WAL writer) или для выполнения аналитических запросов. Это предотвращает их вмешательство в обработку критичных транзакций.
    Для чистого OLTP/OLAP: Менее актуально, но может использоваться для тонкой настройки под конкретную задачу.

  • Управление прерываниями (irqbalance, smp_affinity)
    Для обеих нагрузок:
    Привязка сетевых прерываний и прерываний дисковой подсистемы к выделенным ядрам. Освобождает основные ядра для обработки запросов, улучшая предсказуемость производительности.

  • Политики NUMA (numactl, numa_balancing)
    Для больших серверов:
    Отключение numa_balancing и ручная привязка экземпляра PostgreSQL к одному узлу NUMA. Уменьшает задержки при доступе к памяти, что важно для интенсивных нагрузок.

💡 Критически важные смежные настройки PostgreSQL

Производительность CPU тесно связана с корректной настройкой памяти и ввода-вывода в PostgreSQL.

  • Память: shared_buffers (25-40% RAM) и work_mem. Недостаток work_mem приводит к записи временных данных на медленный диск, что создает очередь процессов в состоянии D (b), висящую на iowait, и имитирует проблему с CPU.

  • Ввод-вывод: random_page_cost (понизить для SSD), effective_io_concurrency. Правильные настройки заставляют планировщик чаще выбирать индексные сканы, снижая нагрузку на CPU.

🛠️ Практические шаги для настройки

  1. Определите профиль нагрузки с помощью мониторинга (например, pg_stat_statements).

  2. Начните с настройки PostgreSQL, особенно параметров памяти и autovacuum.

  3. Задайте CPU governor в performance — это безопасно и почти всегда дает положительный эффект.

  4. Для OLAP-нагрузки активируйте и настройте параллельные запросы в PostgreSQL.

  5. Если проблема сохраняется, используйте мониторинг (top, perf, vmstat) для выявления узких мест: высокой очереди (runqueue), iowait или переключений контекста. Только затем тонко настраивайте параметры ядра (C-states, планировщик).

  6. Протестируйте каждое изменение на нерабочем стенде. Используйте нагрузочное тестирование, например, pgbench.

В целом, для OLTP ключевыми являются стабильно высокая частота CPU и минимизация латентности (governor, C-states). Для OLAP — максимальная пропускная способность параллельных вычислений (параметры параллелизма Postgres). Настройка параметров ОС (планировщик, изоляция) становится критичной на высоконагруженных системах или при смешанной нагрузке.

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

Методика настройки dirty_bytes и dirty_background_bytes

Серия СУБД PostgreSQL

📊 Концепция и цели настройки

Параметры vm.dirty_background_bytes и vm.dirty_bytes работают в паре, устанавливая два порога. Первый активирует фоновую запись, а второй вызывает блокирующую запись, останавливающую процессы.

  • vm.dirty_background_bytes: максимальный объем «грязной» памяти в байтах, при достижении которого ядро начинает фоновую запись данных на диск.

  • vm.dirty_bytes: абсолютный лимит в байтах. При его достижении все процессы, генерирующие новые «грязные» данные, будут приостановлены до завершения записи.

Цели настройки:

  • Для интерактивных десктопов/серверов с латентностью: минимизировать задержки, установив низкие пороги для частой записи.

  • Для серверов с высокой пропускной способностью записи : установить высокие пороги, чтобы накапливать большие порции данных для эффективной записи.

  • Предотвращение внезапных блокировок I/O: dirty_bytes должен быть значительно больше dirty_background_bytes, чтобы у фоновых потоков было время на очистку.

ВАЖНО: dirty_background_bytes и dirty_background_ratio (а также dirty_bytes и dirty_ratio) являются взаимоисключающими парами. При установке значения в байтах соответствующий параметр в процентах автоматически обнуляется, и наоборот.

🔍 Фаза 1: Сбор исходных данных и диагностика

Перед настройкой необходимо собрать данные о системе и ее текущем состоянии.

1. Анализ текущих значений и конфигурации ОС:

  • Посмотреть актуальные значения параметров:
    sysctl vm.dirty_background_bytes vm.dirty_bytes vm.dirty_background_ratio vm.dirty_ratio

  • Определить общий объем оперативной памяти (RAM):
    grep MemTotal /proc/meminfo

  • Ключевые метрики:
    wkB/s или MB_wrtn/s — скорость записи.
    %util — загрузка устройства (близко к 100% указывает на насыщение).
    await (в частности, w_await) — среднее время ожидания операции записи (высокое значение указывает на проблемы).

3. Оценка давления на память и ввод-вывод с помощью vmstat:

  • Ключевые метрики для диагностики проблем с dirty pages:
    memory: swpd, free, buff, cache — если free мало, а cache велик, это может указывать на активное использование страниц.
    swap: si, so — ненулевые значения могут указывать на нехватку памяти, влияющую на политику записи.
    cpu: wa — высокий процент времени ожидания ввода-вывода (wa) часто коррелирует с блокировками процессов при достижении лимита dirty_bytes.

🛠️ Фаза 2: Методика расчета значений

Шаг 1: Определение целевого времени сброса данных

Основная идея — связать объем данных со скоростью диска, чтобы контролировать максимальное время, за которое данные могут быть записаны.

  • Рекомендуется, чтобы фоновая запись (dirty_background_bytes) могла завершиться за 100-500 мс. Это предотвращает длительные блокировки при достижении верхнего лимита.

  • Для расчета используйте пиковую скорость записи (write_speed_mb_ps), полученную из iostat.

Шаг 2: Расчет vm.dirty_background_bytes

Формула:
vm.dirty_background_bytes = target_writeback_time_ms * write_speed_mb_ps * 1024 * 1024 / 1000

Пример для SSD (скорость ~200 МБ/с, целевое время 250 мс):
250 мс * 200 МБ/с * 1048576 / 1000 ≈ 52428800 байт (50 МБ)

Это значение можно округлить до 50-60 МБ.

Шаг 3: Расчет vm.dirty_bytes

Верхний лимит должен давать буфер поверх фонового порога.

  • Минимальный множитель: 2x от dirty_background_bytes.

  • Рекомендуемый диапазон: 4x-8x от dirty_background_bytes.

  • Формула:
    vm.dirty_bytes = N * vm.dirty_background_bytes, где N от 4 до 8.

Пример (продолжение):
vm.dirty_bytes = 6 * 50 МБ = 300 МБ (314572800 байт)

⚠️ Типичные проблемы и решения

  • Слишком низкие значения:
    Симптомы
    : высокий %system и cs в vmstat, низкая общая пропускная способность записи.
    Решение: увеличьте dirty_background_bytes (и, соответственно, dirty_bytes), чтобы позволить накапливаться большим пакетам данных.

  • Слишком высокие значения:
    Симптомы
    : длительные пики wa в vmstat при всплесках записи, ощутимые «подвисания» системы.
    Решение: уменьшите оба параметра, особенно dirty_background_bytes, чтобы активировать запись раньше.

  • Активное использование свопа (si/so > 0):
    Проблема может быть не в dirty pages, а в общем дефиците памяти. Рассмотрите возможность увеличения RAM или настройки vm.swappiness.

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

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

Серия СУБД PostgreSQL

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

Настоящее исследование осуществлено с применением инструментария pg_expecto, обеспечивающего строгую методологию репрезентативного нагрузочного тестирования. Данный инструмент позволил провести сравнительный анализ двух дискретных конфигураций СУБД PostgreSQL в контролируемых и идентичных условиях, моделирующих устойчивую OLAP-нагрузку. Ниже представлено краткое изложение методологии эксперимента, включая описание стенда, генерации нагрузочного паттерна и ключевых варьируемых параметров, что обеспечивает полную воспроизводимость и верифицируемость полученных результатов. Основной целью являлась эмпирическая проверка гипотезы о влиянии реконфигурации областей памяти (shared_buffers и work_mem) на комплексные показатели производительности системы.

pg_expecto: где гипотезы встречаются с метриками.

pg_expecto: где гипотезы встречаются с метриками.

Теоретическая часть и рекомендация нейросети

📉 Гипотеза по уменьшению shared_buffers

Для данной OLAP-нагрузки и текущей конфигурации сервера снижение размера shared_buffers с 4 ГБ до 1-2 ГБ, с одновременным увеличением work_mem, приведет к росту общей производительности системы. Основная цель — не просто уменьшить кэш БД, а перенаправить высвободившуюся оперативную память на выполнение операций в памяти и ослабить нагрузку на подсистему ввода-вывода.

Параметры операционной системы

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 30

vm.dirty_background_ratio = 10

vm.vfs_cache_pressure = 100

vm.swappiness = 10

read_ahead_kb = 4096

Нагрузка на СУБД в ходе экспериментов

Эксперимент-1: shared_buffers = 4GB + work_mem=32MB

work_mem

----------

32MB

shared_buffers

----------------

4GB

Эксперимент-2: shared_buffers = 2GB + work_mem=256MB

work_mem

----------

256MB

shared_buffers

----------------

2GB

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

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

Среднее снижение операционной скорости при shared_buffers=2GB(work_mem=256MB) составило 38.38%.

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

Среднее увеличение ожиданий типа IO при shared_buffers=2GB(work_mem=256MB) составило 22.70%.

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

Среднее снижение ожиданий типа IPC при shared_buffers=2GB(work_mem=256MB) составило 4.78%.

Производительность подсистемы IO(IOPS) для файловой системы /data

Среднее снижение IOPS при shared_buffers=2GB(work_mem=256MB) составило 3.29%.

Пропускная способность подсистемы IO(MB/s) для файловой системы /data

Среднее снижение пропускной способности(MB/s) при shared_buffers=2GB(work_mem=256MB) составило 313.74%.

Сводный отчет по влиянию параметров shared_buffers и work_mem на производительность инфраструктуры при OLAP-нагрузке

1. Общие характеристики нагрузки

  • Нагрузка соответствует OLAP-сценарию (аналитические запросы, большие объёмы данных).

  • В обоих экспериментах наблюдался рост нагрузки (Load average увеличился с 5 до 22).

  • Параметры экспериментов:
    Эксперимент-1: shared_buffers = 4GB, work_mem = 32MB
    Эксперимент-2: shared_buffers = 2GB, work_mem = 256MB

2. Влияние на производительность ввода-вывода (I/O)

Эксперимент-1 (4GB / 32MB)

  • Высокий I/O wait (wa): 100% наблюдений с wa > 10%.

  • Корреляция ожиданий IO и записи (bo): высокая (0.6533), система ограничена производительностью записи на диск.

  • Состояние процессов (b): слабая корреляция с ожиданиями IO (0.2611), количество процессов в состоянии непрерываемого сна не возрастает значительно.

  • Отношение прочитанных блоков к изменённым: 177.98, подтверждение OLAP-нагрузки.

Эксперимент-2 (2GB / 256MB)

  • Высокий I/O wait (wa): 97.27% наблюдений с wa > 10%.

  • Корреляция ожиданий IO и записи (bo): высокая (0.6719), система также ограничена записью.

  • Состояние процессов (b): очень высокая корреляция с ожиданиями IO (0.8774), процессы всё чаще переходят в состояние непрерываемого сна (ожидание диска).

  • Отношение прочитанных блоков к изменённым: 268.01, нагрузка ещё более ориентирована на чтение.

Сравнение

  • Уменьшение shared_buffers с 4GB до 2GB привело к усилению корреляции между ожиданием IO и блокированными процессами.

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

3. Влияние на использование оперативной памяти (RAM)

Эксперимент-1 (4GB / 32MB)

  • Свободная RAM: менее 5% в 100% наблюдений.

  • Свопинг (swap in/out): используется незначительно (в 9.01% и 1.8% наблюдений соответственно).

Эксперимент-2 (2GB / 256MB)

  • Свободная RAM: менее 5% в 100% наблюдений.

  • Свопинг: не используется (0% наблюдений).

Сравнение

  • Оба эксперимента показывают критически низкое количество свободной RAM.

  • Свопинг практически отсутствует, что может указывать на эффективное использование файлового кэша ОС.

4. Влияние на эффективность кэширования (Shared buffers)

Эксперимент-1 (4GB / 32MB)

  • Hit Ratio: 55.36% (критически низкий).

  • Корреляция hit/read: очень высокая (0.9725), кэширование связано с большим чтением с диска.

Эксперимент-2 (2GB / 256MB)

  • Hit Ratio: 38.58% (ещё ниже, критически низкий).

  • Корреляция hit/read: очень высокая (0.8698), аналогичная картина.

Сравнение

  • Уменьшение shared_buffers с 4GB до 2GB привело к снижению Hit Ratio на ~16.78%.

  • В обоих случаях кэширование недостаточно эффективно для данной нагрузки.

5. Влияние на загрузку центрального процессора (CPU)

Эксперимент-1 (4GB / 32MB)

  • Корреляция LWLock и user time: очень высокая (0.9775).

  • Корреляция LWLock и system time: очень высокая (0.9092).

  • Очередь процессов (r): превышение числа ядер CPU в 16.22% наблюдений.

  • System time (sy): не превышает 30% (все наблюдения).

Эксперимент-2 (2GB / 256MB)

  • Корреляция LWLock и user time: очень высокая (0.8574).

  • Корреляция LWLock и system time: высокая (0.6629).

  • Очередь процессов (r): превышение числа ядер CPU в 3.64% наблюдений.

  • System time (sy): не превышает 30% (все наблюдения).

Сравнение

  • В Эксперименте-1 выше корреляция LWLock с системным временем, что может указывать на большее количество системных вызовов и переключений контекста.

  • Очередь процессов (r) чаще превышает число ядер CPU в Эксперименте-1, но в обоих случаях это не является критичным.

6. Выводы по влиянию параметров

  • Уменьшение shared_buffers с 4GB до 2GB:
    Привело к снижению Hit Ratio (с 55.36% до 38.58%).
    Усилило корреляцию между ожиданием IO и блокированными процессами.
    Не вызвало существенных изменений в использовании свопинга и свободной RAM.

  • Увеличение work_mem с 32MB до 256MB:
    Не компенсировало снижение эффективности кэширования при уменьшении shared_buffers.
    Не привело к значительным изменениям в поведении CPU и очереди процессов.

  • Общий характер нагрузки (OLAP) подтверждается высоким отношением чтения к записи и сильной зависимостью производительности от операций ввода-вывода.

Сводный отчет по влиянию параметров shared_buffers и work_mem на производительность подсистемы IO диска vdd для OLAP-нагрузки

1. Общая характеристика инфраструктуры и экспериментов

  • Диск данных: vdd (100 ГБ, LVM-том 99 ГБ, точка монтирования /data)

  • Конфигурация сервера:
    8 CPU ядер
    8 ГБ RAM
    Отдельные диски для WAL (/wal) и логов (/log)

  • Параметры сравнения:
    Эксперимент 1: shared_buffers = 4 ГБ, work_mem = 32 МБ
    Эксперимент 2: shared_buffers = 2 ГБ, work_mem = 256 МБ

  • Продолжительность тестов: ≈110 минут каждый

2. Количественные показатели производительности подсистемы IO

2.1. Средние значения по экспериментам

Эксперимент 1 (shared_buffers=4GB, work_mem=32MB):

  • Средняя утилизация диска: 90-94% → 80% (снижение к концу теста)

  • Средний IOPS: ≈3500 операций/сек

  • Средняя пропускная способность: ≈130 МБ/с → 180 МБ/с (рост к концу)

  • Среднее время ожидания чтения: 9-14 мс

  • Среднее время ожидания записи: 6-7 мс

  • Средняя длина очереди: ≈43

  • Средняя загрузка CPU на IO: ≈24%

Эксперимент 2 (shared_buffers=2GB, work_mem=256MB):

  • Средняя утилизация диска: 93-97% (стабильно высокая)

  • Средний IOPS: ≈3400 операций/сек

  • Средняя пропускная способность: ≈139 МБ/с → 95-149 МБ/с (колебания)

  • Среднее время ожидания чтения: 10-19 мс

  • Среднее время ожидания записи: 7-10 мс

  • Средняя длина очереди: ≈33 → 61 (рост)

  • Средняя загрузка CPU на IO: ≈28% → 9% (снижение)

3. Качественные характеристики нагрузки

3.1. Характер ограничения производительности

Эксперимент 1:

  • Тип ограничения: Пропускная способность диска

  • Корреляция скорость-MB/s: Очень высокая (0.8191)

  • Корреляция скорость-IOPS: Слабая (0.4128)

  • Вывод: Производительность определяется объемом передаваемых данных

Эксперимент 2:

  • Тип ограничения: Количество операций ввода-вывода

  • Корреляция скорость-IOPS: Очень высокая (0.9256)

  • Корреляция скорость-MB/s: Слабая (0.1674)

  • Вывод: Нагрузка чувствительна к количеству IO операций

4. Влияние изменения параметров на поведение системы

4.1. Динамика изменения показателей во времени

Эксперимент 1 (shared_buffers=4GB):

  • Утилизация диска снижается с 94% до 80% к концу теста

  • Пропускная способность растет с 132 МБ/с до 180 МБ/с

  • Загрузка CPU на IO снижается с 28% до 18%

  • Стабильные показатели IOPS и времени отклика

Эксперимент 2 (shared_buffers=2GB):

  • Высокая и стабильная утилизация диска (93-97%)

  • Колебания пропускной способности (139 → 95 → 149 МБ/с)

  • Значительный рост длины очереди (33 → 61)

  • Увеличение времени ожидания чтения (10 → 19 мс)

  • Снижение загрузки CPU на IO (28% → 9%)

4.2. Сравнительные изменения при уменьшении shared_buffers и увеличении work_mem

  • Утилизация диска: Повысилась и стабилизировалась на высоком уровне

  • Время отклика: Увеличилось время ожидания операций чтения

  • Длина очереди: Выросла в 1.8 раза к концу теста

  • Загрузка CPU на IO: Снизилась в 3 раза

  • Характер нагрузки: Сместился с пропускной способности на IOPS-ограниченный режим

  • Стабильность пропускной способности: Ухудшилась, появились значительные колебания

5. Выводы о влиянии конфигурации на OLAP-нагрузку

5.1. Конфигурация shared_buffers=4GB, work_mem=32MB:

  • Обеспечивает более предсказуемую пропускную способность

  • Демонстрирует улучшение производительности в ходе теста

  • Оптимальна для операций, требующих последовательного чтения больших объемов данных

  • Меньшая длина очереди и время отклика

5.2. Конфигурация shared_buffers=2GB, work_mem=256MB:

  • Создает более высокую и стабильную нагрузку на диск

  • Приводит к увеличению времени отклика операций

  • Смещает характер нагрузки в сторону большего количества мелких операций

  • Снижает нагрузку на CPU для операций ввода-вывода

  • Увеличивает глубину очереди запросов к диску

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества