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

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

Провести тестирование методологии для оценки влияния оптимизации конфигурационных параметров СУБД на производительность СУБД. 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' Нагрузка, соответствующая максимальной производительности (N_BASE) = 26 random_page_cost = '1.1' effective_io_concurrency = '300' autovacuum_max_workers = '2' autovacuum_work_mem = '256MB' vacuum_cost_limit = '4000' shared_buffers
Оглавление
До финиша, сложно предсказать результат. Нужны тесты.
До финиша, сложно предсказать результат. Нужны тесты.

Задача

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

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

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

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

  • CPU = 2
  • RAM = 2GB
  • 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

Ось 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

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

Продолжение