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

PG_EXPECTO : Настройка и старт нагрузочного тестирования СУБД PostgreSQL

cd /postgres/pg_expecto/load_test param.conf ————— # Максимальная нагрузка finish_load = 100 # Инициализировать тестовую БД init_test_db = on #init_test_db = off # Размер тестовой БД # ~200MB scale = 20 #~10GB #scale = 685 ————— $cd /postgres/pg_expecto/load_test $vi param.conf # Максимальная нагрузка finish_load = 20 # Инициализировать тестовую БД init_test_db = on #init_test_db = off # Размер тестовой БД # ~200MB #scale = 20 #~10GB scale = 685 $./load_test_start.sh TIMESTAMP : 17-10-2025 09:31:38  : OK : НАГРУЗОЧНЫЙ ТЕСТ СУБД - ПОДГОТОВКА TIMESTAMP : 17-10-2025 09:31:39  : OK : init_test_db = on TIMESTAMP : 17-10-2025 09:31:39   : OK : СОЗДАНИЕ ТЕСТОВОЙ БД DROP DATABASE CREATE DATABASE TIMESTAMP : 17-10-2025 09:31:39  :  OK : МАСШТАБ = 685 TIMESTAMP : 17-10-2025 09:31:39  :  OK : pgbench_init_param= --quiet --foreign-keys --scale=685 -i pgbench_db TIMESTAMP : 17-10-2025 09:31:39  :  OK : ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД dropping old tables... NOTICE:  таблица "pgbench_accounts" не существу
Оглавление
Стресс-тест для СУБД: как создать реалистичную нагрузку на PostgreSQL с помощью pg_expecto
Стресс-тест для СУБД: как создать реалистичную нагрузку на PostgreSQL с помощью pg_expecto

Установка параметров нагрузочного тестирования

cd /postgres/pg_expecto/load_test

Файл параметров

param.conf

Параметры нагрузочного тестирования

—————

# Максимальная нагрузка

finish_load = 100

# Инициализировать тестовую БД

init_test_db = on

#init_test_db = off

# Размер тестовой БД

# ~200MB

scale = 20

#~10GB

#scale = 685

—————

Расчет параметра scale

Для расчета коэффициента масштабирования pgbench Scale = 0.0669 * DB_Size_Target_MB - 0.5 https://www.cybertec-postgresql.com/en/a-formula-to-calculate-pgbench-scaling-factor-for-target-db-size/
Postgres DBA25 ноября 2024

Пример запуска нагрузочного тестирования

1. Установка параметров нагрузочного тестирования

$cd /postgres/pg_expecto/load_test

$vi param.conf

# Максимальная нагрузка
finish_load = 20
# Инициализировать тестовую БД
init_test_db = on
#init_test_db = off
# Размер тестовой БД
# ~200MB
#scale = 20
#~10GB
scale = 685

2. Старт нагрузочного тестирования

$./load_test_start.sh

TIMESTAMP : 17-10-2025 09:31:38  : OK : НАГРУЗОЧНЫЙ ТЕСТ СУБД - ПОДГОТОВКА
TIMESTAMP : 17-10-2025 09:31:39  : OK : init_test_db = on
TIMESTAMP : 17-10-2025 09:31:39   : OK : СОЗДАНИЕ ТЕСТОВОЙ БД
DROP DATABASE
CREATE DATABASE
TIMESTAMP : 17-10-2025 09:31:39  :  OK : МАСШТАБ = 685
TIMESTAMP : 17-10-2025 09:31:39  :  OK : pgbench_init_param= --quiet --foreign-keys --scale=685 -i pgbench_db
TIMESTAMP : 17-10-2025 09:31:39  :  OK : ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД
dropping old tables...
NOTICE:  таблица "pgbench_accounts" не существует, пропускается
NOTICE:  таблица "pgbench_branches" не существует, пропускается
NOTICE:  таблица "pgbench_history" не существует, пропускается
NOTICE:  таблица "pgbench_tellers" не существует, пропускается
creating tables...
generating data (client-side)...
vacuuming...
creating primary keys...
creating foreign keys...
done in 255.36 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 95.59 s, vacuum 55.67 s, primary keys 81.45 s, foreign keys 22.65 s).
TIMESTAMP : 17-10-2025 09:35:54  :  OK : ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД - ЗАКОНЧЕНА
TIMESTAMP : 17-10-2025 09:35:54  : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-1
TIMESTAMP : 17-10-2025 09:35:54  : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-2
TIMESTAMP : 17-10-2025 09:35:54  : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-3
TIMESTAMP : 17-10-2025 09:35:54  : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-1
TIMESTAMP : 17-10-2025 09:35:54  : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-2
TIMESTAMP : 17-10-2025 09:35:55  : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-3
TIMESTAMP : 17-10-2025 09:35:55   : OK : СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД - ЗАВЕРШЕНО
TIMESTAMP : 17-10-2025 09:35:55  :  OK : НАГРУЗОЧНЫЙ ТЕСТ - ГОТОВ К СТАРТУ

3. Контроль запуска нагрузочного тестирования

$tail -f load_test.log

TIMESTAMP : 17-10-2025 09:36:02  :  OK : Время теста в секундах: 600
TIMESTAMP : 17-10-2025 09:36:02  :  OK : jobs= 8
TIMESTAMP : 17-10-2025 09:36:02  :  OK : ИТЕРАЦИЯ pg_bench
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-1: pgbench_clients= 3
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-1: pgbench_param= --file=/postgres/pg_expecto/load_test/do_scenario1.sql --protocol=extended --report-per-command --jobs=8 --client=3 --time=600 pgbench_db
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-2: pgbench_clients= 2
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-2: pgbench_param= --file=/postgres/pg_expecto/load_test/do_scenario1.sql --protocol=extended --report-per-command --jobs=8 --client=3 --time=600 pgbench_db--file=/postgres/pg_expecto/load_test/do_scenario2.sql --protocol=extended --report-per-command --jobs=8 --client=2 --time=600 pgbench_db
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-3: pgbench_clients= 1
TIMESTAMP : 17-10-2025 09:36:02  :  OK : СЦЕНАРИЙ-3: pgbench_param= --file=/postgres/pg_expecto/load_test/do_scenario1.sql --protocol=extended --report-per-command --jobs=8 --client=3 --time=600 pgbench_db--file=/postgres/pg_expecto/load_test/do_scenario2.sql --protocol=extended --report-per-command --jobs=8 --client=2 --time=600 pgbench_db--file=/postgres/pg_expecto/load_test/do_scenario3.sql --protocol=extended --report-per-command --jobs=8 --client=1 --time=600 pgbench_db
TIMESTAMP : 17-10-2025 09:37:01  : ИТЕРАЦИЯ : 1 СЕССИЙ pgbench : 5

4. Завершение нагрузочного тестирования

$tail -f load_test.log

TIMESTAMP : 17-10-2025 16:07:01  : ИТЕРАЦИЯ : 15 СЕССИЙ pgbench : 22
TIMESTAMP : 17-10-2025 16:08:02  : ИТЕРАЦИЯ : 15 СЕССИЙ pgbench : 22
TIMESTAMP : 17-10-2025 16:08:06  :  OK : ИТЕРАЦИЯ pg_bench ЗАВЕРШЕНА
load_test_stop_collect_data
-----------------------------
0
(1 row)
TIMESTAMP : 17-10-2025 16:08:06  :  OK : СБОР ДАННЫХ ПО НАГРУЗОЧНОМУ ТЕСТУ - ОСТАНОВЛЕН
TIMESTAMP : 17-10-2025 16:08:06  :  OK : ФЛАГ ОСТАНОВКИ НАГРУЗОЧНОГО ТЕСТА = 1
TIMESTAMP : 17-10-2025 16:08:06  :  OK : ОЧИСТКА ТАБЛИЦЫ pgbench_history
TIMESTAMP : 17-10-2025 16:09:01  : ИТЕРАЦИЯ : 15 СЕССИЙ pgbench : 22
TIMESTAMP : 17-10-2025 16:09:19  :  OK : НАГРУЗОЧНЫЙ ТЕСТ ЗАВЕРШЕН

P.S. Изменение/дополнение сценариев нагрузочного тестирования