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

Postgres DBA

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

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

2

PG_HAZEL : Влияние уменьшения autovacuum_vacuum_threshold на производительность СУБД PostgreSQL

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

Разобраться в работе сложного механизма - это очень интересно.

Разобраться в работе сложного механизма - это очень интересно.

Задача

Проанализировать количественное влияние на производительность СУБД повышения агрессивности настройки autovacuum для очень большой таблицы .

Начало работ

PG_HAZEL : Влияние агрессивного автовакуума на производительность СУБД PostgreSQL.

Конфигурация СУБД

CPU = 200

RAM = 1TB

DB Size = 10TB

Количество строк тестовой таблицы ~7 000 000 000

Сценарий нагрузки - смешанный ("Select only" + "Select + Update" + "Insert only")

Минимальная нагрузка = 5 сессий

Максимальная нагрузка = 115 сессии

Эксперимент-10K : агрессивные настройки autovacuum

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0);

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000);

ALTER TABLE pgbench_accounts SET (autovacuum_analyze_scale_factor = 0);

ALTER TABLE pgbench_accounts SET (autovacuum_analyze_threshold = 10000);

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_insert_scale_factor = 0);

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000);

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_cost_delay = 0);

Эксперимент-1K : агрессивные настройки autovacuum

Снижение граничного условия в 10 раз.

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 1000);

ALTER TABLE pgbench_accounts SET (autovacuum_analyze_threshold = 1000);

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 1000);

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

Ось X - точка наблюдения. Ось Y - операционная скорость

Ось X - точка наблюдения. Ось Y - операционная скорость

Ось X - точка наблюдения. Ось Y - относительная разница между скорости в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между скорости в эксперименте-10K и эксперименте-1K

Средний прирост производительности СУБД в эксперименте-1K = 9.5%

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

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

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

Ось X - точка наблюдения. Ось Y - ожидания СУБД

Ось X - точка наблюдения. Ось Y - ожидания СУБД

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Среднее снижение количества ожиданий СУБД в эксперименте-1K = -4.51%

Ожидания IO

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа IO

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа IO

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Среднее снижение количества ожиданий СУБД типа IO в эксперименте-1K = -4.51%

Ожидания IPC

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа IPC

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа IPC

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Превышение ожиданий IPC в эксперименте-1K при нагрузке близкой к максимальной.

Среднее снижение количества ожиданий СУБД типа IPC в эксперименте-1K = -37.44%

Ожидания Lock

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа Lock

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа Lock

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

С ростом нагрузки ожидания Lock в эксперименте-1К начинают превышать ожидания в эксперименте-10K.

Среднее снижение количества ожиданий СУБД типа Lock в эксперименте-1K = -17.00%

Ожидания LWLock

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа LWLock

Ось X - точка наблюдения. Ось Y - ожидания СУБД типа LWLock

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

Ось X - точка наблюдения. Ось Y - относительная разница между количеством ожиданий в эксперименте-10K и эксперименте-1K

В целом ожидания Lock в эксперименте-1К превышают ожидания в эксперименте-10K.

Среднее повышение количества ожиданий СУБД типа Lock в эксперименте-1K = 13.46%

Итог

Для данной СУБД и данного сценария синтетической нагрузки. При нагрузке на СУБД с 5 до 115 одновременных соединений :

  • Снижение граничного условия старта autovacuum с 10 000 до 1 000 мёртвых строк , приводит к повышению производительности в среднем до 9.5%.

  • Mаксимальный прирост производительности достигает 31%.

P.S.

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

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

PG_HAZEL : Анализ влияния агрессивного автовакуума на производительность СУБД для больших таблиц

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

Тюнинг - дело тонкое. Нужно аккуратно.

Тюнинг - дело тонкое. Нужно аккуратно.

Задача

Проанализировать влияние на производительность СУБД агрессивной настройки autovacuum для очень большой таблицы .

Конфигурация СУБД

CPU = 200RAM = 1TBDB Size = 10TBКоличество строк тестовой таблицы ~70 00 000Сценарий нагрузки - смешанный ("Select only" + "Select + Update" + "Insert only")Минимальная нагрузка = 5 сессийМаксимальная нагрузка = 92 сессии

Эксперимент-1 : Базовые настройки autovacuum (BASELINE)

autovacuum_analyze_scale_factor = 0.005autovacuum_analyze_threshold = 50autovacuum_vacuum_cost_delay = 2msautovacuum_vacuum_cost_limit = 5600autovacuum_vacuum_insert_scale_factor = 0.01autovacuum_vacuum_scale_factor = 0.001autovacuum_vacuum_threshold = 50autovacuum_vacuum_insert_threshold = 1000autovacuum_work_mem = 1GB

Эксперимент-2 : агрессивная настройка autovacuum для тестовой таблицы

ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0);ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000);ALTER TABLE pgbench_accounts SET (autovacuum_analyze_scale_factor = 0);ALTER TABLE pgbench_accounts SET (autovacuum_analyze_threshold = 10000);ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_insert_scale_factor = 0);ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_threshold = 10000);ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_cost_delay = 0);

Метрики мониторинга

Autovacuum: Count of autovacuum workers

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

Среднее количество воркеров для эксперимента-1 = 0.5

Среднее количество воркеров для эксперимента-1 = 0.5

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

Среднее количество воркеров для эксперимента-1 = 1.5

Среднее количество воркеров для эксперимента-1 = 1.5

CPU iowait time

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

Среднее значение = 7.6%

Среднее значение = 7.6%

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

Среднее значение = 8.4%

Среднее значение = 8.4%

Disk utilization

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

Среднее значение: 77-81%

Среднее значение: 77-81%

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

Среднее значение: 85-89%

Среднее значение: 85-89%

CPU utilization

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

Среднее значение = 14.1%

Среднее значение = 14.1%

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

Среднее значение = 16%

Среднее значение = 16%

Результаты

Утилизация ресурсов увеличилась на 1-2%

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

Ось X - нагрузка на СУБД . Ось Y - Операционная скорость

Ось X - нагрузка на СУБД . Ось Y - Операционная скорость

Максимальное увеличение операционной скорости при использовании агрессивных настроек autovacuum составило 9%

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

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

Минимальные и максимальные значение ожиданий СУБД

Минимальные и максимальные значение ожиданий СУБД

  • Ожидания IO - возросли

  • Ожидания IPC, Lock, LWLock - снизились

Ожидания IO

Среднее уменьшение количества ожиданий типа IO, в эксперименте-2 составило менее 1%

Ожидания IPC

Среднее увеличение количества ожиданий типа IPC, в эксперименте-2 составило 52%

Ожидания Lock

Среднее уменьшение количества ожиданий типа Lock, в эксперименте-2 составило менее -19%

Ожидания LWLock

Среднее увеличение количества ожиданий типа LWLock, в эксперименте-2 составило 19%

Итог

  • Для данной СУБД и данного сценария нагрузки, применение агрессивных настроек autovacuum дало среднее увеличение производительности СУБД на 4.5%

  • Увеличение утилизации ресурсов ОС - незначительно ~1-2%.

PS.

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

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

Про агрессивный автовакуум PostgreSQL

По агрессивному автовакууму , предварительно , чудес не бывает - за повышение производительности при средней нагрузке придётся платить снижением производительности при нагрузке близкой к максимальной.
Если autovacuum worker работает постоянно(а при высокой нагрузке иначе нет смысла), ресурсы CPU кончаются раньше .
Обслуживание СУБД требует ресурсов .
Но , конечно можно и не обслуживать , работает же. А +/- 5-10% изменения производительности СУБД современные приложения и не заметят.

После анализа результатов экспериментов , будут данные по ожиданиям . И в общем-то, тему можно закрывать , хотя с академической точки - интересно будет протестировать параметр autovacuum_cost_delay.


P.S. Так выглядит агрессивный автовакуум PostgreSQL - по мнению нейросети 🤪

Про агрессивный автовакуум PostgreSQL
4

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

Взято с основного технического канала Postgres DBA

Чтобы избежать ситуации - "что-то с памятью моей стало".

Чтобы избежать ситуации - "что-то с памятью моей стало".

Задача

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

shared_buffers

Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти.

Если вы используете выделенный сервер с объёмом ОЗУ 1 ГБ и более, разумным начальным значением shared_buffers будет 25% от объёма памяти. Существуют варианты нагрузки, при которых эффективны будут и ещё большие значения shared_buffers, но так как Postgres Pro использует и кеш операционной системы, выделять для shared_buffers более 40% ОЗУ вряд ли будет полезно.

maintenance_work_mem

Задаёт максимальный объём памяти для операций обслуживания БД, в частности VACUUM, CREATE INDEX и ALTER TABLE ADD FOREIGN KEY.

autovacuum_work_mem

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

shared_buffers

40% от размера RAM.

PG_HAZEL : Влияние на производительность и характерные ожидания СУБД увеличения shared_buffers c 25 до 50% от размера RAM.

maintenance_work_mem

10% от размера RAM

Как рассчитать значение maintenance_work_mem для заданного количества мертвых строк

autovacuum_work_mem

1. Настроить параметра autovacuum для больших таблиц (~ более 1M строк)

autovacuum_vacuum_scale_factor = 0

autovacuum_analyze_scale_factor = 0

autovacuum_vacuum_insert_scale_factor = 0

autovacuum_vacuum_threshhold = 100000

autovacuum_analyze_threshhold = 100000

autovacuum_vacuum_insert_threshold = 100000

2. Установить autovacuum_max_workers

autovacuum_max_workers = 10

Тонкая настройка параметров autovacuum/autoanalyze(naptime, cost_delay) - будет рассмотрена позднее.

3. Установить значение autovacuum_work_mem

autovacuum_work_mem = 100000 * 6 * 1.2 ~ 1MB

Как рассчитать значение maintenance_work_mem для заданного количества мертвых строк

Базовый расчет памяти для обслуживания СУБД

shared_buffers + maintenance_work_mem + (autovacuum_work_mem * autovacuum_max_workers )

Пример :

RAM = 2GB

autovacuum_max_workers = 4

shared_buffers + maintenance_work_mem + (autovacuum_work_mem * autovacuum_max_workers ) = 1020 MB (~49%RAM).

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

PostgreSQL : autovacuum_vacuum_scale_factor или autovacuum_vacuum_threshold ?

Взято с основного технического канала Postgres DBA

Немного тонкой настройки и СУБД будет работать как часы.

Немного тонкой настройки и СУБД будет работать как часы.

Вопрос нейросети:

Какой параметр для настройки автовакуума для СУБД PostgreSQL эффективнее использовать для очень больших таблиц : autovacuum_vacuum_scale_factor или autovacuum_vacuum_threshold ?

Ответ DeepSeek:

Для очень больших таблиц в PostgreSQL эффективнее использовать параметр autovacuum_vacuum_threshold, а не autovacuum_vacuum_scale_factor. Вот обоснование:

Проблема autovacuum_vacuum_scale_factor для больших таблиц:

  1. Масштабируемость:
    Формула запуска автовакуума:
    autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * table_size.
    По умолчанию: threshold = 50, scale_factor = 0.2 (20%).
    Для таблицы на 1 млрд строк порог срабатывания:
    50 + 0.2 * 1 000 000 000 = 200 000 050 мертвых кортежей.
    Это приводит к редким запускам и накоплению огромного числа мертвых кортежей.

  2. Риски:
    Замедление запросов: Длинные таблицы (из-за мертвых кортежей) снижают производительность.
    Блокировки: Очистка большого объема данных блокирует операции.
    Срыв транзакций: Если autovacuum не успевает очищать данные до заполнения autovacuum_freeze_max_age.

Почему autovacuum_vacuum_threshold эффективнее?

  • Фиксированный порог:
    Позволяет задать абсолютное число мертвых кортежей для запуска (независимо от размера таблицы).
    Пример: ALTER TABLE big_table SET (autovacuum_vacuum_threshold = 1000000);
    Автовакуум запустится при достижении 1 млн мертвых кортежей, даже если таблица содержит 1 млрд строк.

  • Гранулярность:
    Настройка применяется индивидуально к большим таблицам без влияния на маленькие.
    Оптимальные значения: от 100 000 до 10 000 000 (зависит от нагрузки и размера).

Рекомендуемая стратегия:

1. Уменьшить scale_factor:

ALTER TABLE big_table SET (autovacuum_vacuum_scale_factor = 0.01); -- 1%

Для таблицы на 1 млрд строк порог: 50 + 0.01 * 1e9 = 10 000 050.

2. Увеличить threshold:

ALTER TABLE big_table SET (autovacuum_vacuum_threshold = 1000000);

Порог: 1 000 000 (фиксированный, без умножения на размер).

3.Комбинировать параметры:

ALTER TABLE big_table SET (autovacuum_vacuum_scale_factor = 0.005, -- 0.5%autovacuum_vacuum_threshold = 500000);

Формула: 500 000 + 0.005 * N.

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

  • autovacuum_vacuum_cost_limit (увеличить для ускорения):

ALTER TABLE big_table SET (autovacuum_vacuum_cost_limit = 2000); -- вместо 200 по умолчанию

autovacuum_naptime (уменьшить интервал проверок).

Итог:

Для очень больших таблиц:

  • Основной параметр: autovacuum_vacuum_threshold (фиксированный порог).

  • Вспомогательный: autovacuum_vacuum_scale_factor (уменьшать до 0.1–0.5%).

  • Настраивать индивидуально для таблицы через ALTER TABLE.

  • Мониторить эффективность через представление pg_stat_user_tables (столбцы n_dead_tup и last_autovacuum).

Практическая проверка рекомендации нейросети

PG_HAZEL : Влияние настроек автовакуума таблицы на производительность СУБД

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

PG_HAZEL : Методология нагрузочного тестирования

Взято с основного технического канала Postgres DBA

До финиша, сложно предсказать результат. Нужны тесты.

До финиша, сложно предсказать результат. Нужны тесты.

Задача

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

Общий алгоритм действий и постановка эксперимента

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

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

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

Конфигурация виртуальной машины

  • CPU = 2

  • RAM = 1GB

  • Postgres Pro (enterprise certified) 15

  • Размер тестовой БД = 10GB

Эксперимент-1 : Тестовый прогон при базовых значениях конфигурационных параметров

shared_preload_libraries = 'pg_wait_sampling, pgpro_stats'

wipe_file_on_delete = 'off'

wipe_xlog_on_free = 'off'

wipe_heaptuple_on_delete = 'off'

wipe_memctx_on_free = 'off'

wipe_mem_on_free = 'off'

track_io_timing = 'on'

listen_addresses = '0.0.0.0'

logging_collector = 'on'

log_directory = '/log/pg_log'

log_destination = 'stderr'

log_rotation_size = '0'

log_rotation_age = '1d'

log_filename = 'name.postgresql-%u.log'

log_line_prefix = '%m| %d| %a| %u| %h| %p| %e| '

log_truncate_on_rotation = 'on'

log_checkpoints = 'on'

archive_mode = 'on'

archive_command = 'true'

max_connections = '1000'

log_connections = 'on'

log_disconnections = 'on'

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

Ось X - Нагрузка на СУБД. Ось Y - операционная скорость.

Ось X - Нагрузка на СУБД. Ось Y - операционная скорость.

Нагрузка, соответствующая максимальной производительности (N_BASE) = 26

Эксперимент-2 : Оптимизация конфигурационных параметров - проход 1

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

random_page_cost = '1.1'

effective_io_concurrency = '300'

autovacuum_max_workers = '2'

autovacuum_work_mem = '256MB'

vacuum_cost_limit = '4000'

shared_buffers = '512MB'

effective_cache_size = '1536MB'

maintenance_work_mem = '128MB'

max_parallel_workers = '2'

max_parallel_workers_per_gather = '2'

wal_level = 'minimal'

max_wal_senders = '0'

Эксперимент-2 : Оптимизация конфигурационных параметров - проход 2

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

shared_buffers = '819MB'

checkpoint_timeout = '60'

\c test_pgbench_custom

ALTER TABLE pgbench_accounts SET (fillfactor = 50);

ALTER TABLE pgbench_tellers SET (fillfactor = 50);

ALTER TABLE pgbench_branches SET (fillfactor = 50);

VACUUM FULL pgbench_branches ;

VACUUM FULL pgbench_tellers ;

VACUUM FULL pgbench_accounts ;

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

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

Ось X - нагрузка на СУБД. Ось Y - операционная скорость

Ось X - нагрузка на СУБД. Ось Y - операционная скорость

Прирост скорости в эксперименте-1 по сравнению с базовыми показателями составил до 3.4% , в среднем 1.9%.

Прирост скорости в эксперименте-2 по сравнению с базовыми показателями составил до 4.7% , в среднем 2.3%.

Корреляция и абсолютные значения ожиданий СУБД

Корреляция ожидания СУБД - практически не изменилась

Корреляция ожидания СУБД - практически не изменилась

Абсолютные значения ожиданий IO - несколько снизились, LWLock - существенно снизились.

Абсолютные значения ожиданий IO - несколько снизились, LWLock - существенно снизились.

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

Ось X - точка наблюдения. Ось Y - количество ожидания типа IO.

Ось X - точка наблюдения. Ось Y - количество ожидания типа IO.

Снижение ожиданий типа IO в эксперименте-1 по сравнению с базовыми значениями составило до -5.7% , в среднем -2.8%.

Снижение ожиданий типа IO в эксперименте-2 по сравнению с базовыми значениями составило до -11.3% , в среднем -4.4%.

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

Ось X - точка наблюдения. Ось Y - количество ожидания типа LWLock.

Ось X - точка наблюдения. Ось Y - количество ожидания типа LWLock.

Снижение ожиданий типа LWLock в эксперименте-1 по сравнению с базовыми значениями составило до -40.5% , в среднем -7.7%.

Снижение ожиданий типа LWLock в эксперименте-2 по сравнению с базовыми значениями составило до -66.7% , в среднем -54.3%.

Итог

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

random_page_cost = '1.1'

effective_io_concurrency = '300'

autovacuum_max_workers = '2'

autovacuum_work_mem = '256MB'

vacuum_cost_limit = '4000'

effective_cache_size = '1536MB'

maintenance_work_mem = '128MB'

max_parallel_workers = '2'

max_parallel_workers_per_gather = '2'

wal_level = 'minimal'

max_wal_senders = '0'

shared_buffers = '819MB'

checkpoint_timeout = '60'

fillfactor = 50

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

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

Сеанс разоблачения магии нейросетей

Сеанс разоблачения магии нейросетей

Вопрос нейросети

Какие типы ожидания wait_event_type будут иметь наибольшую корреляцию со снижением производительности СУБД PostgreSQL при выполнении UPDATE для виртуальной машины CPU = 2 и RAM = 2GB при росте нагрузки с 5 до 115 одновременных соединений ?

Ответ нейросети

При анализе корреляции между типами ожиданий (wait_event_type) в PostgreSQL и снижением производительности во время UPDATE на слабой ВМ (2 vCPU, 2 ГБ RAM) при росте нагрузки с 5 до 115 соединений, наибольшую корреляцию будут иметь следующие типы ожиданий, ранжированные по степени влияния:


1. LWLock (Lightweight Locks)

  • Почему корреляция высокая:

    • На слабых ВМ (особенно с 2 vCPU) нехватка CPU усиливает конкуренцию за системные ресурсы.

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

    • Подтипы buffer_content, buffer_mapping, lock_manager будут доминировать из-за частого доступа к буферам и блокировкам.

  • Связь с производительностью: Прямая корреляция с ростом времени ожидания и снижением TPS (transactions per second).


  • 2. Lock (Транзакционные блокировки)

    • Почему корреляция высокая:

      • UPDATE вызывает эксклюзивные блокировки строк (ROW SHARE/EXCLUSIVE).

      • При 115 соединениях конкуренция за одни строки/таблицы резко возрастает → частые ожидания снятия блокировок.

      • Нехватка RAM (2 ГБ) уменьшает эффективность work_mem → транзакции дольше удерживают блокировки.

    • Ключевые подтипы: transactionid, tuple (блокировки кортежей).

    3. IO (Ввод/вывод)

    • Почему корреляция высокая:

      • Мало RAM → буферный кеш перегружен → частые чтения с диска (read I/O).

      • UPDATE генерирует WAL-записи → нагрузка на write I/O.

      • На ВМ без SSD дисков латентность I/O резко снижает производительность.

    • Подтипы: DataFileRead (чтение данных), WALWrite (запись журнала).


4. BufferPin

  • Почему корреляция средняя:

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

    • Усиливается при нехватке RAM и высокой конкуренции за буферы.

    • Менее критичен, чем LWLock/Lock, но значим при массовых UPDATE.

Итог:
Наибольший вклад в снижение производительности внесут LWLock и Lock из-за нехватки CPU/RAM и высокой конкуренции. IO станет критичным при исчерпании буферного кеша.


Как обстоит ситуация в реальности :

Результаты

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

  • IO : сильная отрицательная корреляция , влияние ожиданий типа IO на производительность СУБД отсутствует.

  • IPC : ожидания практически отсутствуют, влияние на производительность СУБД отсутствует.

  • Lock : очень сильная прямая корреляция, сильное влияние ожиданий типа Lock на снижение производительности СУБД .

  • LWLock : слабая отрицательная корреляция , влияние ожиданий типа LWLock на производительность СУБД отсутствует.

Подробности :

PG_HAZEL : Характерные ожидания при выполнении сценария "UPDATE ONLY"


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

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

Нейросеть пока не заменит инженера. Ну по крайней мере в DBA

Вопрос нейросети :

Как на производительность СУБД PostgreSQL влияет недостаточный размер shared_buffers ?

Ответ нейросети:

**Увеличение операций ввода-вывода (I/O)**
**Неэффективное использование кэшей**
**Рост времени отклика**
**Проблемы с контрольными точками (checkpoints)**
**Конкуренция за блокировки**


Вопрос нейросети:

Как на производительность СУБД PostgreSQL влияет слишком большой размер shared_buffers ?

Ответ нейросети:

**Рост дискового I/O**:
**Неэффективное использование памяти (Double Buffering)**
**Снижение производительности контрольных точек (Checkpoint)
** **Снижение эффективности кэша**


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

Все нейросети имеют принципиальное и пока непреодолимое ограничения - они не обладают экспериментальными данными , только тексты , большая часть которых - мусор, в интернете . И уж конечно , я по крайней мере пока не встречал , нейросети не умеют экспериментировать и логически осмысливать результаты .
Хотя , в области ML по экспериментам по оптимизации запросов что, то было . Но там очень ограниченная область. Да и тишина, что то последние 5 лет. Все внимание себе забрал ии.

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

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

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