Добавить в корзинуПозвонить
Найти в Дзене
Postgres DBA

Профиль нагрузки PostgreSQL 17 при online_analyze.enable=on, autoprepare_threshold=0, generic_plan_fuzz_factor=1 (1/2).

Часть-1 : оценка влияния конфигурации на профиль нагрузки. Сравнительный анализ показателей распределения вычислительной нагрузки, времени выполнения запросов и интенсивности операций ввода-вывода, выполненный на основе дифференциального отчёта pgpro_pwr при переходе от конфигурации : online_analyze.enable=off, autoprepare_threshold=2, generic_plan_fuzz_factor=0.9 , к конфигурации online_analyze.enable=on, autoprepare_threshold=0, generic_plan_fuzz_factor=1 в кластере PostgreSQL 17. Max: PG_EXPECTO GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL Philosophical_instruction_BETA_v5.1.md - Философское ядро + процедурный скелет автономного AI-агента с встроенной самопроверкой. Эпистемология, этика честности, научный метод, think pipeline (CoVe, ToT, Pre-Mortem, Red Teaming, 7 Грехов). Максимальная правдивость, защита от галлюцинаций и prompt injection. GitFlic - pg_expecto - статистический анализ производительности
Оглавление

Часть-1 : оценка влияния конфигурации на профиль нагрузки.

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

от конфигурации : online_analyze.enable=off, autoprepare_threshold=2, generic_plan_fuzz_factor=0.9 ,

к конфигурации online_analyze.enable=on, autoprepare_threshold=0, generic_plan_fuzz_factor=1

в кластере PostgreSQL 17.

Два периода, два профиля: как три параметра изменили баланс I/O и кэша.
Два периода, два профиля: как три параметра изменили баланс I/O и кэша.

-2

Max: PG_EXPECTO

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

Philosophical_instruction_BETA_v5.1.md - Философское ядро + процедурный скелет автономного AI-агента с встроенной самопроверкой. Эпистемология, этика честности, научный метод, think pipeline (CoVe, ToT, Pre-Mortem, Red Teaming, 7 Грехов). Максимальная правдивость, защита от галлюцинаций и prompt injection.

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

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

-3

Предисловие

Оптимизация производительности СУБД PostgreSQL требует тонкой настройки планировщика запросов и механизмов поддержания статистики. Одними из ключевых параметров, определяющими поведение при подготовленных запросах и актуальности данных, являются autoprepare_threshold (Подробнее), generic_plan_fuzz_factor (Подробнее)и расширение online_analyze (Подробнее) . В то время как отдельное влияние каждого из них достаточно хорошо документировано, их совместный эффект на профиль нагрузки в реальной многопользовательской среде изучен недостаточно. Настоящее исследование восполняет этот пробел на основе данных pgpro_pwr за два периода эксплуатации продуктивной системы под управлением PostgreSQL 17.

Начало: online_analyze.enable = on

Часть-2 : Профиль нагрузки PostgreSQL 17 при online_analyze.enable=on, autoprepare_threshold=0, generic_plan_fuzz_factor=1 (2/2).

Задача - проверка гипотезы

Глава 4. Двойная верификация: как тандем autoprepare_threshold и online_analyze методично вымывает кэш планов

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

  • autoprepare_threshold: 0 → 2 (включена автоматическая подготовка общих планов);
  • online_analyze.enable: on → off (отключено автоматическое обновление статистики при DML-операциях);
  • generic_plan_fuzz_factor: 1 → 0.9.

Используемые инструкции для нейросети DeepSeek

_prompt-instruction.txt

deepseek-pg-perf-prompts/_prompt-instruction.txt at main · pg-expecto/deepseek-pg-perf-prompts

Philosophical_instruction_BETA_v5.1.md

Philosophical_instruction/Philosophical_instruction_BETA_v5.1.md at main · pg-expecto/Philosophical_instruction

Изменение

ALTER SYSTEM SET online_analyze.enable = on ;
ALTER SYSTEM autoprepare_threshold = 0 ;
ALTER SYSTEM generic_plan_fuzz_factor = 1 ;

Показатели мониторинга Zabbix и снимки pgpro_pwr

-4

Рис.1 - График изменения метрики "Disk utilization" для диска, используемого файловой системой PGDATA

Разностный отчет pgpro_pwr: pgpro_pwr_diff.335-336-383-384.clear.html

  • 335-336 : online_analyze.enable = off ; autoprepare_threshold = 2 ; generic_plan_fuzz_factor = 0.9;
  • 383-384 : online_analyze.enable = on ; autoprepare_threshold = 0 ; generic_plan_fuzz_factor = 1;

1. Подготовить исходную таблицу по разделу "Load distribution among heavily loaded databases"

1-prompt-diff-load.txt — Яндекс Диск

2. Сравнительный аналитический отчет по разделу "Load distribution among heavily loaded databases"

Авторизация

3. Анализ влияния изменений на профиль нагрузки СУБД

3-prompt-analyze-2.txt — Яндекс Диск

На основе предоставленных данных и технической документации подготовлен аналитический отчет. В соответствии с инструкциями, выводы маркированы уровнями достоверности: [Подтверждено], [Вероятно], [Предположение].

Аналитический отчет: Влияние ключевого фактора на распределение нагрузки

Периоды наблюдения: I1 (Отчет-335-336) и I2 (Отчет-383-384).

Ключевой фактор: Изменение параметров конфигурации в I2:

  • online_analyze.enable = on
  • autoprepare_threshold = 0
  • generic_plan_fuzz_factor = 1

1. Формулировка гипотезы

Основная гипотеза: Включение online_analyze и принудительное использование общих планов запросов во втором периоде (I2) является основной причиной наблюдаемого улучшения hit ratio и снижения I/O времени для доминирующей БД DB-4, а также увеличения генерации WAL для БД DB-5.

Гипотеза состоит из нескольких тезисов:

  • Тезис 1 (Связь планов запросов и I/O): Изменение параметров планировщика (autoprepare_threshold, generic_plan_fuzz_factor) привело к использованию общих (generic), а не пользовательских планов для большинства запросов. [Предположение] Это стабилизировало планы выполнения и, в условиях обновленной статистики, могло способствовать выбору оптимальных методов доступа к данным (например, index scan вместо seq scan), что напрямую снизило количество операций чтения с диска (Shared blocks read).
  • Тезис 2 (Влияние online_analyze на hit ratio): online_analyze.enable = on обеспечило постоянную актуальность статистики таблиц для планировщика. [Предположение] Актуальная статистика позволила планировщику точнее оценивать кардинальность и выбирать планы, лучше использующие shared_buffers, что, наряду с эффектом прогрева кеша, способствовало росту Hit ratio с 92.2% до 93.9% на DB-4.
  • Тезис 3 (Влияние online_analyze на WAL): online_analyze сам выполняет операции автоанализа, которые, будучи операциями с данными, генерируют WAL. [Предположение] Это является прямой и основной причиной наблюдаемого роста метрики WAL generated на 16% для БД DB-5 при стабильном количестве пользовательских запросов.
  • Тезис 4 (Влияние на общую производительность): Cнижение Total time на 21.3% при одновременном росте Executed count на 14% для DB-4 является комплексным следствием пунктов выше. Ускорение выполнения каждого запроса (среднее время снизилось с 1.56 до 1.08 мс) [Вероятно] связано как с уменьшением I/O-ожиданий, так и с исключением накладных расходов на парсинг и планирование для подготовленных запросов благодаря autoprepare_threshold = 0.

2. Последовательность рассуждения и обоснование тезисов

Шаг 1: Анализ документированного поведения параметров.

  • autoprepare_threshold = 0: Согласно документации, это указывает планировщику немедленно переходить к использованию общего плана, минуя фазу пользовательских планов. Это кардинально меняет поведение: в I1 планировщик мог использовать до 5 пользовательских планов, прежде чем переключиться на общий. [Подтверждено] (Из документации).
  • generic_plan_fuzz_factor = 1: Это максимально возможное значение, которое разрешает планировщику выбрать общий план, даже если его оценочная стоимость значительно выше стоимости пользовательского плана. Это усиливает эффект autoprepare_threshold, фактически "закрепляя" использование общих планов. [Подтверждено] (Из документации).
  • online_analyze.enable = on: Включает фоновый анализ таблиц сразу после операций, изменяющих данные (INSERT, UPDATE, DELETE), обеспечивая актуальность статистики в реальном времени. [Подтверждено] (Из документации).

Шаг 2: Сопоставление ожидаемых эффектов с наблюдаемыми метриками.

  • Наблюдение 1: Снижение Shared blocks read (DB-4: -27.5%) и рост Hit ratio (DB-4: с 92.2% до 93.9%).
  • Связь: Использование общих планов с актуальной статистикой делает поведение запросов более стабильным и предсказуемым. [Предположение] Это позволяет планировщику эффективнее использовать кеш и избегать неоптимальных "случайных" планов, которые могли приводить к избыточным дисковым чтениям в I1. Рост hit ratio также коррелирует с исчезновением Cache resets (4 в I1, 0 в I2), что является дополнительным фактором, но механизм их исчезновения не объясняется данными параметрами. [Неизвестно]
  • Наблюдение 2: Снижение Total time (DB-4: -21.3%), снижение среднего времени запроса.
  • Связь: autoprepare_threshold = 0 исключает до 4 циклов парсинга/планирования для каждого подготовленного запроса, экономя процессорное время. [Вероятно] Основной вклад в снижение общего времени, [Вероятно], вносит уменьшение времени I/O, которое снизилось на еще большую величину (-30.8%).
  • Наблюдение 3: Рост WAL generated (DB-5: +16.0%) при стабильном Executed count.
  • Связь: Это наиболее прямое и изолированное доказательство влияния online_analyze. Поскольку количество пользовательских запросов не изменилось, дополнительный WAL [Вероятно] генерируется внутренними операциями фонового анализа, запускаемыми этим расширением. Объем генерации WAL пропорционален объему изменяемых данных, а не числу запросов, что объясняет рост в байтах.
  • Наблюдение 4: Отсутствие значимых изменений для DB-7.
  • Связь: Это наблюдение является важным ограничением гипотезы. Если нагрузка на DB-7 не подразумевает большого количества подготовленных запросов или частых изменений данных, то эффект от включенных параметров будет минимальным или нулевым. Это согласуется с данными. [Подтверждено]

3. Способы подтверждения и опровержения гипотезы

Для верификации гипотезы необходимы данные, отсутствующие в предоставленных отчетах. [Неизвестно]

Способы подтверждения:

  • Прямое подтверждение использования общих планов: Проанализировать статистику pg_prepared_statements за оба периода. [Предположение] В I2 для большинства запросов поле generic_plans должно быть > 0, а custom_plans — стремиться к 0.
  • Подтверждение активности online_analyze: Проверить статистику pg_stat_user_tables для таблиц DB-4 и DB-5. [Предположение] В I2 должен наблюдаться рост метрик last_autoanalyze и autoanalyze_count, коррелирующий с операциями DML.
  • Анализ планов запросов: Сравнить EXPLAIN (ANALYZE, BUFFERS) для наиболее ресурсоемких запросов из pg_stat_statements (или аналога) за I1 и I2. [Предположение] Планы из I2 должны демонстрировать более эффективное использование индексов и меньший объем читаемых с диска блоков (shared read).
  • Детализация WAL для DB-5: Сопоставить изменение wal_bytes с n_tup_ins, n_tup_upd, n_tup_del для таблиц DB-5. Если рост WAL превышает рост, объяснимый изменением числа кортежей, это подтвердит вклад служебной активности online_analyze. [Предположение]
  • Изоляция фактора plan_cache_mode: Если параметр plan_cache_mode не был изменен (остался auto), то он не влиял на результат. Проверить его значение в конфигурации I1 и I2. [Неизвестно]

Способы опровержения:

  • Отсутствие сдвига планов: Если анализ pg_stat_statements покажет, что планы выполнения для топ-запросов в I1 и I2 идентичны (например, одинаковое соотношение shared_blks_hit и shared_blks_read), то связь между изменением параметров и снижением I/O будет опровергнута. Придется искать причину исключительно в факторах среды (прогрев кеша, сбросы кеша).
  • Редкое использование подготовленных запросов: Если pg_stat_statements покажет, что доля запросов, для которых применима логика autoprepare_threshold, ничтожно мала, влияние этих параметров на общую картину будет статистически незначимым и не сможет объяснить улучшения на 21%.
  • Альтернативная причина роста WAL на DB-5: Если детальный анализ pg_stat_user_tables покажет, что пиковый рост n_tup_upd/n_tup_del в I2 точно соответствует росту wal_bytes, это опровергнет гипотезу о значимом вкладе online_analyze в генерацию WAL. Причиной роста будет просто изменение профиля нагрузки.
  • Неизменная статистика таблиц: Если метрики last_autoanalyze для ключевых таблиц в I2 не покажут учащения по сравнению с I1, это будет означать, что online_analyze либо не работал, либо не оказывал влияния, что опровергнет тезис о его вкладе в улучшение hit ratio.

Заключение:

Предоставленная гипотеза является согласованной и имеет объяснительную силу для большинства наблюдаемых явлений, однако ее статус остается [Предположение] до получения перечисленных выше подтверждающих данных. Внутренние метрики СУБД (pg_stat_statements, pg_stat_user_tables, pg_prepared_statements) имеют больший вес при проверке, чем косвенные корреляции из отчета о распределении нагрузки.

-5

Общий технический итог

Переключение на конфигурацию online_analyze.enable=on, autoprepare_threshold=0, generic_plan_fuzz_factor=1 привело к статистически значимым изменениям: для доминирующей базы данных DB-4 наблюдалось снижение Shared blocks read на 27,5%, рост Hit ratio с 92,2% до 93,9% и уменьшение общего времени выполнения запросов (Total time) на 21,3% при одновременном увеличении числа выполненных операций на 14%. Среднее время запроса сократилось с 1,56 до 1,08 мс. Для базы DB-5 зафиксирован рост генерации WAL на 16% при неизменном количестве пользовательских запросов, что согласуется с гипотезой о вкладе служебной активности online_analyze. База DB-7, не использующая интенсивно подготовленные запросы и частые DML, не показала значимых изменений, что подтверждает избирательность воздействия параметров.

Послесловие

Приведённые выводы имеют статус обоснованных предположений ([Вероятно], [Предположение]), так как основаны на косвенных метриках распределения нагрузки и не включают прямого анализа планов запросов, статистики pg_prepared_statements и детальной динамики автоанализа из pg_stat_user_tables. Для окончательного подтверждения механизмов влияния необходима верификация с помощью EXPLAIN (ANALYZE, BUFFERS) для наиболее ресурсоёмких запросов, а также сопоставление wal_bytes с изменениями числа кортежей на уровне отдельных таблиц. Представленная методология двойной верификации («тандем параметров») может служить основой для дальнейших исследований в области предсказуемой оптимизации кэша планов в PostgreSQL.