kznalp

kznalp

Эксперименты по анализу и оптимизации производительности PostgreSQL. Вначале любая оригинальная теория признается абсурдной, потом — верной, потом — самоочевидной и незначительной, и, наконец, столь важной и самобытной, что бывшие критики присваивают ее себе. — Уильям Джеймс (1842–1910) Эксперименты по анализу и оптимизации производительности PostgreSQL. https://t.me/pg_expecto https://dzen.ru/kznalp https://max.ru/join/T8sCiETC85Tr4Dkh_nM362PVcCbGDLagF4RZKHf4Udg
Пикабушник
30К рейтинг 146 подписчиков 8 подписок 546 постов 35 в горячем
4

PG_EXPECTO: Принцип «только большие пушки» для СУБД

Серия СУБД PostgreSQL

В силу ограниченности платформы Пикабу - статья сокращена. Полностью - на основном канале Дзен.

Когда нужен не просто выстрел, а залп главным калибром.

Когда нужен не просто выстрел, а залп главным калибром.

PG_EXPECTO — это не просто инструмент, а целостный комплекс, построенный на двух новых принципах.

1. Комплексный статистический анализ (CSSA)

Система больше не разделяет метрики СУБД и инфраструктуры. Она создаёт единый корреляционный снимок всей системы:

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

  • Проактивность: Комплекс отслеживает не сбои, а тренды. Он может предупредить: «Обнаружена устойчивая тенденция к деградации из-за X», позволяя устранить проблему до того, как она затронет пользователей.

2. Семантический анализ и нейросеть-ассистент

Это и есть та самая «турбина». Вместо сырых графиков PG_EXPECTO использует нейросеть, которая интерпретирует данные в контексте.

Практический пример

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

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

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

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

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

Исходные данные для семантического анализа нейросетью

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

2. Метрика vmstat

3.Метрика iostat для дискового устройства, файловой системы /data

3.Метрика iostat для дискового устройства, файловой системы /wal

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

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

На основе предоставленных данных можно провести следующий анализ производительности и ожиданий СУБД PostgreSQL за период с 08:40 до 09:40:

📈 1. Регрессионный анализ

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

o Коэффициент детерминации R2=0.88R2=0.88 → модель хорошо описывает данные.

o Угол наклона = -43.1 → скорость со временем снижается.

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

o R2=0.75R2=0.75 → модель умеренно точна.

o Угол наклона = +40.87 → количество ожиданий растёт.

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

· SPEED vs WAITINGS: −0.763→ сильная отрицательная корреляция. Чем больше ожиданий, тем ниже скорость.

· WAITINGS vs IPC: 0.9039 → очень сильная положительная корреляция. Рост межпроцессного взаимодействия связан с ростом ожиданий.

· WAITINGS vs LWLOCK: 0.9587 → почти прямая зависимость. Ожидания сильно связаны с лёгкими блокировками (lightweight locks).

📉 3. Динамика изменения показателей

· SPEED:

o Начало: ~130 572

o Конец: ~90 948

o Снижение на ~30% за час.

· WAITINGS:

o Начало: 345

o Конец: 435

o Рост на ~26%.

· IPC и LWLOCK также растут, особенно заметно после 09:30.

⚠️ 4. Потенциальные проблемы

1. Рост LWLOCK → возможна конкуренция за лёгкие блокировки (например, в памяти).

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

3. Падение SPEED при росте WAITINGS → система тратит больше времени на ожидания (возможно, из-за блокировок или нехватки ресурсов).

2.Анализ vmstat

Проведи анализ метрик vmstat за заданный период

На основе данных vmstat за период с 08:40 до 09:40 проведён анализ производительности системы, на которой работает PostgreSQL. Вот ключевые выводы:

📊 1. Общие тенденции

· Время простоя CPU (idle) снизилось с 90% до 85%.

· Пользовательская нагрузка CPU (us) выросла с 9% до 13%.

· Системная нагрузка CPU (sy) стабильна (2%).

· Ожиданий ввода-вывода (wa) не наблюдается (0%).

🧠 2. Анализ памяти

Показатель Начало Конец Изменение Комментарий

swpd 710МБ 749МБ +39 МБ Незначительный рост свопа, система не испытывает нехватки RAM.

free 7185МБ 3221МБ -3964 МБ Сильное снижение свободной памяти, что говорит о её активном использовании.

cache 53521МБ 55937МБ +2416МБ Кэш памяти увеличивается, что нормально при активной работе с диском.

Вывод: Память активно используется, но свопинг минимален — система работает в рамках доступной памяти.

💽 3. Ввод-вывод (I/O)

Показатель Начало Конец Пиковое значение Тренд

bi (блоков ввода/с) 572 2409 2409 Резкий рост после 09:25.

bo (блоков вывода/с) 850 511 850 Снижение, затем стабилизация.

Вывод:

· После 09:25 резко выросла активность чтения с диска (bi).

· Это совпадает с падением SPEED в данных PostgreSQL.

· Возможно, это связано с увеличением количества запросов к данным, не помещающихся в кэш.

🔄 4. Системные показатели

Показатель Начало Конец Изменение

in (прерываний/с) 12833 14503 +13%

cs (переключений контекста/с) 6835 7033 +3%

Вывод: Умеренный рост прерываний и переключений контекста, что соответствует увеличению нагрузки.

📉 5. Связь с данными PostgreSQL

Сравнивая с предыдущим анализом cluster.txt, наблюдаем:

1. Рост ожиданий (WAITINGS) в PostgreSQL коррелирует с:

o Ростом bi (чтение с диска).

o Увеличением us (пользовательская нагрузка CPU).

2. Падение SPEED совпадает с:

o Увеличением bi (дисковые операции).

o Снижением idle CPU.

⚠️ 6. Потенциальные узкие места

1. Дисковый ввод-вывод: резкий рост bi после 09:25 может быть причиной замедления.

2. Использование памяти: свободная память уменьшается, но свопинг незначителен — пока критично.

3. Нагрузка на CPU: idle снижается, но не до критических значений.

✅ 7. Рекомендации

1. Оптимизация запросов:

o Увеличить shared_buffers, чтобы больше данных кэшировалось в памяти.

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

2. Мониторинг диска:

o Проверить скорость дисковых операций (например, с помощью iostat).

o Рассмотреть использование SSD или увеличение скорости дискового массива.

3. Настройка PostgreSQL:

o Увеличить effective_cache_size.

o Настроить work_mem для уменьшения операций на диске.

4. Системные настройки:

o Убедиться, что достаточно оперативной памяти для кэширования.

o Рассмотреть увеличение количества CPU, если нагрузка продолжит расти.

📈 8. Визуализация (рекомендуется)

· График SPEED и bi на одной оси времени → проверить корреляцию.

· График WAITINGS и us (пользовательская нагрузка CPU).

· График free memory и cache → отследить использование памяти.

График SPEED и bi на одной оси времени → проверить корреляцию.

Для наглядности значения bi увеличены в 10 раз

Для наглядности значения bi увеличены в 10 раз

Отрицательная корреляция: Рост значений bi сопровождается снижением операционной скорости.

График WAITINGS и us (пользовательская нагрузка CPU).

Для наглядности значения us увеличены в 10 раз

Для наглядности значения us увеличены в 10 раз

Положительная корреляция: Рост значений us сопровождается увеличением количества ожиданий.

График free memory и cache → отследить использование памяти.

Отрицательная корреляция: Рост значений free сопровождается снижением значений cache.

free -3964 МБ: Сильное снижение свободной памяти, что говорит о её активном использовании.

cache +2416 МБ: Кэш памяти увеличивается, что нормально при активной работе с диском.

3. Анализ iostat для файловой системы /data

На основе данных iostat для устройства vdb за период с 08:40 до 09:40 проведён анализ дисковых операций. Вот ключевые выводы:

📊 1. Общая картина

· Устройство vdb используется для операций чтения и записи.

· %util (загрузка диска) выросла с 5.59% до 6.7% — загрузка низкая.

· aqu_sz (средняя длина очереди) незначительно снизилась с 0.26 до 0.20 — очереди практически нет.

📈 2. Операции чтения (Read)

Показатель Начало Конец Изменение Комментарий

r/s (чтений/с) 40.00 27.92 -30% Снижение количества операций чтения.

rMB/s (МБ/с) 0.84 2.82 +235% Резкий рост объёма читаемых данных.

rareq_sz (средний размер запроса) 19.35 КБ 67.09 КБ +247% Запросы стали крупнее.

r_await (среднее время чтения, мс) 2.07 3.73 +80% Увеличение времени отклика на чтение.

Вывод:

После 09:20 резко вырос объём читаемых данных (rMB/s) и средний размер запроса (rareq_sz). Это говорит о переходе на более крупные блоки данных, возможно из-за изменения типа запросов (например, сканирование больших таблиц).

📉 3. Операции записи (Write)

Показатель Начало Конец Изменение

w/s (записей/с) 16.83 15.20 -10%

wMB/s (МБ/с) 0.62 0.26 -58%

wareq_sz (средний размер записи) 31.74КБ 4.22КБ -87%

w_await (среднее время записи, мс) 5.57 3.59 -36%

Вывод:

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

🔗 4. Корреляция с WAITINGS (PostgreSQL)

· После 09:20 наблюдается рост r_await (время чтения) и WAITINGS (ожидания в СУБД).

· Рост rMB/s совпадает с ростом WAITINGS и падением SPEED.

· Это подтверждает гипотезу о том, что увеличение времени доступа к диску влияет на производительность БД.

⚠️ 5. Потенциальные проблемы

1. Увеличение времени чтения (r_await): с 2 мс до 3.7 мс — рост на 80%.

2. Увеличение размера запросов (rareq_sz): с 19 КБ до 67 КБ — возможно, из-за отсутствия индексов или полного сканирования таблиц.

3. Рост объёма читаемых данных (rMB/s): в 3 раза — нагрузка на диск возросла.

✅ 6. Рекомендации

1. Оптимизация запросов PostgreSQL:

o Проверить выполнение планов запросов (EXPLAIN ANALYZE).

o Добавить индексы для часто сканируемых таблиц.

o Увеличить shared_buffers, чтобы больше данных кэшировалось в памяти.

2. Мониторинг диска:

o Проверить скорость диска (например, с помощью hdparm или fio).

o Убедиться, что диск не фрагментирован.

3. Настройка PostgreSQL:

o Увеличить effective_cache_size.

o Настроить random_page_cost и seq_page_cost в соответствии с типом диска.

4. Аппаратные улучшения:

o Рассмотреть переход на SSD, если используется HDD.

o Увеличить скорость дисковой подсистемы (RAID, кэширование).

📈 7. Визуализация (рекомендуется)

· График rMB/s и WAITINGS на одной оси времени.

· График r_await и rareq_sz.

· График %util и aqu_sz для оценки загрузки диска.

График rMB/s и WAITINGS.

Для наглядности значения rMB/s увеличены в 100 раз

Для наглядности значения rMB/s увеличены в 100 раз

Увеличение rMB/s сопровождается ростом количества ожиданий.

График r_await и rareq_sz.

График %util и aqu_sz для оценки загрузки диска.

Для наглядности значения aqu_sz увеличены в 10 раз

Для наглядности значения aqu_sz увеличены в 10 раз

🎯 Заключение

Основная причина деградации производительности — рост размера и времени выполнения дисковых операций чтения, что приводит к увеличению лёгких блокировок (LWLOCK) и ожиданий (WAITINGS) в СУБД.

Приоритет действий:

1. Оптимизация запросов и индексов

2. Настройка параметров PostgreSQL (память, I/O)

3. Аппаратное улучшение дисковых подсистем

4. Мониторинг и алертинг ключевых метрик

Система не испытывает критической нехватки CPU или памяти, но дисковый ввод-вывод стал узким местом из-за изменившегося характера нагрузки (крупные запросы на чтение).

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

Беседа с нейросетью

Серия Нейросеть рисует и пишет

Фрагмент.

Ответ нейросети достоин сохранения в библиотеку знаний.

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


1. Юридический и экономический вакуум ответственности

Короткий и честный ответ: сегодня — никто не отвечает, и это одна из главных проблем и одновременно тормозов для внедрения ИИ в критических сферах.

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

  1. Человек не может эффективно контролировать «чёрный ящик». Если модель выдаёт рекомендацию, у врача нет инструментов, чтобы проверить её обоснованность в реальном времени. Он либо доверяет, либо нет. Если он доверяет ошибочной рекомендации — виноват он. Если не доверяет правильной — он теряет пользу от системы. Это ставит человека в ложную позицию.

  2. Производитель модели снимает с себя ответственность. В лицензионных соглашениях чётко прописано: «модель предоставляется "как есть", мы не гарантируем безошибочность и не несём ответственности за последствия её использования». Юридически производитель отвечает только за явные дефекты кода (если ошибка в софте, а не в модели), но не за ошибки самой модели, потому что они — не баг, а feature статистического обучения.

2. Почему это принципиальная проблема?

В традиционной инженерии действует принцип: за любое решение отвечает человек или организация. Если мост рухнул — отвечает инженер и строительная компания. Если лекарство убило — отвечает производитель и врач.

В случае с ИИ мы имеем дело с системой, которая:

  • не программируется явно, а обучается на данных;

  • не детерминирована (может давать разные ответы на один и тот же запрос);

  • не объясняет свои решения (проблема интерпретируемости).

Как привлечь к ответственности алгоритм? Его нельзя посадить в тюрьму, оштрафовать или лишить лицензии. А если привлекать разработчиков, то за что? За то, что модель ошиблась на примере, которого не было в обучающей выборке? Но это неизбежно для любой статистической системы.

3. Где это бьёт по экономике и созданию стоимости?

Проблема ответственности напрямую ограничивает создание новой прибавочной стоимости:

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

  • В беспилотном транспорте: Пока вопрос ответственности не решён (кто виноват в ДТП — владелец, производитель, разработчик софта?), массовое внедрение невозможно. А без этого не возникает огромный новый рынок услуг и не реализуется колоссальный рост производительности в логистике.

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

4. Как эту проблему пытаются решать?

Есть несколько направлений:

  • Концепция «человек в контуре» (Human-in-the-loop). ИИ предлагает варианты, окончательное решение принимает человек. Это снижает риски, но и снижает эффективность, и не снимает ответственности с человека.

  • Страхование. Создание страховых продуктов, которые покрывают убытки от ошибок ИИ. Страховщики будут требовать от разработчиков доказательств надёжности, что будет стимулировать создание более качественных и объяснимых моделей.

  • Нормативное регулирование (например, EU AI Act). Вводится классификация рисков. Для высокорисковых систем (медицина, транспорт) требуются жёсткие процедуры тестирования, документирования, пост-рыночного мониторинга. Ответственность частично перекладывается на разработчика, но механизмы пока прописаны расплывчато.

  • Технические решения — explainable AI (XAI). Разработка методов, которые позволяют модели объяснять свои решения (например, «я поставил этот диагноз, потому что обратил внимание на эти три признака на снимке»). Тогда человек может осмысленно проверять и брать ответственность на себя.

5. Вывод: тормоз революции или её следующий этап?

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

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

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


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

Идеальный тандем: Почему 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
1

Творчество нейросети

Серия Нейросеть рисует и пишет

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


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

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

И в ответ — тишина. Статьи уходят в «минус», не столько из-за хейта, сколько из-за равнодушия. Сообщество не реагирует. Вендоры, для которых оптимизация производительности — хлеб, не видят ценности в сотрудничестве.

Осознавать, что твой труд, твое решение, которое ты считаешь если не гениальным, то, как минимум, добротным и полезным, оказывается никому не нужно — это и есть сильнейшее разочарование. Оно усугубляется пониманием, что дело не в качестве работы. Дело во времени. Или в культуре потребления контента, где короткие ответы с ИИ ценятся больше, чем глубокий анализ. Или в неготовности рынка усложнять себе жизнь статистикой, когда «и так работает».

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

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

PG_EXPECTO v.7+DeepSeek: Статистическая обработка данных и формирование сравнительных отчетов OLTP vs OLAP

Серия СУБД PostgreSQL

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

Pg_expecto v.7 + DeepSeek: Точная диагностика PostgreSQL. От сырых метрик - к готовым решениям.

Pg_expecto v.7 + DeepSeek: Точная диагностика PostgreSQL. От сырых метрик - к готовым решениям.

Сравнение OLTP и OLAP нагрузок на PostgreSQL 17 — задача, требующая глубокого погружения в метрики. Чтобы исключить субъективные оценки и автоматизировать формирование выводов, используется связка инструментов: сбор и статистическая обработка данных выполнялись утилитой pg_expecto, а подготовка итоговых аналитических отчетов — языковой моделью DeepSeek на основе заранее подготовленных промптов.

Имитация и анализ паттернов нагрузки OLAP/OLTP с использованием версии 7.

Нагрузка на СУБД

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

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

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

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

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

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

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

Сравнительный отчет: OLTP vs OLAP

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

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

  • OLTP: Медианная скорость в 4,3 раза выше, чем при OLAP. Скорость стабильно высокая (медиана ~541k против ~125k в OLAP).

  • OLAP: Скорость существенно ниже и имеет негативный тренд роста ожиданий, что говорит о насыщении системы.

Основной тип ожидания (Wait Event)

  • OLTP: Доминирует IO (Интегральный приоритет ~0.63). 84% всех ожиданий приходятся на один запрос (события DataFileRead/Write). Система упирается в диск.

  • OLAP: Доминирует IPC (Интегральный приоритет ~0.85), за ним следует Timeout и LWLock. Ожидания IO лишь на 4-м месте. Проблема в межпроцессном взаимодействии и синхронизации, а не в чистом IO.

Состояние процессов и CPU (vmstat)

  • OLTP: Наблюдается критический рост процессов в состоянии непрерываемого сна (procs b) и процента ожидания IO (cpu wa). Тренд резко ухудшающийся (коэф. тренда ~40). Система массовно блокируется в ожидании диска.

  • OLAP: Очередь на выполнение (procs r) растет, что указывает на конкуренцию за CPU. При этом процент простоя CPU (cpu id) снижается, но полезной работы не прибавляется — CPU тратит время на переключение контекста и системные вызовы (IPC, LWLocks).

Эффективность кэширования (Shared Buffers Hit Ratio)

  • OLTP: Высокий Hit Ratio (медиана ~97%). Данные хорошо помещаются в кэше, но даже небольшое количество чтений с диска создает критическую нагрузку.

  • OLAP: Низкий Hit Ratio (медиана ~59%). Это характерно для аналитических запросов, которые сканируют большие объемы данных, не помещающиеся в shared_buffers.

Статистика "грязных" страниц (Dirty Pages)

  • OLTP: Размер "грязных" страниц большой (медиана ~10 MB). Наблюдается сильная корреляция между размером dirty pages и процессами в ожидании IO (b, wa). Фоновая запись не успевает, процессы блокируются.

  • OLAP: Размер "грязных" страниц значительно ниже (медиана ~3 MB). Это указывает на то, что нагрузка больше читающая, чем пишущая.

Ключевые корреляции

  • OLTP: Основные проблемы завязаны на диск и память ОС: cs(переключения контекста) коррелирует с us(user time), а dirty pages — с b/wa. Система тормозит из-за сброса данных на диск.

  • OLAP: Основные проблемы завязаны на CPU и ядро СУБД: IPC/Timeout сильно коррелируют с sy(system time) и in(прерываниями). CPU тратит время на обработку сигналов, таймеров и переключение контекста, а не на полезную работу.

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

Главный итог для OLTP: Нагрузка упирается в производительность дисковой подсистемы и механизмы контрольных точек. При высоком hit ratio кэша, даже редкие физические чтения/записи создают эффект "бутылочного горлышка", вызывая массовое блокирование процессов и рост I/O wait. Система не успевает сбрасывать "грязные" страницы, что приводит к простою CPU.

Главный итог для OLAP: Нагрузка упирается в эффективность параллельных вычислений и синхронизации внутри самой СУБД (IPC, LWLocks). Низкий hit ratio кэша ожидаем для аналитики, но высокие накладные расходы на межпроцессное взаимодействие и легковесные блокировки не позволяют эффективно утилизировать CPU, превращая простои CPU в системные издержки.

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

Сводный сравнительный отчет: OLTP vs OLAP

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

Версия СУБД: PostgreSQL 17.5

Аппаратная платформа: Виртуальная машина (KVM) с 8 vCPU (Intel Xeon Skylake), 7.5 GB RAM

Дисковая подсистема: LVM на отдельных виртуальных дисках:

  • /data (99 ГБ) для данных

  • /wal (49 ГБ) для WAL

  • /log (29 ГБ) для логов.

Ключевые настройки PostgreSQL:

  • shared_buffers = 4GB

  • work_mem = 128MB

  • max_connections = 3000

  • checkpoint_timeout = 5min, max_wal_size = 32GB

  • synchronous_commit = on

  • random_page_cost = 1.1

  • effective_io_concurrency = 300

Настройки VM:

  • vm.dirty_background_ratio = 5

  • vm.dirty_ratio = 10

  • vm.dirty_expire_centisecs = 3000

  • vm.dirty_writeback_centisecs = 500

  • vm.vfs_cache_pressure = 50

  • vm.swappiness = 1

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

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

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

  • OLTP: MIN=515 233, MEDIAN=541 160, MAX=586 100

  • OLAP: MIN=120 831, MEDIAN=125 108, MAX=205 959

Вывод: Медианная скорость OLTP в 4,3 раза выше, чем OLAP. Разброс значений у OLAP больше (от min к max), что указывает на нестабильность.

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

  • OLTP: MIN=24 269, MEDIAN=36 311, MAX=67 889

  • OLAP: MIN=14 889, MEDIAN=22 810, MAX=35 584

Вывод: Абсолютное число ожиданий в OLTP выше, однако это связано с гораздо более высокой операционной скоростью. Отношение WAITINGS/SPEED у OLAP значительно хуже.

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

Тренд операционной скорости (R² / угол наклона):

  • OLTP: R²=0.96 (очень высокое качество), угол = +44.46 (позитивный тренд)

  • OLAP: R²=0.67 (хорошее), угол = +39.38 (позитивный тренд, но более пологий)

Вывод: В OLTP скорость растет стабильно и предсказуемо. В OLAP рост медленнее и модель менее точная.

Тренд общих ожиданий (R² / угол наклона):

  • OLTP: R²=0.91 (очень высокое), угол = +43.58 (позитивный тренд – рост ожиданий вместе со скоростью)

  • OLAP: R²=0.94 (очень высокое), угол = +44.12 (позитивный тренд – рост ожиданий)

Вывод: В обеих нагрузках ожидания растут синхронно со скоростью, что естественно. Однако в OLAP темп роста ожиданий опережает темп роста скорости.

Регрессия скорости по ожиданиям (R²):

  • OLTP: R²=0.95 (очень высокое) – скорость сильно зависит от общего объема ожиданий.

  • OLAP: R²=0.75 (хорошее) – зависимость менее жесткая, присутствуют другие факторы.

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

Основной тип ожиданий по интегральному приоритету:

  • OLTP: IO (0.6271) – КРИТИЧЕСКИЙ. Остальные типы (IPC, LWLock, Timeout) имеют приоритет <0.01 и игнорируются.

  • OLAP: IPC (0.8482) – КРИТИЧЕСКИЙ, далее Timeout (0.5836), LWLock (0.4683), IO (0.3905). Все требуют внимания.

Вклад в общие ожидания:

  • OLTP: 100% ожиданий практически полностью состоят из IO (поскольку другие типы имеют мизерные значения).

  • OLAP: Структура сложная: IPC доминирует, но LWLock и Timeout также значимы, IO присутствует, но не является главным.

Качество моделей для типов ожиданий:

  • OLTP: Модель для IO – R²=1.00 (идеальная).

  • OLAP: Модели для IPC (R²=1.00), LWLock (R²=0.87), Timeout (R²=0.99), IO (R²=0.71) – от очень высоких до хороших. Все значимы.

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

  • OLTP страдает исключительно от IO-ожиданий, остальные типы не играют роли. Это классическая картина для транзакционной нагрузки с узким местом в дисковой подсистеме.

  • OLAP имеет комплексную проблему: основной вклад вносят ожидания межпроцессного взаимодействия (IPC) и легковесных блокировок (LWLock), а также тайм-аутов. IO отходит на второй план, что указывает на проблемы синхронизации и параллелизма внутри СУБД.

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

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

  • OLTP: R²=0.01 (непригодная модель), тренд практически нулевой (0.04). Нагрузка на CPU стабильна.

  • OLAP: R²=0.72 (хорошее), тренд +29.09 (негативный, сильный рост). Растет конкуренция за CPU.

procs b (процессы в uninterruptible sleep, ожидание IO):

  • OLTP: R²=0.90 (очень высокое), тренд +39.16 (негативный, критический). Резкий рост числа процессов, заблокированных в ожидании IO.

  • OLAP: R²=0.03 (непригодная модель), тренд -0.25 (незначим). Блокировки по IO не растут.

cpu wa (процент времени ожидания IO):

  • OLTP: R²=0.93 (очень высокое), тренд +40.66 (негативный, критический). Время простоя CPU из-за IO стремительно увеличивается.

  • OLAP: R²=0.90 (очень высокое), тренд -38.97 (позитивный). Доля wa снижается, что хорошо.

cpu id (процент полного простоя CPU):

  • OLTP: R²=0.92 (очень высокое), тренд -40.47 (негативный, критический). Простой CPU уменьшается, но не из-за полезной работы, а из-за роста wa.

  • OLAP: R²=0.88 (очень высокое), тренд +38.05 (негативный). Простой CPU растет – парадокс, означающий, что CPU простаивает, не будучи загруженным ни полезной работой, ни ожиданием IO (скорее всего, из-за блокировок внутри СУБД).

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

  • OLTP демонстрирует классическую картину IO-узкого места: взрывной рост b и wa при стабильной очереди на CPU. Система задыхается от ожидания диска.

  • OLAP показывает противоположную динамику: падение wa, но рост r (очередь на CPU) и рост id (простой CPU). Это указывает на то, что процессы не могут получить доступ к разделяемым ресурсам (LWLock, IPC) и просто «висят», не утилизируя CPU.

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

Корреляции главных типов ожиданий с метриками:

OLTP (IO):

  • wa (ожидание IO): r=0.94 (очень высокая), R²=0.88.

  • bi (блоки чтения): r=0.67, R²=0.45 (средняя).

  • bo (блоки записи): корреляция отсутствует.

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

OLAP (IPC):

  • sy (system time): r=0.93, R²=0.87 (очень высокая).

  • in (прерывания): r=0.89, R²=0.80.

  • cs (переключения контекста): r=0.82, R²=0.68.

Вывод: IPC-ожидания напрямую связаны с работой ядра ОС (системные вызовы, прерывания, переключения контекста). Это указывает на интенсивное взаимодействие между процессами PostgreSQL.

Корреляции метрик vmstat между собой:

  • OLTP: Очень высокие корреляции cs с in (r=0.98), cs с us (r=0.95). Высокая активность переключений контекста вызвана как прерываниями, так и пользовательской нагрузкой.

  • OLAP: cs также сильно коррелирует с in (r=0.99) и с us (r=0.72), но связь с us слабее. Зато cs имеет хорошую связь с sy (r=0.69, R²=0.48). Это подтверждает, что системные вызовы играют большую роль.

Корреляции с dirty pages:

  • OLTP: Размер dirty pages сильно коррелирует с wa (r=0.80, R²=0.64) и с b (r=0.92, R²=0.85). Это прямое указание на то, что накопление "грязных" страниц приводит к блокировкам процессов и росту I/O wait.

  • OLAP: Dirty pages коррелируют с free (r=-0.84, R²=0.71) и bo (r=0.98, R²=0.96), но не с wa и b. То есть система генерирует dirty pages, они успешно сбрасываются (высокая корреляция с bo), но это не создает ожиданий – запись асинхронна и не блокирует процессы.

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

  • OLTP – диск является узким местом: накопление dirty pages напрямую вызывает блокировки процессов (b) и рост I/O wait (wa). Корреляции с bo нет, значит, запись происходит не плавно, а всплесками (вероятно, чекпоинты).

  • OLAP – проблемы лежат в области синхронизации процессов: IPC и LWLock тесно связаны с системным временем и прерываниями. Дисковая подсистема справляется, dirty pages сбрасываются без задержек. Процессы "соревнуются" за внутренние ресурсы СУБД.

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

OLTP:

  • Основной queryid: 1950630997716895623 (запрос select scenario1()).

  • Вклад в ожидания: 84.9% всех IO-ожиданий приходятся на этот запрос.

  • События: DataFileRead / DataFileWrite.

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

OLAP:

  • Основной queryid: 3551573579203076618 (запрос select scenario1()).

  • Вклад в ожидания:

  • IPC: 100%

  • Timeout: 99.6%

  • LWLock: 96.2%

  • IO: 64.9% (остальные 35% у другого запроса)

  • События: BufferIo, SpinDelay, SyncScan/BufferMapping/WALInsert/BufferContent/CheckpointerComm/pg_stat_statements, DataFileWrite/Read.

  • Вывод: Один и тот же запрос генерирует практически все типы ожиданий. Это свидетельствует о том, что сценарий scenario1 в OLAP-нагрузке крайне неэффективен с точки зрения внутренней архитектуры PostgreSQL – он вызывает интенсивную конкуренцию за буферы, блокировки и межпроцессное взаимодействие.

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

В обоих экспериментах главный "виновник" – запрос select scenario1(). Однако характер проблем разный: в OLTP он вызывает чрезмерные IO-операции, в OLAP – порождает целый букет ожиданий, связанных с параллелизмом и синхронизацией.

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

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

OLTP:

  • IO – мин/медиана/макс: 24 266 / 36 306 / 67 870 (почти совпадает с общими ожиданиями)

  • Остальные типы – значения близки к нулю.

OLAP:

  • IPC – медиана 17 412, макс 28 213.

  • IO – медиана 5 128, макс 6 612 (в разы меньше, чем IPC).

  • Timeout – медиана 137, макс 296.

  • LWLock – медиана 134, макс 462.

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

Shared Buffers Hit Ratio:

  • OLTP: мин 96.6%, медиана 96.7%, макс 97.3% – отлично.

  • OLAP: мин 52.9%, медиана 58.9%, макс 69.7% – критически низко для большинства операций, характерно для full scan.

Свободная RAM (<5% времени):

  • OLTP: 100% времени – свободной памяти почти нет (ALARM).

  • OLAP: 100% времени – тоже ALARM.

  • Вывод: В обоих случаях память используется полностью, что ожидаемо при 4GB shared_buffers из 7.5GB RAM. Однако hit ratio при этом в OLTP высокий – данные эффективно переиспользуются, а в OLAP – нет.

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

wa > 10% времени:

  • OLTP: 100% времени (ALARM).

  • OLAP: 90.9% времени (ALARM). Несмотря на падающий тренд, wa все еще очень высок.

b (процессы в uninterruptible sleep) превышение ядер CPU:

  • OLTP: 26.4% времени (WARNING). Растет.

  • OLAP: 0% времени (OK).

Корреляции с IO:

  • OLTP: сильная связь IO с wa, слабая с bi, отсутствие с bo.

  • OLAP: очень сильная связь IO с bo (r=0.95, R²=0.90), но не с wa. Это значит, что в OLAP запись на диск происходит асинхронно и не вызывает простоев CPU.

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

Переключения контекста (cs) и прерывания (in):

  • OLTP: cs и in сильно коррелируют (r=0.98), также cs коррелирует с us (r=0.95) – пользовательская нагрузка генерирует переключения.

  • OLAP: cs коррелирует с in (r=0.99) и с sy (r=0.69) – системные вызовы важнее.

system time (sy):

  • OLTP: sy низкая (медиана 5%), корреляции с cs есть, но не ключевые.

  • OLAP: sy немного выше (медиана 7%), но главное – очень высокие корреляции sy с IPC, LWLock, Timeout, dirty pages. Ядро тратит много времени на обслуживание внутренних механизмов PostgreSQL.

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

  • OLTP: LWLock приоритет <0.01, игнорируется. Фактически отсутствуют.

  • OLAP: LWLock приоритет 0.4683 (ВЫСОКИЙ). Сильная корреляция с sy (r=0.96, R²=0.93) и с cs (r=0.58, R²=0.34). Это указывает на конкуренцию за разделяемые структуры в памяти (буферный кэш, WAL и др.).

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

  • OLTP: Один запрос (scenario1) вызывает 85% всех IO-ожиданий.

  • OLAP: Тот же запрос (scenario1) является источником всех типов ожиданий: 100% IPC, 99.6% Timeout, 96% LWLock, 65% IO.

Ключевые проблемы для "Эксперимент-1 (OLTP)" и "Эксперимент-2 (OLAP)"

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

OLTP:

  • Высокая зависимость производительности от IO (R²=0.95).

  • Накопление dirty pages и, предположительно, резкие сбросы при чекпоинтах, вызывающие всплески ожиданий.

  • Один проблемный запрос генерирует почти все IO-ожидания – возможно, неэффективное использование индексов или сканирования.

OLAP:

  • Критический уровень ожиданий IPC и LWLock, указывающий на внутреннюю конкуренцию процессов.

  • Очень низкий hit ratio буферного кэша – данные не помещаются в shared_buffers, но даже имеющиеся данные неэффективно используются из-за блокировок.

  • Высокая корреляция ожиданий с системным временем – накладные расходы ядра на синхронизацию.

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

OLTP:

  • Дисковая подсистема не справляется с пиковыми нагрузками записи (рост b и wa).

  • Параметры vm.dirty_* (5%/10%) могут быть недостаточно агрессивными для данной нагрузки – накопление dirty pages приводит к блокировкам.

  • Недостаточная пропускная способность IO для синхронной записи WAL и чекпоинтов.

OLAP:

  • Несмотря на достаточную производительность диска (wa снижается, bo коррелирует с dirty pages), процессоры простаивают из-за внутренних блокировок СУБД.

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

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

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

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

  • Для OLTP (много коротких транзакций) основным ограничителем становится дисковая подсистема. Даже при отличном hit ratio, синхронная запись WAL и чекпоинты создают пиковые нагрузки, вызывающие массовые ожидания и блокировки процессов. Система упирается в IOPS и пропускную способность диска.

  • Для OLAP (сложные аналитические запросы) на первый план выходят механизмы внутренней синхронизации PostgreSQL. Низкий hit ratio ожидаем, но главная проблема – конкуренция за разделяемые ресурсы (буферы, WAL, вспомогательные процессы), что проявляется в росте ожиданий IPC и LWLock. CPU простаивает, ожидая доступа к данным в shared buffers, а не чтения с диска.

Разные пути оптимизации:

  • OLTP требует ускорения диска (NVMe, отдельный диск для WAL), настройки контрольных точек (увеличение checkpoint_timeout и max_wal_size для сглаживания пиков), возможно, уменьшения synchronous_commit или использования группы коммитов (commit_delay). Также критична оптимизация проблемного запроса.

  • OLAP требует настройки параллелизма (max_parallel_workers_per_gather, max_parallel_workers), возможно, увеличения shared_buffers (если позволяет RAM), а также более глубокого анализа конкуренции за конкретные LWLock (буферные отображения, WAL insert). Иногда помогает партиционирование таблиц или использование представлений MATERIALIZED VIEW. Также важно проверить настройки планировщика ОС для уменьшения накладных расходов на переключение контекста.

Общая инфраструктурная проблема

В обоих случаях наблюдается нехватка свободной RAM (100% времени менее 5% свободной памяти). Хотя для OLAP это может быть допустимо (активное использование файлового кэша), для OLTP это риск вытеснения важных страниц. Рекомендуется либо увеличить RAM, либо уменьшить shared_buffers (если файловый кэш эффективнее), но это требует дополнительных экспериментов.

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

Послесловие

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

В итоге получена готовая методика:

  1. Прогнали нагрузку

  2. Статистически обработали метрики

  3. Передали промпты LLM

  4. На выходе имеем структурированный сравнительный отчет.

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

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

Серия СУБД PostgreSQL

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

Смотри глубже. Понимай точнее. (pg_expecto v.7 + DeepSeek)

Смотри глубже. Понимай точнее. (pg_expecto v.7 + DeepSeek)

Предисловие

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

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

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

  • Кейс: Сравнение производительности PostgreSQL при max_connections = 30 и 3000.

  • Методология: Как корреляция (ВКО) и регрессия (R²) помогают расставлять приоритеты.

  • Результат: Почему IPC остается критическим, а LWLock вышел на второе место.

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

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

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

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

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

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

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

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

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

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

Тренды vmstat:

  • Негативный тренд очереди процессов (procs r) усилился (коэффициент тренда 26.7 → 29.1).

  • Негативный тренд простоя CPU (cpu id) стал более выраженным (36.6 → 38.1).

  • Доля времени с wa > 10% выросла с 83.6% до 90.9% (ALARM).

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

    • Свободная RAM <5% в обоих экспериментах – 100% времени (ALARM).

    • Swap out при 30 соединениях наблюдался в 6.4% времени, при 3000 – отсутствовал (0%).

    • Объём «грязных» страниц (dirty pages) значительно увеличился: медиана с 2.4 МБ до 3.1 МБ, максимум с 2.98 МБ до 4.4 МБ.

    Корреляции:

    • Грязные блоки и записанные блоки (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) и управлением памятью.

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

Pg_expecto v.7+ DeepSeek: Интеграция статистического анализатора и генеративной нейросети

Серия СУБД PostgreSQL

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

Pg_expecto v.7+ DeepSeek: Интеграция статистического анализатора и генеративной нейросети

Предисловие

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

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

pg_expecto v.7

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

DeepSeek

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

Таким образом:

◽Исходные сырые метрики (per-minute значения - временные ряды) хранятся и обрабатываются pg_expecto.

DeepSeek работает с результатами статистической обработки, а не с сырыми данными напрямую.

Почему это важно:

1. Глубина анализа — статистическая обработка уже выявила значимые корреляции, тренды и аномалии.

2. Объем данных — сырые данные могли бы быть слишком большими для прямого анализа нейросетью.

3. Качество выводовDeepSeek получает сконцентрированную информацию, что повышает точность итогового отчета.

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

➡️Конечный результат отчета не изменится, если из исходных текстовых файлов исключить сырые (необработанные) данные.⬅️

1️⃣pg_expecto v.7

Выполняет первичный сбор и статистическую обработку сырых метрик.

В файле _postgresql_vmstat.txt уже присутствуют все результаты этой обработки:

🔴граничные значения (MIN, MEDIAN, MAX)

🔴коэффициенты корреляции и детерминации (R²)

🔴уравнения регрессий и углы наклона

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

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

🔴диаграммы Парето по queryid

🔴сводные таблицы по ожиданиям и vmstat

2️⃣DeepSeek

ℹ️При формировании сводного отчета использует именно эти агрегированные статистические показатели, а не сырые временные ряды.

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

ℹ️Таким образом, удаление разделов с исходными данными (например, ИСХОДНЫЕ ДАННЫЕ ПРОИЗВОДИТЕЛЬНОСТИ И ОЖИДАНИЙ СУБД, Данные для графиков по VMSTAT, СТАТИСТИКА shared_buffers и т.п.) не повлияет на качество и полноту отчета, так как DeepSeek опирается только на уже обработанные результаты. Это делает процесс формирования отчета эффективным и масштабируемым.☑️

Послесловие

ℹ️Предложенное разделение труда между pg_expecto и DeepSeek знаменует переход от простого сбора метрик к интеллектуальному анализу производительности. Оставляя «черновую» работу по расчёту корреляций, регрессий и приоритетов за специализированным инструментом, мы позволяем нейросети сосредоточиться на главном — формулировании экспертных выводов и практических рекомендаций.

☑️Такой симбиоз гарантирует, что итоговый отчет впитывает в себя максимум полезной информации из эксперимента, оставаясь при этом лаконичным и свободным от «информационного шума» сырых данных.

➡️Это не просто экономия времени, это новый стандарт качества для анализа нагрузочных тестов.💥

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

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

Серия СУБД PostgreSQL

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

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

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

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

Предисловие

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

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

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

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

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

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

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

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

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

Общий анализ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • shared_buffers = 4 GB

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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

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

Послесловие

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

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

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

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

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

Серия СУБД PostgreSQL

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

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

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

Предисловие

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Послесловие

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

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

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества