Найти в Дзене
Postgres DBA

От гаданий к математике: Как PG_EXPECTO v.7 и DeepSeek превращают DBA-анализ из искусства в науку.

GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL Глоссарий терминов | Postgres DBA | Дзен Традиционный DBA-анализ часто субъективен и опирается на опыт конкретного специалиста. PG_EXPECTO предлагает другой метод : автоматизация сбора и обработки статистики с помощью PG_EXPECTO v.7 и формирование выводов нейросети DeepSeek. PG_EXPECTO рассчитал граничные значения и метрики ВКО, отсеяв незначимые события. DeepSeek, получив эти «чистые» данные, провел сравнительный анализ экспериментов , указав на скрытые доминанты и системные паттерны. Применение корреляционного и регрессионного анализа позволяет решить три критически важные задачи: 1️⃣Отсечь иллюзорные связи. Тип ожидания может быть многочисленным, но при этом не оказывать системного влияния на рост общей задержки. ➡️Статистическая значимость (p‑value) и ➡️низкая взвешенная корреляция (ВКО) отфильтровывают такие события, экономя часы бесполезных настроек. 2️⃣Выяви
Оглавление
Смотри глубже. Понимай точнее. (pg_expecto v.7 + DeepSeek)
Смотри глубже. Понимай точнее. (pg_expecto v.7 + DeepSeek)

GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL

Глоссарий терминов | Postgres DBA | Дзен

Предисловие

Традиционный DBA-анализ часто субъективен и опирается на опыт конкретного специалиста. PG_EXPECTO предлагает другой метод : автоматизация сбора и обработки статистики с помощью PG_EXPECTO v.7 и формирование выводов нейросети DeepSeek.

PG_EXPECTO рассчитал граничные значения и метрики ВКО, отсеяв незначимые события. DeepSeek, получив эти «чистые» данные, провел сравнительный анализ экспериментов , указав на скрытые доминанты и системные паттерны.

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

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

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

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

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

2. Синтез статистики и искусственного интеллекта

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

3.Разделение ответственности

pg_expecto v.7

Выполняет сбор сырых метрик в ходе нагрузочного тестирования, производит их статистическую обработку (расчет граничных значений, медиан, коэффициентов корреляции, регрессий, R² и т.д.)

DeepSeek

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

Практическое применение методологии PG_EXPECTO v.7. на примере исследования влияния чрезмерно завышенного значения max_connections

  • Кейс: Сравнение производительности PostgreSQL при max_connections = 30 и 3000.
  • Методология: Как корреляция (ВКО) и регрессия (R²) помогают расставлять приоритеты.
  • Результат: Почему IPC остается критическим, а LWLock вышел на второе место.

Теоретическая часть, предпосылка к исследованию.

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

Нагрузка на СУБД в ходе нагрузочного тестирования по сценарию нагрузки имитирующему OLAP

-2

Сравнительные показатели операционной скорости и ожиданий СУБД в ходе Эксперимента-1(max_connection = 30 ) и Эксперимента-1(max_connection = 3000 )

-3
-4

Применение нейросети DeepSeek для сравнительного анализа статистически обработанных данных о результатах экспериментов

Краткий анализ

Сформируй краткий сравнительный отчет по производительности СУБД и инфраструктуры:
ЭКСПЕРИМЕНТ-1 (max_connections = 30)
ЭКСПЕРИМЕНТ-2 (max_connections = 3000)
Для формирования отчета используй списки, вместо таблиц.
Состав отчета:
# Существенные различия метрик производительностим СУБД и инфраструктуры
# Главные итог влияния max_connections на производительность СУБД и инфраструктуры

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

Интегральный приоритет ожиданий :

  • Приоритет LWLock вырос с 0.342 (30 соединений) до 0.468 (3000 соединений).
-5

  • Приоритет IO снизился с 0.5275 до 0.3905, но его взвешенная корреляция (ВКО) увеличилась с 0.19 (высокое) до 0.20 (критическое).
-6

Тренды vmstat:

  • Негативный тренд очереди процессов (procs r) усилился (коэффициент тренда 26.7 → 29.1).
-7
  • Негативный тренд простоя CPU (cpu id) стал более выраженным (36.6 → 38.1).
-8
  • Доля времени с wa > 10% выросла с 83.6% до 90.9% (ALARM).
-9

Использование памяти:

  • Свободная RAM <5% в обоих экспериментах – 100% времени (ALARM).
  • Swap out при 30 соединениях наблюдался в 6.4% времени, при 3000 – отсутствовал (0%).
  • Объём «грязных» страниц (dirty pages) значительно увеличился: медиана с 2.4 МБ до 3.1 МБ, максимум с 2.98 МБ до 4.4 МБ.

Корреляции:

  • Грязные блоки shared_buffers и записанные блоки vmstat/bo: корреляция выросла с 0.87 до 0.99, что указывает на чрезмерно агрессивную запись при max_connections=3000.
  • Операционная скорость и записанные блоки корреляция увеличилась с 0.965 до 0.982 – усиление зависимости производительности от записи на диск.

Shared buffers hit ratio:

  • Медианное значение снизилось с 60.1% (30) до 58.9% (3000) – незначительное ухудшение эффективности кеша.

Количество вызовов запросов:

  • Для сценария с наибольшим числом вызовов (scenario3) количество выполнений уменьшилось с ~2.34 млн до ~2.21 млн, что может указывать на некоторое снижение интенсивности нагрузки .

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

Увеличение лимита подключений с 30 до 3000 привело к следующим ключевым эффектам:

  1. Рост конкуренции за легковесные блокировки (LWLock) – приоритет LWLock вырос, что свидетельствует об увеличении внутренней борьбы за структуры shared buffers.
  2. Усиление зависимости производительности от операций записи – корреляции скорости с записью на диск и грязных страниц с bo резко возросли, что говорит о том, что подсистема ввода-вывода стала ещё более узким местом.
  3. Увеличение времени ожидания ввода-вывода (wa) – доля времени с wa>10% выросла до 91%, подтверждая, что диск не справляется с нагрузкой.
  4. Ухудшение трендов загрузки CPU – очередь процессов и падение простоя CPU стали более выраженными, указывая на повышенную нагрузку на планировщик.
  5. Рост объёма «грязных» страниц – система накапливает больше изменённых данных перед сбросом на диск, что может приводить к пиковым нагрузкам при контрольных точках.
  6. Снижение эффективности кеша shared buffers – hit ratio немного упал, вероятно, из-за большего числа конкурентных обращений, вытесняющих данные из кеша.

В целом, увеличение max_connections до 3000 усугубило проблемы с подсистемой ввода-вывода и внутренними блокировками, не дав прироста пропускной способности. Система стала ещё сильнее ограничена диском и конкуренцией за ресурсы, что требует оптимизации либо аппаратного обеспечения (более быстрый диск), либо параметров СУБД, связанных с записью (checkpoint, bgwriter, WAL) и управлением памятью.

Детальный анализ

Сформируй сводный сравнительный отчет по производительности СУБД и инфраструктуры:
ЭКСПЕРИМЕНТ-1 (max_connections = 30)
ЭКСПЕРИМЕНТ-3 (max_connections = 3000)
Для формирования отчета используй списки, вместо таблиц.
Состав отчета:
# Общая информация
# Общий анализ операционной скорости и ожиданий СУБД для "ЭКСПЕРИМЕНТ-1 (max_connections = 30)" и "ЭКСПЕРИМЕНТ-3 (max_connections = 3000)"
## Сравнительный анализ граничных значений операционной скорости (SPEED) и ожиданий СУБД(WAITINGS)
## Сравнительный анализ трендов операционной скорости (SPEED) и ожиданий СУБД(WAITINGS)
## 1. СРАВНИТЕЛЬНЫЙ СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД
### Итог по разделу "1. СРАВНИТЕЛЬНЫЙ СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД"
## 2. СРАВНИТЕЛЬНЫЙ ТРЕНДОВЫЙ АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ vmstat
### Итог по разделу "2. СРАВНИТЕЛЬНЫЙ ТРЕНДОВЫЙ АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ vmstat"
## 3. СРАВНИТЕЛЬНЫЙ СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД и МЕТРИК vmstat
### Итог по разделу "3. СРАВНИТЕЛЬНЫЙ СТАТИСТИЧЕСКИЙ АНАЛИЗ ОЖИДАНИЙ СУБД и МЕТРИК vmstat"
## 4. СРАВНЕНИЕ ДИАГРАММ ПАРЕТО ПО WAIT_EVENT_TYPE и QUERYID
### Итог по разделу "4. СРАВНЕНИЕ ДИАГРАММ ПАРЕТО ПО WAIT_EVENT_TYPE и QUERYID
# Детальный анализ – граничные значения и корреляции для "ЭКСПЕРИМЕНТ-1 (max_connections = 30)" и "ЭКСПЕРИМЕНТ-3 (max_connections = 3000)"
## Ожидания СУБД
## Память и буферный кэш
## Дисковая подсистема (I/O)
## CPU и системные вызовы
## Блокировки и ожидания LWLock
## Анализ запросов (queryid)
# Ключевые проблемы для "ЭКСПЕРИМЕНТ-1 (max_connections = 30)" и "ЭКСПЕРИМЕНТ-3 (max_connections = 3000)"
## Проблемы СУБД
## Проблемы инфраструктуры
# Итоговый анализ влияния XXX на производительность СУБД и инфраструктуры

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

ЭКСПЕРИМЕНТ-1 (max_connections = 30) vs ЭКСПЕРИМЕНТ-3 (max_connections = 3000)

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

Версия PostgreSQL: 17.5 (одинаковая в обоих экспериментах)

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

Настройки СУБД: идентичны, за исключением параметра max_connections (30 в эксперименте-1, 3000 в эксперименте-3)

Настройки VM: одинаковые (dirty_ratio=10, dirty_background_ratio=5, swappiness=1 и др.)

Нагрузка: выполнялись три сценария pgbench (scenario1, scenario2, scenario3), количество вызовов сопоставимо

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

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

ЭКСПЕРИМЕНТ-1 (max_connections=30)

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

  • MIN: 124 468
  • MEDIAN: 126 289
  • MAX: 208 824

WAITINGS (суммарные ожидания СУБД):

  • MIN: 14 539
  • MEDIAN: 22 937
  • MAX: 34 518

ЭКСПЕРИМЕНТ-3 (max_connections=3000)

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

  • MIN: 120 831 (↓ на 2.9%)
  • MEDIAN: 125 108 (↓ на 0.9%)
  • MAX: 205 959 (↓ на 1.4%)

WAITINGS (суммарные ожидания СУБД):

  • MIN: 14 889 (↑ на 2.4%)
  • MEDIAN: 22 810 (↓ на 0.6%)
  • MAX: 35 584 (↑ на 3.1%)

Вывод: Увеличение лимита подключений привело к незначительному снижению скорости (менее 3%) и небольшому росту пиковых ожиданий.

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

ЭКСПЕРИМЕНТ-1

Тренд SPEED: R² = 0.62 (хорошая модель), угол наклона +38.32

Тренд WAITINGS: R² = 0.94 (очень высокая модель), угол наклона +44.18

ЭКСПЕРИМЕНТ-3

Тренд SPEED: R² = 0.67 (хорошая модель), угол наклона +39.38

Тренд WAITINGS: R² = 0.94 (очень высокая модель), угол наклона +44.12

Вывод: Характер трендов практически идентичен – скорость и ожидания медленно растут во времени. Изменение max_connections не повлияло на направленность трендов.

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

Интегральные приоритеты типов ожиданий (ВКО)

ЭКСПЕРИМЕНТ-1:

  • IPC: 0.8482 (критический)
  • Timeout: 0.5781 (высокий)
  • IO: 0.5275 (высокий)
  • LWLock: 0.3420 (средний)
  • Extension, BufferPin, Lock: 0.0000

ЭКСПЕРИМЕНТ-3:

  • IPC: 0.8482 (критический)
  • Timeout: 0.5836 (высокий)
  • LWLock: 0.4683 (средний/высокий)
  • IO: 0.3905 (средний)
  • Extension, BufferPin, Lock: 0.0000

Ключевые изменения

  • ❗Приоритет LWLock вырос на 37% (с 0.342 до 0.468)
  • ❗Приоритет IO снизился на 26% (с 0.527 до 0.391)
  • IPC остался на том же критическом уровне
  • Timeout незначительно вырос

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

  • ℹ️Увеличение max_connections до 3000 сместило фокус с дисковых ожиданий (IO) на конкуренцию за легковесные блокировки (LWLock).
  • IPC остаётся главной проблемой в обоих экспериментах, требуя немедленного анализа.
  • Timeout сохраняет высокий приоритет, что указывает на наличие частых таймерных событий.(Это ожидания SpinDelay.Добавлено мной.)

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

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

  • Эксперимент-1: R²=0.68, угол +39.43, негативный тренд (коэф. 26.67 – сильный)
  • Эксперимент-3: R²=0.72, угол +40.34, негативный тренд (коэф. 29.09 – сильный)

procs → b (процессы в ожидании IO)

  • Оба эксперимента: R² < 0.05 (модель непригодна), тренд не интерпретируется

cpu → wa (ожидание IO)

  • Эксперимент-1: R²=0.83, угол -42.38 (позитивный тренд, но статистически как шум)
  • Эксперимент-3: R²=0.90, угол -43.45 (аналогично)

cpu → id (простой CPU)

  • Эксперимент-1: R²=0.86, угол -42.77, негативный тренд (коэф. 36.6 – очень высокий, серьёзная проблема)
  • Эксперимент-3: R²=0.88, угол -43.19, негативный тренд (коэф. 38.05 – очень высокий, серьёзная проблема)

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

  • В обоих экспериментах наблюдается устойчивое падение idle CPU и рост очереди процессов.
  • Изменение max_connections не оказало влияния на эти негативные тренды.
  • Высокий коэффициент тренда id указывает на прогрессирующую нехватку процессорного времени.

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

IPC (межпроцессное взаимодействие)

  • Корреляция с cs (переключения контекста): 0.806 (эксп.1) → 0.823 (эксп.3) – усилилась
  • Корреляция с in (прерывания): 0.921 → 0.895 – незначительно снизилась
  • Корреляция с sy (системное время): 0.930 → 0.933 – стабильно высокая
  • Модели R² остаются в диапазоне 0.65–0.87 (хорошие/очень высокие)

Timeout

  • Корреляция с in: 0.903 → 0.892
  • Корреляция с cs: 0.772 → 0.816 (рост)
  • Корреляция с sy: 0.952 → 0.955
  • Корреляция с r (очередь): 0.862 → 0.886 (рост)
  • Все модели R² от 0.60 до 0.91 – качественные

LWLock

  • Корреляция с cs: 0.529 → 0.580 (R² 0.28→0.34 – слабые модели)
  • Корреляция с sy: 0.958 → 0.963 (R² 0.92→0.93 – очень высокие)
  • Корреляция с swap out: в эксп.1 была 0.64 (R²=0.41), в эксп.3 отсутствует (swap out не наблюдался)

IO

  • Корреляция с bi (блоки чтения): 0.402 (R² непригодна) → 0.566 (R²=0.32 – слабая)
  • Корреляция с bo (блоки записи): 0.672 (R²=0.45) → 0.951 (R²=0.90) – огромный рост⬅️
  • Связь с wa (ожидание IO) отсутствует в обоих экспериментах

Анализ метрик vmstat между собой

  • cs с in: 0.967 → 0.987 (R² 0.93→0.97)
  • cs с us (пользовательское время): 0.616 → 0.722 (R² 0.38→0.52)
  • cs с sy: 0.642 → 0.690 (R² 0.41→0.48)
  • Все корреляции при 3000 стали выше, особенно с us

Анализ IO (shared buffers, дисковые операции)

  • Hit ratio (медиана): 60.1% (эксп.1) → 58.9% (эксп.3) – незначительное снижение, оба значения критически низкие (ALARM)
  • Корреляция SPEED с прочитанными блоками: 0.795 → 0.837 (R² 0.63→0.70)
  • Корреляция SPEED с записанными блоками: 0.965 → 0.982 (R² 0.93→0.96) – усилилась
  • Корреляция грязных блоков с bo: 0.868 → 0.988 (R² 0.75→0.98) – резкий рост
  • Корреляция записанных блоков с bo: 0.721 → 0.984 (R² 0.52→0.97) – резкий рост

Статистика vm_dirty

  • Dirty pages size (медиана, KB): 2412 → 3086 (рост 28%)
  • available_mem_mb (медиана): 2824 → 2770 (небольшое снижение)
  • Корреляция dirty pages с free: -0.866 → -0.841 (R² 0.75→0.71) – высокая отрицательная
  • Корреляция dirty pages с bo: 0.684 → 0.982 (R² 0.47→0.96) – огромный рост
  • Корреляция dirty pages с sy: 0.971 → 0.923 (R² 0.94→0.85) – остаётся высокой

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

  • При увеличении max_connections до 3000 резко возросли корреляции, связанные с дисковыми записями: IO с bo, грязные страницы с bo, скорость с bo. Это указывает на то, что подсистема записи стала основным фактором, определяющим производительность.
  • Связь LWLock с sy остаётся очень сильной, что подтверждает рост конкуренции за общие структуры памяти.
  • Переключения контекста стали теснее связаны с пользовательским временем, вероятно, из-за большего числа активных соединений.
  • Объём dirty pages вырос, что говорит о более интенсивной генерации изменений.

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

Основные queryid и их вклад

IPC

  • Эксперимент-1: 100% на queryid 3551573579203076618 (scenario1)
  • Эксперимент-3: 100% на тот же queryid

Timeout

  • Эксперимент-1: 99.57% на scenario1
  • Эксперимент-3: 99.59% на scenario1

LWLock

  • Эксперимент-1: 93.5% на scenario1
  • Эксперимент-3: 96.2% на scenario1

IO

  • Эксперимент-1: 64.9% на scenario1, 35.1% на scenario3
  • Эксперимент-3: 64.9% на scenario1, 35.0% на scenario3

Вывод: Распределение ожиданий по запросам практически идентично в обоих экспериментах. Сценарий 1 (select scenario1) является доминирующим источником всех типов ожиданий.

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

  • Профиль нагрузки не изменился при увеличении max_connections.
  • Оптимизация должна быть направлена в первую очередь на запросы с queryid 3551573579203076618 и 5056468435638482395.

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

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

  • IPC: Критический приоритет в обоих случаях. Корреляции с cs, in, sy стабильно высокие.
  • Timeout: Высокий приоритет, корреляции с sy и r усилились при 3000.
  • ➡️LWLock: Приоритет вырос при 3000. Очень сильная связь с sy, умеренная с cs.
  • ➡️IO: Приоритет снизился при 3000, но резко выросла корреляция с bo, что указывает на связь с процессом записи.

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

  • Shared buffers hit ratio (медиана): 60.1% → 58.9% – снижение, оба значения ниже желаемых 90–95%.
  • ❗Dirty pages: медиана выросла с 2.4 МБ до 3.1 МБ.
  • Свободная RAM: постоянно менее 5% (ALARM) в обоих экспериментах.
  • Корреляция dirty pages с free высокая отрицательная – система агрессивно использует память.

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

  • wa (ожидание IO) > 10% наблюдается более 80% времени в обоих экспериментах (83.6% при 30, 90.9% при 3000) – дисковая подсистема перегружена.
  • Корреляции с bo резко усилились при 3000, что указывает на синхронизацию ожиданий с процессами записи.
  • Операционная Скорость сильно коррелирует с объёмом записи (0.965 → 0.982), т.е. производительность лимитируется записью на диск.

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

  • Негативный тренд idle CPU – процессорное время становится дефицитом.
  • Переключения контекста (cs) сильно коррелируют с прерываниями (in) и системным временем (sy), при 3000 корреляция с us (пользовательское время) выросла.
  • sy (системное время) тесно связано с LWLock, IPC, Timeout и dirty pages – высокие накладные расходы ядра.

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

  • Приоритет LWLock вырос при 3000.
  • Очень высокая корреляция с sy (0.96) указывает на то, что борьба за легковесные блокировки потребляет ресурсы ядра.
  • При 3000 исчезла связь с swap out (так как swap out отсутствовал).

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

  • Основной вклад вносит queryid 3551573579203076618 (scenario1) – на него приходятся почти 100% IPC и Timeout, более 90% LWLock, около 65% IO.
  • Queryid 5056468435638482395 (scenario3) даёт около 35% IO.

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

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

1. Критический уровень ожиданий IPC в обоих экспериментах – требует анализа взаимодействия фоновых процессов⬅️.

2. Низкий hit ratio буферного кэша (≈60%) – данные часто читаются с диска, shared buffers недостаточно для рабочего набора⚠️.

3. Рост приоритета LWLock при 3000 – увеличение числа соединений усилило конкуренцию за структуры в shared memory (буферный кэш, WAL, pg_stat_statements)⚠️.

4. Высокая корреляция IO с bo и dirty pages с bo при 3000 – процессы записи стали узким местом, возможно, из-за частых контрольных точек или активности фоновых писателейℹ️.

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

1. Хроническая нехватка оперативной памяти – свободная RAM <5% практически всё время, высокий риск свопинга (в эксперименте-1 наблюдался swap out в 6% времени).

2. Перегрузка дисковой подсистемы – wa > 10% более 80% времени, скорость операций сильно зависит от объёма записи.

3. Падение idle CPU – негативный тренд, процессорное время занято обработкой системных вызовов и переключениями контекста.

4. ⚠️Высокие накладные расходы ядра – сильные корреляции sy с LWLock, dirty pages, IPC свидетельствуют о значительных затратах CPU на управление памятью и синхронизацию.

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

Увеличение max_connections с 30 до 3000 привело к следующим последствиям:

  • Операционная скорость незначительно снизилась (менее 3%), пиковые ожидания немного выросли. Система сохранила способность обрабатывать нагрузку, но с изменением профиля узких мест.
  • ℹ️Перераспределение приоритетов ожиданий: роль дисковых ожиданий (IO) уменьшилась, а роль легковесных блокировок (LWLock) существенно возросла. ➡️Это типичный эффект при увеличении параллелизма – конкуренция за общие ресурсы памяти начинает доминировать над дисковыми задержками⬅️.
  • Усиление корреляций с дисковыми записями (IO с bo, dirty pages с bo) указывает на то, что процессы записи стали более интенсивными и синхронизированными с ожиданиями. Возможно, увеличилось количество изменяющих данные транзакций или фоновые процессы (checkpointer, bgwriter) работают агрессивнее.
  • ➡️Объём dirty pages вырос на 28% – признак более высокой скорости генерации грязных страниц.
  • Связь переключений контекста с пользовательским временем усилилась, что может быть следствием роста числа активных пользовательских процессов.
  • Проблемы инфраструктуры (память, диск, CPU) остались теми же и даже немного усугубились (wa стал чаще превышать 10%, hit ratio чуть снизился).

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

  • Для снижения конкуренции за LWLock рассмотреть возможность использования пула соединений (например, PgBouncer), чтобы уменьшить число одновременно активных процессов.
  • Оптимизировать запросы с queryid 3551573579203076618, так как он генерирует основную массу всех типов ожиданий.
  • Увеличить shared_buffers с осторожностью (уже 4 ГБ при 7.5 ГБ RAM), возможно, добавить оперативной памяти или уменьшить потребление другими процессами.
  • Настроить параметры контрольных точек (checkpoint_timeout, max_wal_size) для более плавной записи, чтобы снизить нагрузку на диск.
  • Проанализировать работу автовакуума и фоновых писателей (bgwriter) для сглаживания пиков записи.
  • Рассмотреть использование более быстрых дисков (например, NVMe) для данных и WAL.

ℹ️Таким образом, увеличение max_connections до 3000 не привело к коллапсу производительности, но изменило характер узких мест, требуя перенастройки СУБД для работы с большим числом соединений.

Послесловие

Подводя итог этому исследованию, можно уверенно сказать: эксперимент подтвердил эффективность тандема PG_EXPECTO v.7 и DeepSeek. Статистическое ядро PG_EXPECTO позволило не утонуть в шуме метрик, а математически точно выделить критические паттерны (IPC, LWLock, нехватку памяти). DeepSeek, в свою очередь, выступил в роли моста между сухими цифрами и инженерным решением, структурировав выводы в формат, готовый к практическому внедрению.

➡️Это не просто автоматизация, а новый уровень объективности в диагностике PostgreSQL.

Применение pg_expecto v.7 для анализа паттернов нагрузки OLTP и OLAP