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

Postgres DBA

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

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

4

PG_EXPECTO v.7 : методология доказательной оптимизации высоконагруженных инсталляций PostgreSQL

Серия СУБД PostgreSQL

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

Инфраструктурный коллапс: когда шина данных не выдерживает.

Инфраструктурный коллапс: когда шина данных не выдерживает.

Анализ инцидента производительности высоконагруженной СУБД (CPU=200 RAM=1TB).

Введение

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

В данной демонстрации наглядно показано применение инструментария pg_expecto, который позиционируется не только как средство нагрузочного тестирования, но и как эффективный механизм для постмортем-анализа и оптимизации «боевых» инсталляций. Использование pg_expecto позволило не ограничиться констатацией факта падения операционной скорости, а выявить критическую конкуренцию за буферный кэш (LWLock: BufferMapping), изменение паттернов работы расширений СУБД и скрытые проблемы дисковой подсистемы, маскируемые усредненными метриками. Публикация детализирует методологию сравнительного статистического и корреляционного анализа, демонстрируя, как сопоставление эталонного и аварийного периодов функционирования позволяет сформировать научно обоснованные рекомендации по оптимизации как конфигурации СУБД, так и поддерживающей её инфраструктуры.

Инцидент производительности СУБД

Дашборд Zabbix .

Дашборд Zabbix .

Дата и время инцидента: 11/03/2026 16:35

Производительность и ожидания СУБД в период 14:35 - 16:35

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

График изменения операционной скорости

График изменения операционной скорости

Рис.1 - График изменения операционной скорости в отрезке [время инцидента; время инцидента - 2 часа]. Рост производительности сменился снижением.

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

График изменения ожиданий СУБД

График изменения ожиданий СУБД

Рис.2 - График изменения ожиданий СУБД в отрезке [время инцидента; время инцидента - 2 часа]. Рост ожиданий СУБД в течении часа до иницидента.

Производительность и ожидания СУБД в период инцидента производительности СУБД

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

График изменения операционной скорости в ходе инцидента

График изменения операционной скорости в ходе инцидента

Рис.3 - Снижение операционной скорости в ходе инцидента. Коэффициент детерминации = 0.9

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

График изменения ожиданий СУБД в ходе инцидента

График изменения ожиданий СУБД в ходе инцидента

Рис.4 - Рост ожиданий СУБД в ходе инцидента. Коэффициент детерминации = 0.6

1. Сводный сравнительный отчет по производительности СУБД и инфраструктуры 2026-03-11 14:35 - 16:35

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

Объект анализа: СУБД PostgreSQL 15.13 (конфигурация из файла _1.settings.txt) и инфраструктура (vmstat).

Периоды сравнения:

  • Инцидент: 2026-03-11 15:35 — 16:35 (файл _2.postgresql_vmstat.txt). Период, квалифицированный как инцидент производительности.

  • Тест: 2026-03-11 14:35 — 15:35 (файл _2.1.test.postgresql_vmstat.txt). Период, взятый как тестовый отрезок для сравнения.

Аппаратная конфигурация:

  • CPU: 192 ядра (Intel Xeon Platinum 8280L), 4 NUMA-узла.

  • RAM: ~1008 GB.

  • Дисковая подсистема: Тома LVM на отдельных дисках для данных (/data, 56T), WAL (/wal, 1T), резервных копий (/backup, 2.9T) и логов (/log, 100G).

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

  • Ключевое изменение: Основная нагрузка сместилась с Extension в тестовом периоде на LWLock в инциденте. Хотя Extension все еще имеют высокий приоритет, их вклад в общее время ожиданий снизился, в то время как вклад LWLocks остался критически высоким.

  • В инциденте также появились и стали значимыми ожидания типов IO и Lock, которые в тестовом периоде не оказывали влияния. Это говорит о том, что система вошла в фазу комплексной деградации, затронувшей диск и блокировки транзакций.

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

  • Главный сигнал инцидента: Резкое падение cpu_id (простоя CPU) при одновременном падении скорости БД. CPU начинает активно работать, но не на выполнении полезной нагрузки, а на обслуживании простоев (скорее всего, связанных с LWLocks и конкуренцией).

  • В тестовом периоде CPU простаивал больше, очереди на выполнение (r) сокращались — система была сбалансирована.

  • Проблемы с диском (b, wa), наблюдавшиеся в тесте, в инциденте пошли на спад, что подтверждает смещение фокуса проблемы с IO на CPU и блокировки.

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

  • Основное различие в поведении Extension. В инциденте они стали значительно сильнее коррелировать с прерываниями (in), что может указывать на изменение их паттерна работы (например, увеличение частоты вызовов внешних API или обмен по сети).

  • Модель зависимости блокировок (Lock) от очереди на CPU (r) в инциденте стала слабой, хотя связь осталась. Это значит, что в формирование очереди на CPU теперь вносят вклад и другие факторы, прежде всего LWLocks, которые не отслеживаются напрямую vmstat.

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

Усложнение структуры отказов: В инциденте к проблемам с Extension и transactionid (блокировки строк) добавились серьезные проблемы с:

  • Конкуренцией за буферный кэш (LWLock: BufferMapping).

  • Физическими чтениями данных (IO: DataFileRead).

  • Синхронной записью WAL (IO: WALSync).

  • Блокировками версий строк (Lock: tuple).

Концентрация нагрузки: Основные проблемные запросы — прежние, но теперь они создают более сложный и разнообразный профиль ожиданий. Появление новых запросов в топе по IO и Lock говорит о том, что либо начали выполняться новые, тяжелые операции, либо изменился план выполнения старых запросов.

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

1. Критическая конкуренция за буферный кэш (LWLock: BufferMapping): Является основной причиной падения скорости в инциденте. Процессы проводят время в очередях за доступом к страницам в shared_buffers.

2. Деградация работы расширений (Extension): Расширения стали работать иначе, вызывая всплески прерываний и нагружая CPU, что усугубляет общую ситуацию. Главные виновники — запросы -503898190... и -428029360....

3. Рост физических чтений с диска (IO: DataFileRead): Буферный кэш перестал эффективно кэшировать данные, что привело к падению производительности и росту IO-ожиданий.

4. Появление синхронных проблем с WAL (IO: WALSync): Указывает на то, что запись в WAL начала тормозить транзакции, вероятно, из-за исчерпания пропускной способности диска с WAL или из-за конкурентной записи.

5. Расширение спектра блокировок (Lock: tuple): К проблемам с блокировками транзакций (transactionid) добавились блокировки отдельных версий строк (tuple), что говорит о высоком конкурентном доступе к одному и тому же набору данных.

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

1. Неэффективная утилизация CPU: Процессорное время уходит не на полезную работу, а на оверхед (прерывания, ожидания). Это подтверждается падением cpu_id при падении скорости БД.

2. Рост прерываний: Увеличение корреляции Extension с in (прерывания) указывает на возросшую нагрузку на ядро ОС.

3. Косвенные признаки дисковой проблемы: Хотя прямые метрики wa и b улучшились, появление IO: DataFileRead и WALSync в топе ожиданий СУБД говорит о том, что дисковая система перестала справляться с пиковыми нагрузками, даже если это не видно на уровне усредненных метрик vmstat.

4. Острый дефицит свободной памяти: В обоих периодах свободной RAM менее 5% (ALARM). Система постоянно работает на грани нехватки оперативной памяти, что увеличивает вероятность вытеснения страниц и усиливает конкуренцию за буферный кэш. Это фоновый хронический фактор, который, вероятно, и спровоцировал инцидент при изменении паттерна нагрузки.

2. Рекомендации по итогам анализа инцидента производительности СУБД и инфраструктуры 2026-03-11 14:35 - 16:35

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

1. Оптимизировать запросы-лидеры:

Провести детальный разбор планов выполнения для queryid:

  • -5038981907002478858

  • -4280293605113329019

  • -1757223094415174739

  • 7667106468890705260

  • Выявить причины конкуренции за BufferMapping (частое чтение разных страниц) и LockManager.

  • Рассмотреть возможность оптимизации индексов, переписывания запросов для уменьшения числа обращений к буферному кэшу и блокировок.

2. Проанализировать и оптимизировать работу расширений:

  • Определить, какие расширения (из списка shared_preload_libraries) вызывают наибольшие ожидания и прерывания.

  • Проверить конфигурацию расширений (особенно pgpro_stats, pg_wait_sampling, dblink, postgres_fdw).

  • Если расширения выполняют внешние вызовы (через dblink или fdw), оценить сетевые задержки и возможность кэширования результатов.

  • Рассмотреть возможность отключения или замены неэффективных расширений.

3. Настроить параметры памяти для снижения конкуренции:

  • shared_buffers (сейчас 251807 MB ~ 245 GB). Учитывая 1 TB RAM и нехватку свободной памяти, значение уже велико. Возможно, требуется уменьшение для освобождения памяти ОС под кэш файловой системы. Либо наоборот, увеличение не даст эффекта, так как конкуренция за буферы может возрасти. Рекомендуется провести тестирование с значениями 20-25% RAM.

  • work_mem (1 GB) – очень высокое значение. Оно может приводить к быстрому исчерпанию памяти при большом числе сортировок/хешей. Уменьшить до разумных пределов (например, 32-128 MB) и контролировать использование через log_temp_files.

  • maintenance_work_mem (16 GB) – для VACUUM и CREATE INDEX. Можно оставить, но следить за параллельными операциями.

  • effective_cache_size (747230 MB) – завышено, но не критично. Уменьшить до 80-90% от RAM.

4. Снизить нагрузку на WAL и контрольные точки:

  • Проверить, оправдано ли значение synchronous_commit = remote_write. Для особо критичных транзакций можно оставить, для остальных рассмотреть off или local.

  • Увеличить max_wal_size (сейчас 8 GB) для уменьшения частоты контрольных точек. Рекомендуется 16-32 GB, учитывая интенсивность записи.

  • Оптимизировать checkpoint_timeout (15 мин) и checkpoint_completion_target (0.9) для растягивания записи "грязных" страниц.

5. Анализ блокировок:

  • Включить сбор статистики по блокировкам (track_wait_timing и pg_locks).

  • Искать длинные транзакции и неоптимальные уровни изоляции (особенно Serializable, если используется).

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

Рекомендации по оптимизации инфраструктуры

1. Увеличить объем оперативной памяти:

  • Текущая нехватка свободной RAM (<5%) – критический фактор. Добавление памяти (если возможно) или перераспределение ресурсов ВМ даст наибольший эффект, снизив давление на буферный кэш и позволив увеличить shared_buffers или файловый кэш ОС.

2. Оптимизировать дисковую подсистему:

  • Для WAL: Перенести WAL на отдельный высокоскоростной диск (NVMe) с низкой задержкой. Текущий /wal на LVM поверх vdg (вероятно, HDD) не справляется с синхронной записью (WALSync).

  • Для данных: Оценить производительность тома /data (56 ТБ на нескольких дисках). Возможно, требуется увеличение количества дисков в LVM для распараллеливания IO, либо использование более быстрых накопителей.

  • Настроить планировщик ввода-вывода в ОС (например, none для NVMe, deadline или mq-deadline для HDD).

3. Настроить параметры ядра ОС:

  • vm.swappiness: Уменьшить (например, до 10), чтобы избежать лишнего свопирования, хотя свопинг не используется, но параметр влияет на склонность к вытеснению страниц.

  • vm.dirty_ratio / vm.dirty_background_ratio: Уменьшить для контроля фоновой записи и предотвращения накопления грязных страниц.

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

  • Параметры планировщика задач: Убедиться, что процессы PostgreSQL закреплены за ядрами CPU (нужно проверить распределение по NUMA-узлам). На мощной машине с 4 сокетами важно избегать перекосов памяти.

4. Профилирование CPU и прерываний:

  • Использовать perf, mpstat -I для выяснения источника роста прерываний, связанных с расширениями.

  • Проверить драйверы сетевых карт и настройки очередей прерываний (RSS, RPS). Возможно, требуется настройка affinity прерываний для распределения нагрузки.

5. Усилить мониторинг:

  • Настроить оповещения по достижению порогов: свободная память <10%, рост procs b > 1-2, увеличение времени ожидания WALSync.

  • Собирать данные iostat для дисков с данными и WAL для выявления пиков latency.

6. Рассмотреть возможность контейнеризации/виртуализации:

  • Если сервер виртуальный (KVM), проверить, не происходит ли конкуренция с соседними ВМ за дисковые ресурсы. Обратиться к администратору гипервизора.

3. Сводный сравнительный отчет по подсистеме IO 2026-03-11 14:35 - 16:35.

Список дисковых устройств

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

  • vdg — физический диск, используемый для WAL (/wal) и раздела подкачки.

  • vdh, vdi, vdj, vdk — физические диски, объединенные в LVM-том /data для хранения данных СУБД.

Сравнительный анализ граничных значений по дисковым устройствам

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

Устройство vdg (WAL):

  • Тест: Нагрузка на запись (w/s, wMB/s) стабильно низкая. Операции чтения практически отсутствуют. Утилизация устройства (device_util) минимальна (медиана ~5.9%).

  • Инцидент: Резкий рост нагрузки на запись. Медиана w/s выросла с ~373 до ~689, а wMB/s — с ~7.75 до ~16.0. Несмотря на рост, утилизация устройства остается низкой (медиана ~10.2%), что говорит о его высокой производительности и малом влиянии на общую картину.

Устройства данных vdh, vdi, vdj, vdk:

Тест: На всех четырех дисках наблюдается высокая и стабильная смешанная нагрузка. Медианные значения составляют:

  • r/s: ~12 200

  • w/s: ~500

  • Утилизация (device_util): ~87%

  • Глубина очереди (aqu-sz): ~2.0

Инцидент: Нагрузка на диски данных значительно возрастает.

  • r/s: медиана увеличивается до ~13 500.

  • w/s: медиана удваивается, достигая ~1 100.

  • wMB/s: медиана возрастает с ~4.8 до ~10.5.

  • Утилизация остается на критическом уровне (медиана ~90%).

  • Глубина очереди незначительно растет (медиана ~2.5).

Вывод: В период инцидента произошло существенное увеличение нагрузки на диски данных (vdh-vdk), особенно на операции записи (рост в 2 раза). Диск WAL (vdg) также испытал рост нагрузки на запись, но остался далек от насыщения.

Итог по разделу "СРАВНИТЕЛЬНЫЙ СТАТИСТИЧЕСКИЙ АНАЛИЗ КОРРЕЛЯЦИЯ VMSTAT и IOSTAT по дисковым устройствам"

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

Проблемы инфраструктуры по итогам сравнительного анализа

1. Хроническая перегрузка дисков данных: Диски vdh, vdi, vdj, vdk постоянно работают с утилизацией более 80-90% и глубиной очереди более 2, что является критическим состоянием.

2. Усугубление проблемы в период инцидента: На фоне и без того высокой нагрузки произошел скачок операций записи (в 2 раза), что превратило пропускную способность дисков в главное узкое место.

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

4. Рост зависимости от кэша: Увеличение корреляции кэша с дисковыми операциями в период инцидента указывает на то, что система пытается компенсировать недостаток дисковой производительности за счет памяти, но это не решает проблему полностью.

5. Отсутствие запаса пропускной способности: Система данных СУБД уперлась в физический предел скорости чтения/записи дисков.

Рекомендации по инфраструктуре по итогам сравнительного анализа

1. Анализ характера нагрузки: Определить, какие запросы/процессы генерируют столь высокий уровень операций записи (w/s и wMB/s) на дисках данных. Рассмотреть возможность их оптимизации, дедупликации или переноса.

2. Масштабирование дисковой подсистемы:

  • Увеличение количества дисков: Добавить еще физических дисков в LVM-пул /data для распределения нагрузки и увеличения суммарной пропускной способности и IOPS.

  • Апгрейд на более производительные диски: Рассмотреть замену текущих дисков на более скоростные модели (например, NVMe), если текущая конфигурация не позволяет обеспечить требуемую пропускную способность.

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

  • Проанализировать адекватность размера shared_buffers (установлен в 251 ГБ) и work_mem (1 ГБ) для текущей рабочей нагрузки.

  • Проверить эффективность настроек контрольной точки (checkpoint_timeout, max_wal_size), так как рост записи на диски данных может быть связан с сбросом "грязных" страниц на диск.

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

Общий итог

Проведенный сравнительный анализ производительности СУБД PostgreSQL в периоды штатной работы и развития инцидента позволил выявить комплексный характер деградации системы. Установлено, что непосредственной причиной падения операционной скорости стала критическая конкуренция за буферный кэш (LWLock: BufferMapping), усугубленная изменением паттернов работы расширений, ростом физических чтений с диска и появлением синхронных ожиданий записи WAL. Хронический дефицит оперативной памяти и перегрузка дискового массива данных (утилизация более 90%) создали благоприятные условия для развития инцидента, переведя фокус нагрузки с подсистемы ввода-вывода на механизмы блокировок и процессорное время, что подтверждается изменением корреляционных связей между метриками СУБД и инфраструктуры.

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

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

PG_EXPECTO в деле: Сравнение конфигураций PostgreSQL от Тантор и PGPRO

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

Два конфигуратора. Один бенчмарк. 12% разницы.

Два конфигуратора. Один бенчмарк. 12% разницы.

В настоящем исследовании проведен сравнительный анализ эффективности двух подходов к конфигурированию СУБД PostgreSQL 17 — рекомендаций Тантор Лабс и утилиты pgpro_tune. В качестве инструментария использовался диагностический комплекс pg_expecto, позволяющий выполнить статистический анализ производительности и ожиданий СУБД. Эксперимент проводился на идентичной аппаратной конфигурации (8 vCPU, 8 GB RAM) с фиксированной OLTP-нагрузкой. В ходе работы был выполнен анализ операционной скорости, временных рядов, корреляционных связей между метриками СУБД и инфраструктуры, а также распределения ожиданий по типам и запросам. Полученные данные свидетельствуют о том, что конфигурация pgpro_tune обеспечила прирост медианной производительности на 12% при сопоставимом уровне ожиданий. Вместе с тем, в обоих случаях зафиксировано критическое узкое место дисковой подсистемы, выразившееся в доминировании IO-ожиданий (99,9%), при этом 85% всех ожиданий пришлось на единственный запрос. В статье изложены результаты сравнительного анализа и обозначены направления дальнейшей оптимизации.

Входные данные для конфигураторов

  • CPU = 8

  • RAM = 8GB

  • Тип нагрузки = OLTP

  • Платформа = Linux

  • Версия PostgreSQL = 17

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

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

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

Эксперимент-1 (Конфигуратор Тантор Лабс)

  • Дата и время сбора: 2026-03-05 18:09 – 20:31

  • Версия PostgreSQL: 17.5

  • Аппаратное обеспечение: 8 vCPU, 7.5 GB RAM, диски LVM (data – 100GB, wal – 50GB, log – 30GB)

Эксперимент-2 (Конфигуратор PGPRO_TUNE)

  • Дата и время сбора: 2026-03-07 10:24 – 12:46

  • Версия PostgreSQL: 17.5

  • Аппаратное обеспечение: идентично Эксперименту-1

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

Конфигурационные параметры СУБД и VM

Основные различия в настройках PostgreSQL:

  • shared_buffers:
    Тантор: 1779 MB
    PGPRO: 1919 MB

  • effective_cache_size:
    Тантор: 5081 MB
    PGPRO: 3838 MB

  • work_mem:
    Тантор: 35 MB
    PGPRO: 32 MB

  • maintenance_work_mem:
    Тантор: 196 MB
    PGPRO: 479 MB

  • autovacuum_work_mem:
    Тантор: 189 MB
    PGPRO: 239 MB

  • max_connections:
    Тантор: 91
    PGPRO: 239

  • max_wal_size / min_wal_size:
    Тантор: 2021 MB / 1010 MB
    PGPRO: 4 GB / 2 GB

  • bgwriter:
    Тантор: delay = 54 ms, maxpages = 515, multiplier = 7.0
    PGPRO: delay = 20 ms, maxpages = 4000, multiplier = 4.0

  • effective_io_concurrency:
    Тантор: 128
    PGPRO: 200 (комментарий для NVMe)

  • random_page_cost: оба 1.1 (NVMe SSD)

  • jit:
    Тантор: включён
    PGPRO: выключен

  • checkpoint_timeout:
    Тантор: 15 min
    PGPRO: не указан (вероятно, по умолчанию 5 min)

Общий анализ операционной скорости и ожиданий СУБД

Сравнительный анализ граничных значений операционной скорости (SPEED) и ожиданий СУБД (WAITINGS)

Операционная скорость (SPEED):

  • Минимальное значение:
    Тантор: 375 955
    PGPRO: 365 651

  • Медианное значение:
    Тантор: 383 994
    PGPRO: 431 390 (на ~12% выше)

  • Максимальное значение:
    Тантор: 683 866
    PGPRO: 700 651

Ожидания СУБД (WAITINGS):

  • Минимальное значение:
    Тантор: 48 536
    PGPRO: 49 679

  • Медианное значение:
    Тантор: 78 011
    PGPRO: 79 032

  • Максимальное значение:
    Тантор: 226 349
    PGPRO: 240 293

Медианная скорость в эксперименте PGPRO выше на ~12% при незначительно более высоких медианных ожиданиях.
Разброс значений (max–min) в обоих экспериментах сопоставим.

Сравнительный анализ трендов операционной скорости (SPEED) и ожиданий СУБД (WAITINGS)

  • Тренд SPEED (по времени):
    Тантор: R² = 0.77 (хорошее качество), угол наклона +41.33 – модель достоверно описывает рост скорости.
    PGPRO: R² = 0.86 (очень высокое), угол наклона +42.89 – более сильная и прогностичная модель.

  • Тренд WAITINGS (по времени):
    Тантор: R² = 0.87, угол +43.01
    PGPRO: R² = 0.87, угол +43.07 – практически идентичные показатели, рост ожиданий устойчив.

  • Регрессия SPEED по WAITINGS:
    Тантор: R² = 0.97, угол +44.56 – исключительно сильная связь.
    PGPRO: R² = 0.99, угол +44.83 – практически функциональная зависимость.

Вывод: в обоих экспериментах операционная скорость жёстко привязана к объёму ожиданий (вероятно, из-за доминирования IO-ожиданий). PGPRO демонстрирует более высокую детерминированность модели.

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

  • Интегральный приоритет типов ожиданий:
    В обоих экспериментах единственный значимый тип – IO с приоритетом 0.6271.
    Остальные типы (IPC, Lock, LWLock, Timeout) имеют статистически значимые корреляции, но их взвешенная корреляция (ВКО) < 0.01, поэтому они игнорируются.
    BufferPin и Extension – корреляция отсутствует или отрицательная.

  • Качество регрессионной модели для IO:
    Оба эксперимента: R² = 1.00, угол +45.00 – идеальная линейная зависимость общих ожиданий от IO-ожиданий.

Итог по разделу:

Основной источник ожиданий – операции ввода-вывода. Нагрузка полностью IO-ориентирована.

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

Ключевые метрики и их тренды:

  • procs -> r (очередь на выполнение):
    Тантор: R² = 0.74 (хорошая модель), угол +40.74 – негативный тренд, высокая скорость изменения (коэф. 30.21). Требует анализа CPU/планировщика.
    PGPRO: R² = 0.18 (непригодная модель), изменения статистически незначимы – игнорируется.

  • procs -> b (процессы в uninterruptible sleep, ожидание IO):
    Тантор: R² = 0.87, угол +42.95 – очень сильный рост, коэф. 37.23. Сигнал к исследованию дисковой подсистемы.
    PGPRO: R² = 0.87, угол +43.00 – аналогично, коэф. 37.39.

  • cpu -> wa (процент простоя CPU в ожидании IO):
    Тантор: R² = 0.03 – модель бесполезна, тренд отсутствует.
    PGPRO: R² = 0.24 (слабая модель), угол +26.12 – слабый, но положительный тренд. Рекомендовано фоновое наблюдение.

  • cpu -> id (процент полного простоя CPU):
    Тантор: R² = 0.91, угол -43.66 – сильное падение, коэф. 39.74.
    PGPRO: R² = 0.96, угол -44.41 – ещё более выраженное падение, коэф. 42.60.
    Оба эксперимента требуют выяснения причин снижения полезной работы CPU.

Итог по разделу:

  • В эксперименте Тантор дополнительно наблюдается рост очереди процессов на выполнение (procs r), что может указывать на возросшую конкуренцию за CPU или неэффективность планировщика.

  • Главная общая проблема – стремительный рост числа процессов, заблокированных в IO (procs b), и падение idle CPU, что свидетельствует о нарастающем IO-узком месте.

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

Относительные показатели (алармы):

  • us+sy > 80%: 0% в обоих – нагрузка не перегружает CPU вычислениями.

  • r превышение числа ядер CPU: 0% – очередь на выполнение не превышает 8.

  • sy > 30%: 0% – доля системного времени в норме.

  • free RAM < 5%: 100% в обоих экспериментах – свободной оперативной памяти постоянно менее 5%. Потенциальный риск нехватки памяти, хотя свопинг отсутствует.

  • swap in/out: 0% – подкачка не используется.

  • wa > 10%: 100% – CPU постоянно простаивает в ожидании IO более 10% времени.

  • b превышение числа ядер CPU: 100% – количество процессов в состоянии uninterruptible sleep постоянно превышает 8 (ядер CPU).

Корреляционный анализ (ключевые отличия):

  • IO и bi (блоки чтения):
    Тантор: corr = 0.55 (высокая), R² = 0.31 (слабая модель).
    PGPRO: corr = 0.67 (высокая), R² = 0.45 (удовлетворительная). Связь IO с чтениями в PGPRO выражена сильнее и лучше объясняется моделью.

  • IO и bo (блоки записи):
    Оба: corr ~0.85-0.86, R² ~0.72-0.74 – сильная связь, хорошее качество.

  • Shared buffers hit ratio:
    Тантор: мин 96.09%, медиана 96.64%, макс 98.36%
    PGPRO: мин 96.29%, медиана 96.87%, макс 98.56% – у PGPRO hit ratio немного выше.

  • Корреляция скорости с прочитанными блоками:
    Тантор: corr = 0.58 (высокая), R² = 0.34 (слабая) – warning: производительности IO недостаточно.
    PGPRO: связь отсутствует (отрицательная или незначимая).

  • Корреляция hit ratio с прочитанными блоками:
    Тантор: отсутствует.
    PGPRO: corr = -0.73 (очень высокая отрицательная), R² = 0.53 – чем больше чтений с диска, тем ниже hit ratio (логичная обратная связь). В PGPRO кэширование работает предсказуемо.

  • Корреляция записанных блоков с bo:
    Тантор: corr = 0.88, R² = 0.77 (хорошая)
    PGPRO: corr = 0.90, R² = 0.80 (очень высокая) – сильная связь, указывает на необходимость настройки контрольных точек и bgwriter.

  • Корреляция dirty pages с b (процессы в uninterruptible sleep):
    Оба: corr ~0.99, R² ~0.98-0.99 – ALARM: размер грязных страниц практически линейно связан с блокировкой процессов в IO. Подтверждение системного IO bottleneck.

  • Корреляция dirty pages с bo:
    Оба: corr ~0.86-0.89, R² ~0.74-0.79 – ALARM: механизм обратной записи не успевает за генерацией dirty pages.

  • Корреляция dirty pages с sy (системное время):
    Оба: corr ~0.94-0.98, R² ~0.88-0.95 – ALARM: высокие накладные расходы ядра на управление памятью и IO.

Индекс приоритета корреляции (CPI):
В обоих экспериментах лидируют одни и те же пары: cs-in, cs-us, dirty-b, cs-sy, dirty-sy, dirty-bo. Значения CPI очень близки.

Итог по разделу:

  • PGPRO демонстрирует более предсказуемую работу кэша (отрицательная корреляция hit с чтениями) и чуть лучший hit ratio.

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

  • Оба эксперимента страдают от тяжёлого IO-узкого места, подтверждённого множеством корреляций с dirty pages, b, wa и высокими накладными расходами ядра.

4. СРАВНЕНИЕ ДИАГРАММ ПАРЕТО ПО WAIT_EVENT_TYPE И QUERYID

  • Распределение по типам ожиданий:
    Тантор: IO – 99.84% (DataFileRead)
    PGPRO: IO – 99.94% (DataFileRead)
    Практически все ожидания приходятся на чтение файлов данных.

  • Топ запрос по ожиданиям IO:
    Тантор: queryid 8275902800498673318 (select scenario1()), calls = 16 816 525, waitings = 12 059 950 (85.04% от всех IO-ожиданий).
    PGPRO: queryid -1679588366130117659 (select scenario1()), calls = 16 583 534, waitings = 12 249 974 (85.21% от всех IO-ожиданий).
    В обоих случаях основной вклад вносит один и тот же запрос – вызов функции scenario1().

Список SQL-выражений идентичен:
select scenario1(), select scenario2(), select scenario3(). В Тантор дополнительно присутствует служебный запрос к pg_class.

Итог по разделу:

Нагрузка полностью определяется выполнением трёх сценариев, причём сценарий 1 генерирует более 85% всех IO-ожиданий. Целевая оптимизация должна быть направлена на этот запрос.

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

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

  • Доминирует тип IO, событие DataFileRead.

  • Медианные ожидания: Тантор – 78 011, PGPRO – 79 032 (практически одинаково).

  • Максимальные ожидания: Тантор – 226 349, PGPRO – 240 293 (немного выше у PGPRO, но и скорость выше).

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

  • Shared buffers hit ratio: у PGPRO выше на ~0.2–0.3% (медиана 96.87% против 96.64%).

  • Свободная RAM: в обоих экспериментах постоянно <5% – тревожный сигнал, но свопинг отсутствует. Возможно, это норма для выделенного сервера БД, где почти вся память занята кэшем.

  • Корреляция hit с чтениями: в PGPRO сильная отрицательная (логично), в Тантор – отсутствует. Это может указывать на менее эффективное использование кэша в Тантор или на особенности сбора статистики.

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

  • Корреляция IO с bi/bo: сильная в обоих случаях, особенно с bo (запись). PGPRO немного лидирует по силе связи.

  • Корреляция dirty pages с b и bo: очень сильная в обоих – явный признак того, что система не справляется с записью грязных страниц, процессы блокируются.

  • wa > 10% в 100% времени – подтверждение постоянной высокой нагрузки на диск.

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

  • Корреляции cs с in, us, sy: очень высокие (R² > 0.95) в обоих экспериментах. Это нормально для многозадачной системы.

  • В Тантор выше корреляция cs с sy (0.977 против 0.943), что может говорить о большем времени, тратимом ядром на переключение контекста.

  • Падение idle CPU – закономерное следствие роста ожиданий.

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

  • Незначимы в обоих экспериментах (ВКО < 0.01). Блокировки не являются проблемой.

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

  • Главный потребитель – select scenario1() (около 85% всех IO-ожиданий). Именно его необходимо оптимизировать (индексы, переписывание, увеличение кэша).

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

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

  1. Критическая зависимость от IO: 99.9% ожиданий – DataFileRead. Скорость работы прямо пропорциональна объёму IO.

  2. Неэффективный запрос: scenario1() генерирует 85% всех ожиданий. Требуется анализ плана выполнения и оптимизация.

  3. Hit ratio высок, но не идеален (96–98%). Возможно, часть данных не помещается в shared_buffers.

  4. В Тантор дополнительно: операционная скорость коррелирует с чтениями с диска, что может означать недостаточный размер кэша или неоптимальное использование индексов.

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

  1. Системный IO bottleneck:
    Процессы массово блокируются в состоянии uninterruptible sleep (b >> ядер CPU в 100% времени).
    Высокий процент wa (всегда >10%).
    Размер dirty pages сильно коррелирует с b и bo – фоновые записи не успевают, процессы вынуждены ждать.

  2. Высокие накладные расходы ядра: сильная корреляция dirty pages с sy (системное время) указывает на затраты CPU на управление памятью/IO.

  3. Малый объём свободной RAM (<5%) – хотя свопинг не используется, это может приводить к вытеснению полезных страниц и дополнительным чтениям с диска.

Итоговый анализ влияния выбора конфигуратора на базовую производительность СУБД и инфраструктуры

Сходства:

  • Оба эксперимента проведены на идентичном оборудовании с одинаковой тестовой нагрузкой (три сценария).

  • Основной источник проблем – IO-подсистема, не справляющаяся с объёмом записи и чтения.

  • Интегральный приоритет ожиданий (тип IO) и распределение по запросам практически идентичны.

Различия в производительности и эффективности:

  • Медианная скорость: PGPRO показал на 12% более высокую операционную скорость (431 390 против 383 994) при практически тех же медианных ожиданиях.

  • Качество кэширования:
    Hit ratio в PGPRO чуть выше.
    В PGPRO присутствует логичная отрицательная корреляция hit ratio с объёмом чтений с диска, что говорит о предсказуемой работе кэша. В Тантор эта связь отсутствует, что может указывать на менее эффективное использование shared_buffers или на другие факторы (например, включённый JIT).

  • Регрессионные модели: в PGPRO модели SPEED по времени и SPEED по WAITINGS имеют более высокие R², т.е. поведение более детерминировано.

  • Тренды vmstat: в Тантор обнаружен значимый рост очереди процессов на выполнение (procs r), что может быть следствием дополнительных накладных расходов (например, от JIT или менее агрессивного bgwriter). В PGPRO этот показатель стабилен.

  • Настройки bgwriter и контрольных точек: в PGPRO более агрессивный фоновый писатель (меньше delay, больше maxpages) и больший max_wal_size, что способствует более плавной записи и, возможно, снижает пиковые нагрузки. Это подтверждается чуть более сильной корреляцией записанных блоков с bo и лучшей моделью.

Вывод:


Конфигуратор PGPRO_TUNE обеспечил более высокую медианную производительность и лучшее использование буферного кэша при той же нагрузке. Его настройки (увеличенный shared_buffers, более агрессивный bgwriter, отключение JIT, больший max_wal_size) оказались эффективнее для данного сценария.

Тем не менее, фундаментальная проблема – недостаточная производительность дисковой подсистемы – остаётся нерешённой и требует либо модернизации hardware (более быстрые диски, NVMe), либо глубокой оптимизации запроса scenario1() для снижения объёма чтения с диска. Рекомендуется в первую очередь исследовать план выполнения проблемного запроса и рассмотреть возможность увеличения индексов или партиционирования.

Послесловие

Проведенное исследование подтвердило, что выбор конфигуратора СУБД оказывает статистически значимое влияние на операционную скорость PostgreSQL 17 в условиях OLTP-нагрузки: применение pgpro_tune обеспечило прирост медианной производительности на 12% по сравнению с рекомендациями Тантор Лабс. При этом в обоих экспериментах зафиксировано критическое узкое место дисковой подсистемы, о чем свидетельствуют доминирование IO-ожиданий (99,9%), устойчивый рост числа процессов в состоянии uninterruptible sleep и высокие корреляции между объемом «грязных» страниц и блокировками процессов. Выявлено, что 85% всех ожиданий приходится на единственный запрос (scenario1), что делает его оптимизацию первоочередной задачей. Полученные результаты могут служить основой для выработки рекомендаций по настройке PostgreSQL и модернизации инфраструктуры с целью устранения выявленных ограничений.

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

Проблема использования конфигураторов типа «Тантор Лабс» и pgpro_tune

Серия СУБД PostgreSQL

Нижеследующий материал полностью подготовлен нейросетью.

Проблема использования конфигураторов типа «Тантор Лабс» и pgpro_tune

В современном мире администрирования баз данных всё большую популярность приобретают автоматические конфигураторы — инструменты, которые обещают сгенерировать оптимальный набор параметров СУБД на основе минимальных входных данных: объёма оперативной памяти, количества ядер процессора, предполагаемого типа нагрузки и версии PostgreSQL. «Тантор Лабс», pgpro_tune, PgTune и подобные решения стали незаменимыми помощниками для быстрого старта. Однако, как показывает практика, доверять таким конфигураторам безоговорочно нельзя. Они задают лишь отправную точку, но не гарантируют эффективной работы под реальной нагрузкой. Недавнее сравнительное тестирование, проведённое с участием инструмента pg_expecto и нейросети DeepSeek, наглядно продемонстрировало ограничения подобных генераторов и риски, связанные с их использованием.

В эксперименте участвовала система с 8 ядрами CPU и 8 ГБ RAM под управлением PostgreSQL 17. Исходная конфигурация была подготовлена конфигуратором «Тантор Лабс» и содержала, на первый взгляд, разумные значения: shared_buffers = 1779 МБ, max_wal_size = 2021 МБ, checkpoint_timeout = 15 мин и ряд других параметров. Однако при нагрузочном тестировании по сценарию OLTP система сразу же попала в состояние «серьёзного кризиса производительности». Наблюдалась постоянная нехватка оперативной памяти, более 10% времени процессор простаивал в ожидании ввода-вывода (iowait), а количество процессов в состоянии uninterruptible sleep (b) превышало число ядер CPU. Медианная скорость выполнения транзакций составляла около 384 тысяч операций в минуту, а ожидания ввода-вывода достигали 226 тысяч. Основным источником проблем оказался один и тот же запрос scenario1, генерировавший 85% всех событий ожидания DataFileRead.

Почему же конфигуратор, зная объём памяти и тип нагрузки, не смог предотвратить этот кризис? Ответ кроется в самой природе таких инструментов. Они оперируют усреднёнными шаблонами и эвристиками, основанными на общих рекомендациях из документации и типовых профилях нагрузки. Например, shared_buffers обычно устанавливают в 20–25% от RAM, но конкретное значение зависит от множества факторов: характера запросов, размера рабочих наборов данных, активности записи. В данном случае 1779 МБ оказалось недостаточно для кэширования часто используемых данных, что и привело к постоянным обращениям к диску. Конфигуратор не мог предвидеть, что конкретный запрос будет потреблять огромное количество операций ввода-вывода, и что даже такой объём shared_buffers не спасёт от дефицита памяти. Кроме того, выбранные параметры контрольных точек (checkpoint_timeout = 15 мин, max_wal_size = 2 ГБ) оказались слишком агрессивными для реальной интенсивности записи, вызывая частые сбросы грязных страниц и пиковые нагрузки на диск.

После анализа ситуации с помощью pg_expecto и DeepSeek были предложены изменения, которые увеличили медианную скорость на 40,6%: shared_buffers подняли до 3 ГБ, max_wal_size — до 5 ГБ, checkpoint_timeout — до 30 минут, а также скорректировали параметры bgwriter и vm.dirty_*. Эти изменения сгладили пики записи, улучшили попадание в кэш (hit ratio вырос с 96,64% до 96,95%), но принципиально не решили проблему: дефицит памяти остался (доступная RAM упала с 4,9 до 3,5 ГБ), iowait и очередь заблокированных процессов сохранились на прежнем уровне, а запрос-виновник по-прежнему генерировал 85% всех ожиданий. То есть даже оптимизированная конфигурация не смогла устранить корневую причину, которая лежит за пределами настроек СУБД — в логике конкретного запроса и аппаратных ограничениях.

Этот случай высвечивает фундаментальные ограничения конфигураторов:

  1. Отсутствие учёта реальной рабочей нагрузки. Конфигуратор не знает, какие запросы будут выполняться, как они используют индексы, какие объёмы данных сканируются. Он оперирует обобщёнными типами (OLTP, OLAP), но внутри одного типа может быть огромное разнообразие паттернов доступа.

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

  3. Игнорирование взаимодействия с операционной системой. Конфигураторы редко учитывают настройки ядра Linux (vm.dirty_ratio, dirty_background_ratio и т.п.), хотя они критически влияют на производительность ввода-вывода. В эксперименте именно корректировка этих параметров дала часть прироста.

  4. Невозможность выявить проблемные запросы. Ни один конфигуратор не проанализирует, что конкретный запрос scenario1 потребляет 85% ресурсов. Это задача мониторинга и профилирования, которые должны проводиться отдельно.

  5. Отсутствие итеративности. Конфигуратор выдаёт готовый файл, но не предлагает цикл «измерение-настройка-измерение», который необходим для тонкой подстройки под конкретное железо и нагрузку.

Аналогичные претензии можно предъявить и к pgpro_tune, популярному инструменту от Postgres Professional. Он также генерирует конфигурацию на основе анкеты, но не учитывает многие тонкости: например, не анализирует статистику по индексам, не видит реальные очереди ожидания, не предлагает вариантов для разных подсистем хранения (HDD vs SSD). В результате пользователь получает «среднюю температуру по больнице», которая может быть далека от идеала.

Вывод из проведённого эксперимента очевиден: конфигураторы полезны как стартовая площадка, но полагаться только на них при построении высоконагруженных систем опасно. Они не заменяют экспертного анализа, нагрузочного тестирования и постоянного мониторинга. Необходимо использовать инструменты, подобные pg_expecto, которые позволяют проводить корреляционный анализ метрик СУБД и ОС, выявлять узкие места, итеративно менять параметры и оценивать эффект. Только такой подход способен адаптировать систему к реальной нагрузке и, как в этом примере, дать прирост в 40% без замены оборудования. В ближайших экспериментах планируется сравнить эффективность различных конфигураторов, включая pgpro_tune, чтобы на практике показать, насколько их рекомендации соответствуют реальности и какие дополнительные усилия требуются для достижения максимальной производительности.

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

Сравнительный анализ оптимизации PostgreSQL 17: от конфигуратора «Тантор Лабс» до калибровки с помощью PG_EXPECTO и DeepSeek

Серия СУБД PostgreSQL

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

pg_expecto и DeepSeek в деле: практический пример анализа и ускорения PostgreSQL

+40% к скорости. Без апгрейда железа.

+40% к скорости. Без апгрейда железа.

В статье представлен практический кейс оптимизации PostgreSQL 17 на сервере с 8 ядрами CPU и 8 ГБ RAM. Исходная конфигурация, сгенерированная конфигуратором «Тантор Лабс», при нагрузочном тестировании продемонстрировала серьёзный кризис производительности из-за дефицита памяти и перегрузки дисковой подсистемы. С помощью инструмента pg_expecto и нейросети DeepSeek был проведён всесторонний анализ, выявлены узкие места и выполнена тонкая настройка параметров СУБД и ОС. Результат — прирост операционной скорости на 40% без модернизации оборудования. В материале — детали эксперимента, сравнение конфигураций и выводы о дальнейших шагах.

Задача

Проанализировать и оптимизировать конфигурацию СУБД подготовленную с помощью инструмента "Конфигуратор критически важных параметров производительности PostgreSQL от компании «Тантор Лабс»"

Входные данные для конфигуратора

CPU = 8

RAM = 8GB

Тип нагрузки = OLTP

Платформа = Linux

Версия PostgreSQL = 17

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

Производительность СУБД с базовыми параметрами

График изменения операционной скорости в ходе нагрузочного тестирования с базовыми параметрами подготовленными с помощью конфигуратора "Тантор Лабс"

График изменения операционной скорости в ходе нагрузочного тестирования с базовыми параметрами подготовленными с помощью конфигуратора "Тантор Лабс"

Формирование отчета по итогам нагрузочного тестирования

cd /postgres/pg_expecto/sh/performance_reports

./load_test_report.sh

Входные файлы, используемые для анализа с помощью нейросети

  • _1.settings.txt: НАСТРОЙКИ СУБД и VM

  • _2.postgresql_vmstat.txt: КОМПЛЕКСНЫЙ КОРРЕЛЯЦИОННЫЙ АНАЛИЗ СУБД и VMSTAT

  • _3.1.prompt.txt: промпт для нейросети DeepSeek

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

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

  • Увеличить shared_buffers (до 2–2.5 GB, учитывая 7.5 GB RAM), чтобы больше данных помещалось в кэш.

  • Увеличить max_wal_size (например, до 4–5 GB), чтобы сгладить пики записи.

  • Увеличить checkpoint_timeout (до 20–30 мин) .

  • bgwriter_delay – увеличить с 54 мс до 100 мс.

  • bgwriter_lru_maxpages – увеличить с 515 до 1000.

  • bgwriter_lru_multiplier – рекомендуется снизить с 7.0 до 4.0–5.0.

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

  • Уменьшить vm.dirty_background_ratio до 2–3% (сейчас 10%).

  • Уменьшить vm.dirty_ratio до 10–15% (сейчас 30%).

  • Уменьшить vm.dirty_writeback_centisecs до 200–300 (сейчас 500) для более частого пробуждения flusher-нитей

...

Заключение

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

Критические точки:

  • Постоянная нехватка RAM.

  • Iowait >10% и блокировки процессов (b) > числа ядер CPU.

  • Неэффективная работа механизмов dirty page writeback на уровне ОС.

Результат применения рекомендованных изменений

Графики изменения операционной скорости для базовых значений (baseline) и после применения рекомендованных изменений (advice)

Графики изменения операционной скорости для базовых значений (baseline) и после применения рекомендованных изменений (advice)

Подготовленные входные файлы, используемые для анализа с помощью нейросети

  • baseline.settings.txt: БАЗОВЫЕ НАСТРОЙКИ("Тантор Лабс"-pgconfigurator) НАСТРОЙКИ СУБД и VM ( файл _1.settings.txt по результатам нагрузочного тестирования с базовыми настройками)

  • baseline.postgresql_vmstat.txt: БАЗОВЫЕ НАСТРОЙКИ("Тантор Лабс"-pgconfigurator) КОМПЛЕКСНЫЙ КОРРЕЛЯЦИОННЫЙ АНАЛИЗ СУБД и VMSTAT ( файл _2.postgresql_vmstat.txt по результатам нагрузочного тестирования с базовыми настройками)

  • advice.settings.txt: ОПТИМИЗАЦИЯ НАСТРОЕК СУБД и ОС (PG_EXPECTO + DeepSeek) НАСТРОЙКИ СУБД и VM ( файл _1.settings.txt по результатам нагрузочного тестирования с рекомендованными изменениями)

  • advice.postgresql_vmstat.txt: ОПТИМИЗАЦИЯ НАСТРОЕК СУБД и ОС (PG_EXPECTO + DeepSeek) КОМПЛЕКСНЫЙ КОРРЕЛЯЦИОННЫЙ АНАЛИЗ СУБД и VMSTAT ( файл _2.postgresql_vmstat.txt по результатам нагрузочного тестирования с рекомендованными изменениями)

  • advice.txt: ОПТИМИЗАЦИЯ НАСТРОЕК СУБД и ОС (PG_EXPECTO + DeepSeek) (применение рекомендованных изменений)

  • _3.3.prompt.diff.txt (промпт для нейросети DeepSeek )

Сравнительный анализ результатов нагрузочного тестирования подготовленный нейросетью

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

Эксперимент‑1 (базовый) – настройки, сгенерированные «Тантор Лабс» (pgconfigurator).
Период наблюдения: 2026‑03‑05 18:09 – 20:31 (2 ч 22 мин, 143 точки).

Эксперимент‑2 (оптимизированный) – настройки, рекомендованные PG_EXPECTO + DeepSeek.
Период наблюдения: 2026‑03‑06 10:48 – 13:10 (2 ч 22 мин, 143 точки).

Аппаратная платформа (одинакова для обоих экспериментов):

  • CPU: 8 ядер (Intel Xeon Skylake, виртуализация KVM)

  • RAM: 7,5 GB

  • Диски: LVM, отдельные тома для /data (pg_data), /wal, /log

Сравнение конфигурации СУБД и операционной системы

Изменённые параметры PostgreSQL

  • shared_buffers
    Эксперимент‑1: 1779 MB
    Эксперимент‑2: 3 GB

  • max_wal_size
    Эксперимент‑1: 2021 MB
    Эксперимент‑2: 5 GB

  • checkpoint_timeout
    Эксперимент‑1: 15 min
    Эксперимент‑2: 30 min

  • bgwriter_delay
    Эксперимент‑1: 54 ms
    Эксперимент‑2: 100 ms

  • bgwriter_lru_maxpages
    Эксперимент‑1: 515
    Эксперимент‑2: 1000

  • bgwriter_lru_multiplier
    Эксперимент‑1: 7,0
    Эксперимент‑2: 4,0

Изменённые параметры ядра (vm)

  • vm.dirty_background_ratio
    Эксперимент‑1: 10 %
    Эксперимент‑2: 2 %

  • vm.dirty_ratio
    Эксперимент‑1: 30 %
    Эксперимент‑2: 10 %

  • vm.dirty_writeback_centisecs
    Эксперимент‑1: 500
    Эксперимент‑2: 200

Остальные настройки (work_mem, maintenance_work_mem, wal‑уровни, автовакуум, etc.) остались без изменений.

Общий анализ операционной скорости и ожиданий СУБД

Сравнительный анализ граничных значений операционной скорости (SPEED) и ожиданий СУБД (WAITINGS)

SPEED :

  • Эксперимент‑1: минимум 375 955, медиана 383 994, максимум 683 866.

  • Эксперимент‑2: минимум 472 713, медиана 539 761, максимум 749 919.

Медианная скорость выросла на 40,6 %.

WAITINGS :

  • Эксперимент‑1: минимум 48 536, медиана 78 011, максимум 226 349.

  • Эксперимент‑2: минимум 47 168, медиана 76 311, максимум 254 309.

Медианные ожидания снизились на 2,2 %, хотя максимальные выросли – возможно, из‑за более интенсивной нагрузки.

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

  • Тренд SPEED
    Эксперимент‑1: R² = 0,77 (хорошая модель), угол наклона +41,33
    Эксперимент‑2: R² = 0,89 (очень высокая), угол наклона +43,29
    В обоих случаях скорость растёт, во втором эксперименте тренд чуть круче.

  • Тренд WAITINGS
    Эксперимент‑1: R² = 0,87 (очень высокая), угол +43,01
    Эксперимент‑2: R² = 0,86 (очень высокая), угол +42,90
    Ожидания также растут синхронно со скоростью.

  • Регрессия SPEED по WAITINGS
    Эксперимент‑1: R² = 0,97, угол +44,56
    Эксперимент‑2: R² = 0,99, угол +44,84
    Связь исключительно сильная, почти линейная.

1. Сравнительный статистический анализ ожиданий СУБД

В обоих экспериментах доминирующий тип ожиданий – IO:

  • Интегральный приоритет IO = 0,6271.

  • Взвешенная корреляция ожиданий (ВКО) для IO = 1,0 (критическое значение).

  • Остальные типы (IPC, Lock, LWLock, Timeout) имеют статистически значимые корреляции, но ВКО < 0,01 – игнорируются.

Итог по разделу

Основной источник задержек – операции ввода‑вывода. Прочие типы ожиданий не оказывают заметного влияния на общую нагрузку.

2. Сравнительный трендовый анализ производительности vmstat

Ключевые метрики (медианы за период)

  • procs → r (процессы в очереди на выполнение)
    Эксперимент‑1: 3 (диапазон 2–4)
    Эксперимент‑2: 3 (диапазон 2–5)
    Характер тренда: негативный, R² ~0,75 (высокая скорость ухудшения)

  • procs → b (процессы в uninterruptible sleep)
    Эксперимент‑1: 14 (9–40)
    Эксперимент‑2: 14 (9–40)
    Характер тренда: негативный, R² ~0,86 (очень высокая скорость)

  • cpu → wa (процент простоя CPU в ожидании IO)
    Эксперимент‑1: 62 % (58–67)
    Эксперимент‑2: 61 % (54–63)
    Характер тренда: статистически незначим

  • cpu → id (процент полного простоя CPU)
    Эксперимент‑1: 14 % (2–19)
    Эксперимент‑2: 12 % (1–18)
    Характер тренда: негативный, R² ~0,93 (резкое падение idle)

Негативные тренды по очередям выполнения (r) и блокированным процессам (b) сохраняются, процессорное время простоя (id) быстро сокращается.

Итог по разделу

Система испытывает хроническую перегрузку по вводу‑выводу: более 50 % времени wa > 10 %, очередь процессов в состоянии b постоянно превышает количество ядер CPU.

3. Сравнительный статистический анализ ожиданий СУБД и метрик vmstat

Связь IO с чтением (bi) и записью (bo)

  • IO ↔ bi
    Эксперимент‑1: корреляция 0,55, R² = 0,31 (слабая модель)
    Эксперимент‑2: корреляция 0,82, R² = 0,67 (хорошая модель)
    После оптимизации чтение с диска стало гораздо сильнее влиять на IO‑ожидания.

  • IO ↔ bo
    Эксперимент‑1: корреляция 0,85, R² = 0,72 (хорошая)
    Эксперимент‑2: корреляция 0,75, R² = 0,56 (удовлетворительная)
    Влияние записи немного ослабло – возможно, благодаря увеличению max_wal_size и checkpoint_timeout.

Анализ переключений контекста (cs)

  • cs ↔ in (прерывания): корреляция ~0,996, R² = 0,99

  • cs ↔ us (user time): корреляция ~0,99, R² = 0,99

  • cs ↔ sy (system time): корреляция ~0,97, R² ~0,95
    Во всех случаях связь исключительно сильная. Высокая интенсивность переключений контекста и прерываний сохраняется.

Влияние на буферный кэш

  • Shared buffers hit ratio
    Эксперимент‑1: медиана 96,64 % (min 96,09, max 98,36)
    Эксперимент‑2: медиана 96,95 % (min 96,48, max 98,47)
    Небольшое улучшение попаданий в кэш.

  • Скорость ↔ прочитанные блоки
    Эксперимент‑1: корреляция 0,58, R² = 0,34 (слабая)
    Эксперимент‑2: корреляция несущественна
    После увеличения shared_buffers скорость перестала зависеть от объёма чтения с диска.

Грязные страницы (dirty pages)

  • Размер dirty pages (KB): медиана снизилась с 7126 до 6972, максимум с 18146 до 15672.

  • dirty pages ↔ b (процессы в uninterruptible sleep): корреляция ~0,992, R² = 0,98 (чрезвычайно сильная) – проблема сохраняется.

  • dirty pages ↔ bo: корреляция снизилась с 0,86 до 0,79, R² с 0,74 до 0,62 – механизм обратной записи стал немного эффективнее.

  • dirty pages ↔ sy: корреляция ~0,975, R² = 0,95 – высокие накладные расходы ядра на управление памятью.

Доступная память

  • available_mem_mb: медиана упала с 4883 MB до 3528 MB (из‑за увеличения shared_buffers). Доля времени со свободной RAM <5 % по‑прежнему 100 %.

Итог по разделу

Увеличение shared_buffers и настройка контрольных точек позволили улучшить попадания в кэш и немного сгладить пики записи, однако фундаментальные проблемы с памятью (дефицит свободной RAM) и перегрузкой ввода‑вывода (процессы в состоянии b, высокий wa) остаются.

4. Сравнение диаграмм Парето по wait_event_type и queryid

Типы ожиданий (wait_event_type)

  • Эксперимент‑1: IO (DataFileRead) – 14 159 430 событий, 99,84 %

  • Эксперимент‑2: IO (DataFileRead) – 13 790 683 события, 99,94 %
    Абсолютное число событий IO немного снизилось, их доля осталась подавляющей.

Запросы (queryid)

  • Эксперимент‑1: запрос select scenario1() (ID 8275902800498673318) – 85,04 % всех ожиданий.

  • Эксперимент‑2: запрос select scenario1() (ID 6751319641472471819) – 85,03 % всех ожиданий.
    Основным потребителем ресурсов остаётся один и тот же сценарий (scenario1).

Итог по разделу

Узкое место не изменилось – это по‑прежнему чтение данных с диска (DataFileRead), генерируемое запросом scenario1. Оптимизация не затронула логику самого запроса.

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

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

  • IO – единственный значимый тип (ВКО = 1,0).

  • IPC, Lock, LWLock, Timeout – корреляции есть, но вклад в общую нагрузку ничтожен (ВКО < 0,01).

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

  • shared_buffers увеличены с 1,8 GB до 3 GB.

  • hit ratio вырос на 0,3 п.п. (медиана 96,95 %).

  • Доступная память снизилась на ~1,4 GB, дефицит свободной RAM сохраняется (100 % времени <5 %).

  • Грязные страницы: объём немного уменьшился, но их влияние на блокировку процессов (b) осталось критическим.

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

  • Чтение (bi) стало значительно сильнее коррелировать с ожиданиями IO (R² вырос с 0,31 до 0,67).

  • Запись (bo) коррелирует чуть слабее, чем раньше, что может указывать на более плавную запись благодаря увеличенному max_wal_size.

  • Процессы в состоянии b по‑прежнему сильно зависят от объёма грязных страниц (r² = 0,98).

  • Процент времени с wa >10 % – 100 % в обоих экспериментах.

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

  • Переключения контекста (cs) тесно связаны с прерываниями (in) и user/system time – все корреляции >0,97.

  • System time (sy) сильно коррелирует с размером грязных страниц (r² = 0,95) – ядро тратит много ресурсов на управление памятью.

  • Процессорное время простоя (id) продолжает падать (негативный тренд, R² >0,9).

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

  • Корреляции для Locks и LWLocks статистически значимы, но их вес в общей структуре ожиданий ничтожен (ВКО < 0,01).

  • Основная блокировка – ожидание IO, а не внутренние блокировки PostgreSQL.

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

  • Запрос scenario1 генерирует 85 % всех ожиданий (DataFileRead).

  • Остальные запросы (scenario2, scenario3) вносят пренебрежимо малый вклад.

Ключевые проблемы для экспериментов

Эксперимент‑1 («Тантор Лабс»)

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

  • Недостаточный размер shared_buffers (1,8 GB) – низкая эффективность кэширования.

  • Слишком частые контрольные точки (checkpoint_timeout = 15 мин, max_wal_size = 2 GB) – пиковые нагрузки на запись.

  • Агрессивная работа bgwriter (bgwriter_lru_multiplier = 7) могла вызывать лишние сбросы.

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

  • Свободной памяти <5 % в течение всего теста – риск вытеснения страниц.

  • Высокий процент IO‑wait (wa >10 % всегда) и очередь процессов в состоянии b (превышение ядер CPU 100 % времени).

  • Грязные страницы накапливаются до 18 MB, вызывая блокировки процессов.

  • Высокие накладные расходы ядра (sy) из‑за управления памятью.

Эксперимент‑2 (PG_EXPECTO + DeepSeek)

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

  • Основной запрос scenario1 не оптимизирован – по‑прежнему 85 % ожиданий приходится на чтение с диска.

  • Несмотря на увеличение shared_buffers, hit ratio остаётся на уровне 97 %, что недостаточно для полного устранения чтений.

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

  • Дефицит свободной памяти усугубился (доступно ~3,5 GB вместо ~4,9 GB) – плата за увеличение shared_buffers.

  • IO‑wait и блокировки процессов (b) остались на прежнем критическом уровне.

  • Системные вызовы и переключения контекста по‑прежнему крайне высоки.

Итоговый анализ влияния мероприятий

1. Производительность (скорость) выросла на 40 % – это главный положительный эффект.
Увеличение shared_buffers, размера WAL и интервала контрольных точек позволило эффективнее использовать кэш и сгладить пики записи.

2. Нагрузка на ввод‑вывод частично перераспределилась

  • Корреляция IO с чтением (bi) стала сильнее – теперь чтения из файлов данных лучше отражаются в ожиданиях.

  • Корреляция с записью (bo) немного ослабла – запись стала более равномерной.

3. Проблемы операционной системы не устранены

  • Свободная память уменьшилась, и её дефицит сохраняется.

  • Процессы в состоянии b и высокий IO‑wait остались на прежнем уровне.

  • Переключения контекста и нагрузка на ядро не снизились.

4. Запрос‑виновник не оптимизирован
Более 85 % ожиданий по‑прежнему приходятся на select scenario1(). Без изменений в логике запроса или добавления индексов дальнейший рост скорости ограничен.

Общий вывод:

  1. Проведённая оптимизация дала значительный прирост производительности (медианная скорость +40,6 %) за счёт более эффективного использования памяти и сглаживания записи.

  2. Однако инфраструктурные ограничения (нехватка RAM, медленная дисковая подсистема) и неоптимизированный запрос остаются «узкими горлами».

  3. Для дальнейшего улучшения необходимы либо аппаратный апгрейд (больше памяти, более быстрые диски), либо глубокая оптимизация запроса scenario1 (индексы, рефакторинг).

Послесловие

Проведённый эксперимент наглядно демонстрирует, что даже значительный прирост производительности (медианная скорость +40 %) не является пределом, если остаются нерешёнными фундаментальные проблемы — неоптимизированный запрос и аппаратные ограничения. Тандем pg_expecto и DeepSeek позволил не только улучшить конфигурацию, но и точно локализовать корневые причины торможений. Однако поиск эталонной стратегии настройки PostgreSQL продолжается: в ближайшее время планируется серия аналогичных экспериментов, где в качестве отправной точки будут использоваться другие популярные инструменты генерации базовой конфигурации — PgTune, онлайн-калькуляторы от различных вендоров, а также рекомендательные системы на основе машинного обучения. Цель — сравнить их эффективность под нагрузкой и понять, какой подход даёт наилучший «фундамент» для последующей тонкой оптимизации.

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

Методология статистического анализа производительности СУБД: опыт применения pg_expecto v.7 на реальном инциденте

Серия СУБД PostgreSQL

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

Практическое применение методологии статистического анализа производительности СУБД с использованием pg_expecto v.7: разбор инцидента и верификация гипотез

Математика производительности - когда статистика говорит громче слов.

Математика производительности - когда статистика говорит громче слов.

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

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

Задача

  1. Проанализировать причины инцидента производительности СУБД.

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

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

Производительность СУБД - инцидент производительности СУБД

Инцидент производительности СУБД

Ключевые проблемы для "ИНЦИДЕНТ ПРОИЗВОДИТЕЛЬНОСТИ СУБД" и "ТЕСТОВЫЙ ОТРЕЗОК ПРОИЗВОДИТЕЛЬНОСТИ СУБД"

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

  • Критическое доминирование IO-ожиданий
    В обоих периодах основным типом ожидания является IO (интегральный приоритет вырос с 0.6271 в тесте до 0.7789 в инциденте). Корреляция операционной скорости с IO-ожиданиями отрицательная и статистически значимая (−0.786 в инциденте), что означает: рост ожиданий напрямую снижает производительность.

  • Один запрос генерирует основную массу ожиданий
    QueryID -6237913963540934095 вызывает 87% всех IO-ожиданий (в тесте — 87.23%, в инциденте — 87.37%). События: DataFileRead, DataFileWrite, SlruRead. Это указывает на конкретный проблемный запрос с интенсивными операциями чтения/записи данных и обращением к WAL (SlruRead).

  • Запись стала главным узким местом
    В тестовом отрезке операционная скорость почти полностью определялась объёмом записанных блоков (R² = 0.95). В инциденте также сохраняется высокая корреляция скорости с записанными блоками (R² = 0.65), а грязные блоки сильно коррелируют с ожиданием IO (R² = 0.76) и с записью на диск (R² = 0.62). Это говорит о неспособности фоновых процессов своевременно сбрасывать грязные страницы.

  • Рост чтений с диска при высоком hit ratio
    Несмотря на hit ratio shared buffers выше 99%, в инциденте появилась сильная корреляция операционной скорости с прочитанными блоками (R² = 0.73). Это означает, что даже 1% чтений, не попавших в кеш, создаёт непропорционально высокую нагрузку из-за большого объёма данных или неэффективных сканов.

  • Чрезмерное количество подключений
    Параметр max_connections = 3000 при 8 ядрах CPU и 7.5 ГБ RAM создаёт избыточное потребление памяти и увеличивает накладные расходы на переключение контекста. Корреляции cs с us и in, хотя и высокие, имеют пониженный R² в инциденте, что указывает на смешанную природу загрузки.

  • Агрессивные настройки автовакуума
    autovacuum_naptime = 1s, низкие scale_factor, autovacuum_max_workers = 4 могут вызывать частые сканирования и дополнительные IO-операции, усугубляя общую дисковую нагрузку.

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

  • Острейший дефицит оперативной памяти
    Свободная RAM составляет менее 5% на протяжении 100% времени инцидента (медиана свободной памяти — всего 119 МБ при 7.5 ГБ). Это приводит к вытеснению страничного кеша и росту обращений к диску, хотя сам свопинг не используется.

  • Лавинообразный рост процессов в состоянии uninterruptible sleep (procs b)
    Количество процессов, заблокированных в ожидании IO, выросло с медианы 128 в тесте до 175 в инциденте, с сильным трендом (R² = 0.99, угол наклона 44.5). Это прямое следствие неспособности дисковой подсистемы обслуживать запросы.

  • Перегрузка очереди выполнения (procs r)
    Очередь процессов, готовых к выполнению, превышает количество ядер CPU (8) в 103% времени. При этом CPU простаивает в ожидании IO (wa > 10% постоянно). Процессы не могут получить CPU, потому что заблокированы на IO, но планировщик держит их в очереди.

  • Высокий процент времени ожидания IO (wa)
    Процент простоя CPU в ожидании IO превышает 10% весь период инцидента (достигая 33%). Это свидетельствует о том, что дисковая система не успевает обрабатывать поток запросов.

  • Корреляция грязных страниц с ожиданием IO
    В инциденте размер грязных страниц сильно коррелирует с wa (R² = 0.88) и умеренно с bo (R² = 0.52). Это говорит о том, что механизм фоновой записи не справляется с потоком изменений: страницы накапливаются, и backend-процессы вынуждены синхронно сбрасывать их, блокируясь.

  • Недостаточная пропускная способность дисковой подсистемы
    Несмотря на отдельные диски для WAL и данных, система не выдерживает пиковую нагрузку на запись. Виртуальные диски, вероятно, разделяют общую очередь ввода-вывода с другими виртуальными машинами на гипервизоре.

  • Параметры ядра dirty_ могут быть неоптимальны*
    vm.dirty_ratio = 10% (около 750 МБ) — лимит не достигается (реальные dirty pages до 16 МБ), но vm.dirty_expire_centisecs = 3000 (30 секунд) заставляет сбрасывать страницы по таймеру, а диск не успевает. Это приводит к росту wa.

Рекомендации по итогам анализа инцидента

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

Оптимизировать проблемный запрос

  • Провести детальный разбор запроса с queryid -6237913963540934095:

  • Проанализировать план выполнения, выявить операции с полным сканированием таблиц или индексов, приводящие к DataFileRead/Write.

  • Проверить, используются ли индексы, нет ли избыточных сортировок или хеш-соединений, требующих записи во временные файлы.

  • Рассмотреть возможность партиционирования больших таблиц или изменения логики приложения для снижения IO-нагрузки.

  • Снизить количество одновременных подключений
    Уменьшить max_connections до разумного значения (например, 300–500) и использовать пул соединений (PgBouncer) для эффективного распределения нагрузки. Это сократит потребление памяти и уменьшит конкуренцию за ресурсы.

  • Настроить параметры контрольных точек
    Увеличить checkpoint_timeout до 15–30 минут и max_wal_size до 64–96 ГБ, чтобы сгладить пиковые нагрузки на запись. Отслеживать статистику pg_stat_bgwriter — buffers_checkpoint не должен резко превышать buffers_clean.

Отрегулировать фоновую запись

  • Увеличить bgwriter_lru_maxpages до 800–1000, чтобы фоновый писатель успевал сбрасывать больше грязных страниц за цикл.

  • Уменьшить bgwriter_delay до 5–10 мс (оставить как есть, но контролировать эффективность).

  • Увеличить bgwriter_lru_multiplier до 4–6, чтобы более агрессивно предвосхищать потребности.

Настроить автовакуум

  • Увеличить autovacuum_naptime до 5–10 секунд, чтобы снизить частоту запусков.

  • Подобрать scale_factor и threshold под реальную скорость обновления строк (например, autovacuum_vacuum_scale_factor = 0.05, autovacuum_vacuum_threshold = 1000).

  • Ограничить autovacuum_max_workers до 2–3, чтобы они не конкурировали с основной нагрузкой.

  • Оптимизировать кеширование для чтения
    Несмотря на высокий hit ratio, следует проанализировать, какие именно объекты не попадают в кеш. Возможно, увеличение shared_buffers до 5–6 ГБ (если позволит ОС) поможет удержать больше данных, но нужно оставить память для ОС и файлового кеша.

Рекомендации по оптимизации инфраструктуры

  • Увеличить объем оперативной памяти
    Так как текущая загрузка упирается в IO, добавление RAM позволит расширить файловый кеш ОС и, возможно, увеличить shared_buffers, снижая потребность в дисковых операциях. Рекомендуется минимум 16–32 ГБ для такой нагрузки.

Оптимизировать параметры ядра Linux

  • Уменьшить vm.dirty_expire_centisecs до 1500–2000 (15–20 секунд), чтобы страницы сбрасывались быстрее и не накапливались.

  • Увеличить vm.dirty_background_ratio до 10% и vm.dirty_ratio до 20–25%, чтобы дать системе больше времени для фоновой записи и избежать синхронных сбросов, но только после анализа скорости дисков.

  • Проверить планировщик ввода-вывода: для виртуальных дисков рекомендуется none (или noop), для физических SSD — mq-deadline.

  • Установить vm.swappiness = 1 (уже установлено) — оставить, чтобы избежать нежелательного свопирования.

Эти меры помогут стабилизировать производительность и предотвратить дальнейшую деградацию. Первоочередное внимание следует уделить оптимизации проблемного запроса и увеличению оперативной памяти.

Применение рекомендованных изменений СУБД и ОС

Настроить параметры контрольных точек

  • Увеличить checkpoint_timeout до 15–30 минут и max_wal_size до 64–96 ГБ, чтобы сгладить пиковые нагрузки на запись.

Отрегулировать фоновую запись

  • Увеличить bgwriter_lru_maxpages до 800–1000, чтобы фоновый писатель успевал сбрасывать больше грязных страниц за цикл.

  • Уменьшить bgwriter_delay до 5–10 мс (оставить как есть, но контролировать эффективность).

  • Увеличить bgwriter_lru_multiplier до 4–6, чтобы более агрессивно предвосхищать потребности.

Оптимизировать параметры ядра Linux

  • Уменьшить vm.dirty_expire_centisecs до 1500–2000 (15–20 секунд), чтобы страницы сбрасывались быстрее и не накапливались.

  • Увеличить vm.dirty_background_ratio до 10% и vm.dirty_ratio до 20–25%, чтобы дать системе больше времени для фоновой записи и избежать синхронных сбросов, но только после анализа скорости дисков.

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

baseline - Базовые настройки СУБД и ОС. advice - после применения рекомендованных изменений.

baseline - Базовые настройки СУБД и ОС. advice - после применения рекомендованных изменений.

Анализ рекомендаций и примененных изменений настроек СУБД и ОС

Настройки СУБД PostgreSQL

  • checkpoint_timeout увеличен с 5 min до 30 min – для более редких, но менее пиковых контрольных точек.

  • max_wal_size повышен с 32 GB до 64 GB – чтобы контрольные точки могли растягиваться во времени без преждевременного заполнения WAL.

  • bgwriter_lru_maxpages поднят с 400 до 800 – фоновый писатель теперь может сбрасывать больше грязных страниц за цикл.

  • bgwriter_lru_multiplier увеличен с 4 до 6 – более агрессивное предвосхищение потребностей в чистых буферах.

  • bgwriter_delay планировалось уменьшить с 10 ms до 5 ms, но изменение не удалось из-за ограничения (минимальное значение 10 ms).

Настройки ядра Linux (vm)

  • vm.dirty_background_ratio поднят с 5% до 10% – фоновый сброс грязных страниц начинается при большем заполнении памяти.

  • vm.dirty_ratio увеличен с 10% до 20% – принудительная синхронная запись отодвинута, давая больше времени на фоновый сброс.

  • vm.dirty_expire_centisecs уменьшен с 3000 (30 с) до 1500 (15 с) – страницы быстрее признаются устаревшими и подлежат записи.

  • vm.dirty_writeback_centisecs, vm.swappiness и остальные параметры ядра остались без изменений.

Итоговые существенные различия метрик производительности СУБД и инфраструктуры до и после применения рекомендованных настроек

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

  • Медиана незначительно снизилась: с ~1 045 тыс. до ~1 011 тыс. операций (в пределах статистической погрешности).

Общие ожидания (WAITINGS)

  • Медиана немного уменьшилась: с ~746 тыс. до ~734 тыс. (‑1,6%).

Тренды vmstat (качество и скорость изменений)

procs → r (очередь на выполнение):

  • До: R²=0,83, скорость изменения 35,37 (очень высокий негативный тренд).

  • После: R²=0,47 (модель стала хуже), скорость снизилась до 16,16 (умеренный тренд) – положительная динамика, хотя абсолютные значения r выросли (медиана с 10 до 13).

procs → b (ожидание I/O):

  • До: R²=0,98, скорость 43,76 (критический рост).

  • После: R²=0,97, скорость 43,46 (столь же высокая) – проблема сохраняется.

cpu → wa (ожидание I/O): в обоих случаях позитивный тренд (улучшение), но классифицируется как «шум».

Относительные показатели (% времени превышения порогов)

  • r > ядер CPU: вырос с 66,7% до 82,2% – ухудшение (очередь процессов стала чаще превышать количество ядер).

  • wa > 10% и b > ядер CPU: остались на уровне 100% времени – дисковая подсистема по-прежнему перегружена.

  • свободная RAM < 5%: также 100% – память остаётся узким местом.

Грязные страницы (dirty pages)

  • Медиана размера грязных страниц выросла с ~18 МБ до ~30 МБ.

Ключевой запрос

  • По-прежнему один и тот же queryid (-6237913963540934095, select scenario1()) вызывает ~87% всех ожиданий I/O, количество вызовов даже немного увеличилось (с 19,1 M до 19,6 M).

Сравнительный статистический анализ (коэффициенты корреляции и регрессии)

Связь операционной скорости с записанными блоками

  • До: корреляция 0,9856, R²=0,97 (ALARM).

  • После: корреляция 0,9920, R²=0,98 – ещё выше, зависимость от записи на диск осталась критической.

Корреляция dirty pages size с wa (ожидание I/O)

  • До: 0,9695, R²=0,94 (очень сильная).

  • После: 0,8815, R²=0,78 (снизилась, но всё ещё значима) – положительный эффект настроек VM.

Корреляции с bo (блоки, записанные на устройства)

  • IO и bo: была значимая (0,6761, R²=0,46) – после изменений отсутствует.

  • Записанные блоки и bo: была 0,7914 (R²=0,63) – после отсутствует.

  • Грязные блоки и bo: была слабая (0,6186, R²=0,38) – после отсутствует.

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

Корреляции контекстных переключений (cs)

  • cs и sy (system time): R² вырос с 0,78 до 0,89 – ядро стало тратить больше времени на переключения контекста относительно системного времени.

  • cs и us (user time) и cs и in (прерывания) остались на очень высоком уровне (R²>0,95).

Индекс приоритета корреляции (CPI)

  • dirty pages – wa снизился с 0,9518 до 0,7810 – переместился с 4‑го на 6‑е место в рейтинге, что подтверждает ослабление проблемы.

  • IO – bi (чтения) исчез из списка значимых корреляций (был 0,5343).

Анализ эффективности рекомендованных нейросетью настроек и итоговое влияние на производительность СУБД

Положительные эффекты

  • Уменьшилась корреляция между накоплением грязных страниц и простоями CPU в ожидании I/O (wa).

  • Исчезла прямая связь между объёмом записанных блоков PostgreSQL и фактической записью на диск (bo) – контрольные точки и фоновый writer работают более плавно.

  • Тренд роста очереди на выполнение (r) замедлился, хотя абсолютные значения выросли.

Отрицательные/нейтральные аспекты

  • Основная проблема – зависимость производительности от записи на диск – не устранена (корреляция скорости с записанными блоками осталась крайне высокой).

  • Процессы в непрерываемом сне (b) продолжают расти с прежней скоростью, а процент времени с превышением порогов wa и b остаётся 100%.

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

Вывод об эффективности

  • Рекомендации частично достигли цели: сгладили пиковые сбросы грязных страниц и уменьшили негативное влияние накопления dirty pages на ожидания.

  • Однако они не затронули корень проблемы – неэффективный запрос select scenario1(), на который приходится 87% всех ожиданий I/O.

  • Изменения в настройках ОС и СУБД дали локальные улучшения, но не смогли компенсировать недостатки прикладного уровня.

Для дальнейшей оптимизации необходимо:

  • Исследовать и оптимизировать запрос select scenario1() (индексы, переписывание, изменение логики).

  • Рассмотреть возможность аппаратного ускорения дисковой подсистемы (например, размещение WAL на NVMe).

  • Продолжить мониторинг и при необходимости скорректировать bgwriter_delay (если позволит версия) или параметры автоочистки.

Послесловие

Практическое применение методологии статистического анализа на базе pg_expecto v.7 позволило не только идентифицировать критические факторы деградации производительности (доминирование IO-ожиданий, дефицит памяти, неэффективный запрос), но и количественно верифицировать эффект от предложенных изменений. Корреляционно-регрессионный анализ доказал, что настройки параметров ядра и СУБД привели к снижению зависимости между накоплением грязных страниц и простоями CPU, а также к более равномерной записи на диск. Вместе с тем, сохранение высокой корреляции операционной скорости с объемом записанных блоков и неизменная доля ожиданий по проблемному запросу указывают на необходимость дальнейшей оптимизации на прикладном уровне. Таким образом, представленная методология обеспечивает объективную основу для принятия решений и позволяет отделить результаты целенаправленных изменений от фоновых колебаний системы, что подтверждает ее ценность как инструмента повседневной практики сопровождения высоконагруженных СУБД.

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

PG_EXPECTO v.7: Отключаем «режим гадалки» при настройке PostgreSQL

Серия СУБД PostgreSQL

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

PG Expecto v.7: Точность вместо догадок.

PG Expecto v.7: Точность вместо догадок.

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

Сообщество разработчиков и администраторов PostgreSQL получило мощное обновление инструментария для анализа производительности. Команда разработчиков под руководством Рината Сунгатуллина (kznalp) представила релиз версии 7 комплекса pg_expecto — свободно распространяемого решения для глубокого статистического анализа и нагрузочного тестирования СУБД PostgreSQL .

В то время как многие инструменты лишь констатируют факт наличия проблемы, pg_expecto отвечает на вопрос «почему?» и, что важнее, «что делать дальше?». Отличительной чертой комплекса является его методологическая основа: он заменяет устаревшие эмпирические правила (вроде пресловутой настройки shared_buffers = 25% RAM) на точные математические расчеты и воспроизводимые эксперименты .

От мифов — к цифрам: ВКО и проактивный подход

Ключевое новшество, реализованное в методологии комплекса — «Взвешенная корреляция ожиданий (ВКО)» . Этот показатель позволяет администраторам больше не гадать, какой из десятков типов ожиданий (wait events) является корнем проблем.

ВКО ранжирует проблемы по шкале от 1 до 5, отвечая на вопрос: «Какой тип ожиданий (IO, IPC, LWLock) является доминирующим и стабильным фактором, определяющим нагрузку на систему?» . Это позволяет мгновенно отсеять статистический шум и сфокусироваться на критических узких местах.

Более того, pg_expecto позволяет перейти от реактивного подхода к проактивному мониторингу. Инструмент рассчитывает индикатор деградации производительности, анализируя угол наклона линии регрессии операционной скорости и ожиданий. Если скорость падает, а ожидания растут — система генерирует оповещение об инциденте еще до того, как пользователи начнут жаловаться на тормоза .

Что внутри коробки: возможности pg_expecto v.7

Комплекс предоставляет администратору «единый источник истины» (Single Source of Truth), объединяя метрики на уровне СУБД и операционной системы .

  1. Всесторонний статистический анализ: Глубокий анализ событий ожидания (wait_event_type/wait_event) и их корреляции с производительностью .

  2. Интеграция с ОС: Выход за пределы СУБД. pg_expecto использует утилиты vmstat и iostat для прямой привязки нагрузки на диск, память и CPU к поведению базы данных . Это позволяет, например, увидеть корреляцию между ожиданиями IO и загрузкой дисковой подсистемы .

  3. Встроенное нагрузочное тестирование: Возможность проводить тесты с различными сценариями (Select only, Inser , Update) и сразу получать структурированные отчеты .

  4. Экспорт отчетов: Автоматическое формирование данных для построения графиков и диаграмм Парето в Microsoft Excel, что упрощает подготовку отчетности для руководства .

  5. Интеграция с нейросетями (v.7): Новейшая версия автоматически подготавливает промпты для анализа статистически обработанных метрик с помощью больших языковых моделей (таких как DeepSeek). Нейросеть получает не «сырые» логи, а уже обработанные статистические данные (медианы, корреляции, тренды), что позволяет ей формировать экспертные выводы и рекомендации, избегая информационного шума .

Экспериментальное подтверждение: Разрушение мифов

Возможности pg_expecto подтверждены серией практических экспериментов. В одном из последних исследований с использованием pg_expecto был наглядно разрушен миф о магических 25% RAM для shared_buffers .

Эксперименты показали, что при увеличении shared_buffers бутылочное горлышко смещается: дисковая подсистема перестает быть проблемой, но на смену приходит ожесточенная конкуренция за CPU и внутренние блокировки (LWLocks). pg_expecto позволил зафиксировать момент, когда дальнейшее увеличение параметра не только перестает давать прирост, но и начинает вредить производительности из-за возросших накладных расходов на синхронизацию .

Другие эксперименты, проведенные с использованием инструмента, показали, как избыточное индексирование может увеличить ожидания по легковесным блокировкам (LWLock) более чем на 50%, а также позволили математически точно сравнить эффективность различных вариантов написания SQL-запросов (JOIN против EXISTS) .

Как начать работу

pg_expecto распространяется через репозитории на GitHub . Для работы комплекса требуются предустановленные расширения PostgreSQL pg_stat_statements и pg_wait_sampling, а также утилиты vmstat и iostat .

Процесс установки автоматизирован с помощью скрипта pg_expecto_install.sh, а мониторинг работоспособности ведется через лог-файл /postgres/pg_expecto/sh/pg_expecto.log .

Голос сообщества

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

Комплекс pg_expecto v.7 уже доступен для скачивания. Для обратной связи и обсуждения результатов разработчик приглашает в Telegram-канал и Дзен .

Контакты для связи:
Ринат Сунгатуллин
Email: kznalp@yandex.ru
Telegram: t.me/pg_expecto
Dzen: dzen.ru/kznalp

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

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

PG_EXPECTO v.7 + DeepSeek: Статистический анализ инцидентов производительности СУБД PostgreSQL

Серия СУБД PostgreSQL

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

От сырых данных — к пониманию

От сырых данных — к пониманию

Комплекс pg_expecto помогает администраторам PostgreSQL собирать и структурировать статистику производительности, превращая сырые метрики в понятные отчёты. Однако ключевая проблема всегда оставалась неизменной: интерпретация данных. Именно здесь на помощь приходят большие языковые модели. Интеграция pg_expecto с DeepSeek позволяет выйти за рамки сухих цифр и графиков — нейросеть выступает в роли эксперта, который не просто фиксирует аномалии, но и объясняет причинно-следственные связи между падением скорости, ростом ожиданий и состоянием инфраструктуры.

В представленных отчётах DeepSeek не только выявил переход от проблем с записью к проблемам с чтением в первом инциденте, но и точно определил во втором случае виновника деградации — новый тяжёлый запрос на фоне острого дефицита памяти. Благодаря pg_expecto, нейросеть оперирует не догадками, а точными статистическими показателями (корреляциями, трендами R², приоритетами ожиданий), превращая процесс расследования инцидента из гадания по графикам в быстрый и доказательный анализ.


Инцидент №1

Дата и время инцидента: 2026-02-25 15:58

  • Операционная скорость - снижается📉

  • Ожидания СУБД - растут📈

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

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

Этап-1 : cбор статистической информации о производительности-ожиданиях СУБД и метриках инфраструктуры

cd /postgres/pg_expecto/sh/load_test/

./incident_report.sh '2026-02-25 15:58'

Результат отчета : исходные файлы для формирования аналитических отчетов с использованием нейросети

Этап-2: Экспресс-анализ инцидента СУБД с использованием нейросети

Анализ выполняется путем сравнения статистических показателей за отрезки времени:

  • Инцидент: [ Время инцидента - 1 час ; Время инцидента ]

  • Тест: [ Время инцидента - 2 часа ; Время инцидента-1час ]

Входные файлы для нейросети:

  1. _1.settings.txt: Конфигурационные параметры СУБД и инфраструктуры

  2. _2.1.test.postgresql_vmstat.txt: Статистически обработанные данные производительности/ожиданий СУБД и метрик инфраструктуры в тестовый период.

  3. _2.postgresql_vmstat.txt: Статистически обработанные данные производительности/ожиданий СУБД и метрик инфраструктуры в период инцидента.

Краткий аналитический отчет, подготовленный нейросетью DeepSeek

1. Существенные различия метрик производительности СУБД и инфраструктуры

Динамика операционной скорости

  • Тестовый отрезок: скорость демонстрирует слабый положительный тренд (R² = 0,27, угол +27,25).

  • Инцидент: скорость падает с хорошей достоверностью (R² = 0,70, угол –39,83).

Объём ожиданий СУБД

  • Медиана ожиданий выросла с 830 955 (тест) до 928 446 (инцидент), при этом тренд роста остаётся очень сильным в обоих случаях (R² ~0,98).

Характер связи скорости и ожиданий

  • Тест: связь отсутствует или положительная, модель слабая (R² = 0,24).

  • Инцидент: чёткая отрицательная корреляция (–0,804), модель хорошая (R² = 0,65).

Типы ожиданий

  • В обоих периодах доминирует IO (интегральный приоритет 0,6271). Однако в тесте IO сильно связан с записью на диск (bo: r = 0,815, R² = 0,66), а в инциденте — с чтением с диска (bi: r = 0,515, R² = 0,27), связь с записью исчезает.

Метрики vmstat (процессы и I/O)

  • procs r (очередь на CPU): медиана выросла с 9 до 14, в инциденте 100% времени превышает число ядер (8). Тренд r стал достоверным (R² = 0,58 против 0,18 в тесте).

  • procs b (процессы в uninterruptible sleep): медиана увеличилась с 152 до 177, тренд остаётся крайне сильным в обоих случаях (R² ~0,98).

  • wa (iowait): медиана снизилась с 31% до 28%, но в инциденте тренд снижения wa замедлился (угол –19,16 против –41,09 в тесте).

Грязные страницы (dirty pages)

  • Медиана размера dirty pages уменьшилась с ~14,8 МБ (тест) до ~11,0 МБ (инцидент).

  • Связь dirty pages со свободной памятью (free) усилилась: в тесте R² = 0,46, в инциденте R² = 0,76.

  • Связь dirty pages с wa остаётся значимой, но коэффициент детерминации снизился (0,73 → 0,54).

Приоритеты корреляций (CPI)

  • Тест: лидируют связи cs–in, cs–us, dirty–wa.

  • Инцидент: на первое место выходит связь dirty–free, затем скорость–записанные блоки, dirty–wa, появляется корреляция hit–us.

Нагрузка по запросам

  • В обоих случаях основным источником IO является один и тот же запрос ( queryid -709787657973380026), его доля в общих ожиданиях IO практически неизменна (~87,2%).

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

Тренд скорости (R²):

  • Тестовый отрезок: 0,27 (слабый)

  • Инцидент: 0,70 (хороший)

Изменение: появление достоверного падения скорости.

Тренд ожиданий (R²):

  • Тест: 0,97 (очень высокий)

  • Инцидент: 0,98 (очень высокий)

Изменение: сохраняется устойчивый рост ожиданий.

Корреляция скорость–ожидания (r):

  • Тест: отсутствует / положительная

  • Инцидент: –0,804 (отрицательная)

Изменение: переход к обратной зависимости (рост ожиданий → падение скорости).

R² регрессии скорость–ожидания:

  • Тест: 0,24 (непригодная модель)

  • Инцидент: 0,65 (хорошая модель)

Изменение: установлена причинно-следственная связь.

Корреляция IO–bi (чтение):

  • Тест: незначима

  • Инцидент: 0,515 (R² = 0,27)

Изменение: появление вклада чтений в IO-ожидания.

Корреляция IO–bo (запись):

  • Тест: 0,815 (R² = 0,66)

  • Инцидент: незначима

Изменение: исчезновение связи с записью.

Корреляция dirty–free (r):

  • Тест: –0,680 (R² = 0,46)

  • Инцидент: –0,872 (R² = 0,76)

Изменение: усиление зависимости dirty pages от свободной памяти.

Корреляция dirty–wa (r):

  • Тест: 0,856 (R² = 0,73)

  • Инцидент: 0,733 (R² = 0,54)

Изменение: снижение, но сохранение значимости.

Корреляция hit–us:

  • Тест: незначима

  • Инцидент: –0,669 (R² = 0,45)

Изменение: появление связи попаданий в кэш с пользовательским временем CPU.

procs r тренд (R²):

  • Тест: 0,18 (неудовлетворительный)

  • Инцидент: 0,58 (удовлетворительный)

Изменение: рост очереди на CPU стал статистически значимым.

procs b тренд (R²):

  • Тест: 0,99

  • Инцидент: 0,98

Изменение: стабильно высокий рост числа заблокированных процессов (ожидание I/O)

3. Наиболее вероятная причина снижения производительности СУБД в ходе инцидента

Изменение характера дисковой нагрузки с преимущественно записи на чтение

В тестовом периоде рост ожиданий IO был обусловлен операциями записи (сильная корреляция с bo), что характерно для контрольных точек или фоновой записи dirty pages.

В инциденте связь IO с записью исчезает, но появляется корреляция с чтением (bi), при этом размер dirty pages снижается, а их зависимость от свободной памяти резко усиливается. ➡️ Это указывает на то, что система памяти находится под давлением: свободная память минимальна, кэш заполнен, и запросы на чтение данных, не помещающихся в shared buffers, вызывают физические чтения с диска.

Дополнительные факторы:

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

  • Появление корреляции hit–us говорит о том, что даже при высоком hit ratio (99,3%) часть запросов требует интенсивной работы CPU, возможно, из-за неоптимальных планов или увеличения сложности обработки.

Таким образом, основной причиной падения производительности стало увеличение доли операций физического чтения, вызванное нехваткой памяти и/или изменением паттерна запросов (например, более тяжёлые сценарии чтения), что привело к росту ожиданий IO и, как следствие, к снижению операционной скорости.


Инцидент №2

Дата и время инцидента: 2026-02-26 12:24

  • Операционная скорость - снижается📉

  • Ожидания СУБД - растут📈

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

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

Этап-1 : cбор статистической информации о производительности-ожиданиях СУБД и метриках инфраструктуры

cd /postgres/pg_expecto/sh/load_test/

./incident_report.sh '2026-02-26 12:24 '

Результат отчета : исходные файлы для формирования аналитических отчетов с использованием нейросети

Этап-2: Экспресс-анализ инцидента СУБД с использованием нейросети

Анализ выполняется путем сравнения статистических показателей за отрезки времени:

  • Инцидент: [ Время инцидента - 1 час ; Время инцидента ]

  • Тест: [ Время инцидента - 2 часа ; Время инцидента-1час ]

Входные файлы для нейросети:

  1. _1.settings.txt: Конфигурационные параметры СУБД и инфраструктуры

  2. _2.1.test.postgresql_vmstat.txt: Статистически обработанные данные производительности/ожиданий СУБД и метрик инфраструктуры в тестовый период.

  3. _2.postgresql_vmstat.txt: Статистически обработанные данные производительности/ожиданий СУБД и метрик инфраструктуры в период инцидента.

Краткий аналитический отчет, подготовленный нейросетью DeepSeek

1. Существенные различия метрик производительности СУБД и инфраструктуры

Загрузка CPU

  • Тест: us+sy = 23.7% (норма)

  • Инцидент: us+sy = 95.7% (ALARM, более 50% времени)

Резкий рост загрузки процессора, почти полное отсутствие простоя (idle упал с 4% до 1%).

Очередь процессов (r)

  • Тест: медиана 24, макс 39

  • Инцидент: медиана 59, макс 80

Увеличение более чем в 2 раза, 95.7% времени очередь превышает число ядер CPU.

I/O wait (wa)

  • Тест: wa >10% в 100% времени, медиана 14%

  • Инцидент: wa >10% только в 10.9% времени, медиана 4%

Снижение явных простоев в ожидании ввода-вывода.

Память и подкачка

  • Тест: свободная RAM <5% в 100% времени, swap in/out 100% времени

  • Инцидент: те же показатели 95.7% (сохраняется острая нехватка памяти и активный свопинг).

Структура ожиданий СУБД (по приоритету ВКО)

  • Тест: IPC (0.66 – критический), Timeout (0.01 – низкий)

  • Инцидент: IO (0.34 – критический), LWLock (0.17 – высокий), Timeout (0.01), IPC (0.01)

Смещение фокуса с межпроцессного взаимодействия на ввод-вывод и легковесные блокировки.

Запросы-лидеры по ожиданиям

  • Тест: один тяжелый запрос (-709787657973380026) – 100% IPC (BufferIo)

  • Инцидент: тот же запрос дает 52% IO (DataFileRead/Write), 86% LWLock; появляется новый запрос (-343482726002183894) с 46.6% IO, включая расширение файлов (DataFileExtend) и запись WAL (SlruWrite).

2. Сравнительный статистический анализ (корреляции и регрессии)

Корреляция cs (переключения контекста) с sy (system time)

  • Тест: r = 0.49, R² = 0.24 (слабая)

  • Инцидент: r = 0.90, R² = 0.82 (очень сильная)

Ядро стало тратить значительно больше времени на переключения контекста.

Корреляция Timeout с r (run queue)

  • Тест: отсутствовала (не значима)

  • Инцидент: r = 0.98, R² = 0.97 – чрезвычайно сильная связь, указывающая на рост системных таймеров при перегрузке CPU.

Корреляция прочитанных блоков с swap in

  • Тест: не значима

  • Инцидент: r = 0.87, R² = 0.76 – чтение данных с диска теперь сопровождается подкачкой страниц из swap, прямой признак нехватки памяти.

Корреляция грязных блоков с wa (I/O wait)

  • Тест: не значима

  • Инцидент: r = 0.87, R² = 0.76 – рост «грязных» страниц теперь вызывает ожидание ввода-вывода.

Корреляция операционной скорости с записанными блоками

  • Тест: r = 0.98, R² = 0.97 (очень высокая)

  • Инцидент: r = 0.92, R² = 0.84 (остается высокой, но немного снизилась) – производительность по-прежнему сильно зависит от записи.

Корреляция грязных блоков с bo (блоки записи на диск)

  • Тест: r = 0.97, R² = 0.94

  • Инцидент: r = 0.70, R² = 0.49 – связь ослабла, что может указывать на вмешательство других факторов (например, свопинга).

    Корреляция dirty pages size с bo

  • Тест: r = 0.80, R² = 0.64

  • Инцидент: r = 0.45, R² = 0.21 – механизмы фоновой записи стали менее эффективны на фоне дефицита памяти.

3. Наиболее вероятная причина снижения производительности

Всплеск интенсивной записи данных на фоне острой нехватки оперативной памяти

В инциденте появился новый тяжелый запрос (-343482726002183894), выполняющий массовые вставки/обновления, что привело к:

  • расширению файлов данных (DataFileExtend);

  • интенсивной записи в WAL и таблицы (DataFileWrite, SlruWrite);

  • росту конкуренции за буферный кэш и WAL (LWLock: BufferContent, WALInsert).

Нехватка памяти (свободная RAM <5%, активный свопинг) заставляет систему вытеснять страницы на диск, увеличивая нагрузку на ввод-вывод и вызывая дополнительные задержки.

CPU оказался перегружен из-за:

  • обработки системных вызовов при свопинге;

  • роста переключений контекста (корреляция cs–sy);

  • активной работы фоновых процессов записи.

Хотя hit ratio остаётся высоким (98.6%), наличие свопинга и корреляции чтения с swap in указывает, что кэш не спасает от подкачки – либо shared_buffers велики относительно доступной RAM, либо другие процессы вытесняют страницы PostgreSQL.

Таким образом, ключевой фактор деградации – совокупность интенсивной записи и дефицита памяти, что привело к исчерпанию ресурсов CPU и росту ожиданий ввода-вывода и блокировок.


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

В результате вы получаете не просто графики, а готовую диагностику: в первом случае методика укажет на дефицит памяти и переход нагрузки на физическое чтение (подсказывая проверить размер shared_buffers и характер запросов), а во втором — выявит конкретный запрос-виновник, вызвавший перегрузку CPU и свопинг из-за массовых вставок. Это позволяет перейти от гадания к быстрым и обоснованным действиям по спасению СУБД.

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

Идеальный тандем: Почему pgpro_pwr и pg_expecto не конкуренты, а лучшая команда для DBA

Серия СУБД PostgreSQL

В этом отчете рассматриваются ключевые различия между pg_expecto и pgpro_pwr — от подходов к сбору статистики до методов расследования инцидентов.

Дисклеймер: Текст создан с использованием технологий искусственного интеллекта на базе общедоступной информации, найденной в сети. Материал носит ознакомительный и аналитический характер.

Объединяя историю и математику.

Объединяя историю и математику.


Сравнительный отчет: pg_expecto vs pgpro_pwr

1. Назначение и основная цель

  • pg_expecto
    Предназначен для глубокого статистического анализа, расследования инцидентов и нагрузочного тестирования .
    Его цель — не просто показать метрики, а выявить причинно-следственные связи (корреляцию) между событиями ожидания, состоянием ОС и падением производительности.
    Позиционируется как инструмент для проактивного поиска узких мест и проверки гипотез ("урожайный калькулятор") .
    Начиная с версии 7.0, реализует концепцию "разделения труда": pg_expecto выполняет "черновую" статистическую обработку, а нейросеть (DeepSeek) формирует экспертные выводы .

  • pgpro_pwr (Postgres Pro Workload Reporting)
    Предназначен для регулярного сбора статистики и построения отчётов о нагрузке на базу данных.
    Его цель — предоставить администратору полную картину работы СУБД в ретроспективе: какие запросы были самыми ресурсоёмкими, как менялась нагрузка во времени.
    Это классический инструмент исторического мониторинга и трендового анализа.

2. Архитектура и компоненты

  • pg_expecto
    Представляет собой комплекс скриптов (PL/pgSQL, Shell), который устанавливается и запускается на сервере СУБД .
    Требует наличия стандартных расширений: pg_stat_statements и pg_wait_sampling .
    Включает собственную логику для анализа метрик ОС (через vmstat, iostat) .
    Имеет встроенный модуль для генерации промптов для нейросетей (DeepSeek и др.), чтобы получать рекомендации по оптимизации .
    Хранение данных (важное уточнение): В инструменте реализована двухуровневая система работы с данными:
    Сырые метрики (поминутные значения временных рядов) собираются и сохраняются в выходных файлах pg_expecto для возможности последующей верификации .
    Эти сырые данные проходят обязательную статистическую обработку: рассчитываются граничные значения (MIN, MAX), медианы (MEDIAN) для исключения влияния выбросов, коэффициенты корреляции, уравнения регрессий, углы наклона и интегральные приоритеты .
    Именно обработанные статистические данные (а не сырые ряды) используются для итогового анализа и передачи в нейросеть. Таким образом, pg_expecto формирует собственное компактное хранилище агрегированных исторических профилей производительности.

  • pgpro_pwr
    Является расширением PostgreSQL (официальным расширением Postgres Pro), которое устанавливается в кластер.
    Состоит из трех ключевых частей:
    Репозиторий истории — набор таблиц для хранения снимков статистики.
    Механизм управления выборками — функции для создания снимков (snapshots) и очистки устаревших данных.
    Механизм отчетов — функции для генерации отчетов на основе данных из репозитория.
    Может работать в распределенной среде: один экземпляр pgpro_pwr может собирать статистику с нескольких серверов (например, с горячих резервных копий).
    Рекомендуется использовать с расширением pgpro_stats (проприетарный аналог pg_stat_statements с расширенными возможностями), но поддерживает и стандартные расширения.

3. Методика сбора данных

  • pg_expecto
    Метод:
    Комбинированный: "по требованию" (On-demand) в ходе нагрузочного тестирования и с возможностью ведения истории.
    Хранение: Реализована возможность хранения как сырых, так и статистически обработанных данных. Это позволяет анализировать не только "здесь и сейчас", но и возвращаться к результатам прошлых тестов или инцидентов для сравнительного анализа (например, OLTP vs OLAP) .
    Глубина: Собирает данные с высокой детализацией, обязательно применяя к ним статистическое сглаживание (медианы) для отсечения шума и выбросов перед формированием выводов .

  • pgpro_pwr
    Метод:
    Регулярные снимки (snapshots). Администратор настраивает расписание (например, через cron), по которому расширение делает выборку текущей статистики и сохраняет её в репозиторий.
    Хранение: Ориентирован на ведение длинной истории. Позволяет удалять устаревшие данные, но хранит месяцы и годы статистики.
    Глубина: Детализация средняя, но зато охватывающая длительный период. Позволяет увидеть, как росла нагрузка в течение года.

4. Методика расследования инцидентов (Поиск причин снижения производительности)

  • pg_expecto
    Подход:
    Корреляционный анализ с математическим детектированием.
    Шаги расследования:
    Проактивное детектирование:
    Система может сама сигнализировать о начале деградации на основе анализа углов наклона линий регрессии операционной скорости и ожиданий (угол скорости < 0, угол ожиданий > 0) .
    Анализ СУБД: Исследование событий ожидания (wait_event) с расчетом интегральных приоритетов типов ожиданий (например, IO, IPC, LWLock) для определения критического узкого места .
    Анализ инфраструктуры: Сопоставление проблем в базе с метриками ОС (загрузка CPU, дисковые очереди через iostat, состояние процессов vmstat) .
    Статистическая обработка: Использование медиан вместо средних для оценки типичной производительности, что делает анализ устойчивым к случайным всплескам нагрузки .
    Поиск SQL: Выявление проблемных запросов с использованием диаграмм Парето по queryid .
    Использование ИИ: Генерация промпта для нейросети на основе статистически обработанных данных инцидента для получения экспертных рекомендаций .

  • pgpro_pwr
    Подход:
    Сравнительный анализ отчетов (Trend Analysis).
    Шаги расследования:
    Фиксация инцидента:
    Администратор узнает о проблеме в 10:00 утра.
    Сбор отчетов: Формируется отчет pgpro_pwr за проблемный период (например, с 9:30 до 10:00) и сравнивается с "базовым" отчетом за аналогичное время вчера, когда всё работало хорошо.
    Анализ изменений: Администратор изучает разделы отчета:
    Top SQL: Какие запросы стали выполняться дольше или чаще?
    События ожидания: Какие типы ожиданий выросли?
    Ввод/вывод: На каких объектах (таблицы/индексы) возросла активность чтения/записи?
    Формулировка вывода: Администратор делает вывод, что "из-за изменения плана запроса X выросло чтение с диска по индексу Y".

5. Ключевые возможности (Уникальные особенности)

  • pg_expecto
    Нагрузочное тестирование:
    Возможность генерировать нагрузку и сразу видеть её влияние на ожидания и скорость .
    Интеграция с ОС: Прямой сбор данных с vmstat и iostat внутри одного инструмента .
    ИИ-ассистент: Автоматическое конструирование промптов для нейросетей (DeepSeek) на основе статистически обработанных данных .
    Проактивное детектирование: Математическое детектирование начала деградации по углу наклона линий регрессии, а не просто констатация факта падения .
    Статистическая обработка данных: Автоматический расчет медиан, граничных значений, коэффициентов корреляции (R²), интегральных приоритетов и уравнений регрессий для очистки данных от шума и выявления истинных трендов .
    Сравнительный анализ профилей: Возможность сравнивать статистические профили разных типов нагрузки (например, OLTP против OLAP) .
    Экспорт в Excel: Упрощенная подготовка отчетов для руководства .

  • pgpro_pwr
    Репозиторий истории:
    Централизованное и структурированное хранение многолетней статистики.
    Поддержка кластеров: Возможность собирать статистику с разных серверов (включая Shardman) в один репозиторий.
    Baselines (Базовые линии): Возможность создания базовых линий производительности для сравнения.
    Гибкая система привилегий: Возможность разграничить роли владельца, сборщика статистики и пользователя, создающего отчеты, следуя парадигме наименьших привилегий.
    Интеграция с pgpro_stats: Получение расширенной статистики, включая планы операторов и распределение нагрузки по приложениям.

6. Недостатки и ограничения

  • pg_expecto
    Не является стандартным расширением, устанавливаемым через CREATE EXTENSION, а представляет собой набор скриптов, что может усложнять версионирование и управление для некоторых пользователей.
    Хранение истории (с учетом новых данных): Возможность ведения исторического репозитория и статистической обработки с медианным сглаживанием реализована в инструменте , однако на текущий момент эта функция недостаточно подробно описана в базовой документации и публичных материалах. Это может затруднить её практическое применение администраторами, не готовыми изучать внутреннее устройство или выходные файлы инструмента самостоятельно.
    Малоизвестен в широких кругах профессионального сообщества за пределами специализированных Telegram и Дзен-каналов .
    Зависимость от сторонних утилит ОС (vmstat, iostat), которые могут быть не везде доступны.

  • pgpro_pwr
    Является проприетарным расширением Postgres Pro. Для использования в ванильной PostgreSQL потребуется установка совместимых аналогов (pg_stat_statements вместо pgpro_stats), что может снизить функциональность.
    Сложность настройки, особенно при разграничении прав и сборе статистики с удаленных серверов.
    Отсутствуют встроенные средства нагрузочного тестирования и "интеллектуального" статистического анализа (медианное сглаживание, корреляции, ИИ-ассистент).
    Требует дополнительного места для хранения разрастающегося репозитория истории.

7. Резюме (Когда что использовать?)

  • Используйте pg_expecto, если:
    У вас произошел инцидент прямо сейчас, и нужно быстро найти его корневую причину с помощью математически обоснованных методов (корреляции, регрессии) .
    Вы проводите нагрузочное тестирование и хотите получить не просто цифры, а очищенные от выбросов статистические профили с приоритезацией узких мест .
    Вы хотите построить систему проактивного мониторинга, которая предупредит о начале деградации ДО того, как пользователи начнут жаловаться .
    Вы готовы использовать современные методы анализа с привлечением ИИ (DeepSeek) для интерпретации сложных статистических данных и получения экспертных рекомендаций .
    Вам нужен компактный инструмент для сравнительного анализа различных профилей нагрузки (OLAP vs OLTP) .

  • Используйте pgpro_pwr, если:
    Вам нужна система постоянного мониторинга производительности с возможностью "отмотать пленку" на месяц назад и посмотреть динамику изменений метрик.
    Вы хотите получать ежедневные/еженедельные отчеты о самых тяжелых запросах в системе.
    Вам нужно централизованно собирать статистику с кластера баз данных.
    Вы работаете в среде Postgres Pro и хотите использовать все возможности вендорского продукта.

Итоговый вывод

Инструменты не конкурируют, а дополняют друг друга. pgpro_pwr обеспечивает ведение детальной исторической хроники работы баз данных. pg_expecto предоставляет математический аппарат для глубокого анализа проблем, очистки данных от статистического шума (медианное сглаживание) и даже проактивного предсказания деградации. С появлением в pg_expecto функций статистической обработки и хранения профилей, он становится еще более мощным аналитическим дополнением к системам мониторинга и исторического учета.

Резюме

Рынок инструментов для PostgreSQL развивается в сторону специализации. pgpro_pwr закрывает потребность в долгосрочном мониторинге, в то время как pg_expecto делает ставку на интеллектуальный анализ и проактивное детектирование проблем. Их совместное использование способно закрыть практически все потребности DBA по части производительности.

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества