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

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

Производительность базы данных нельзя оставлять на волю случая. PG_EXPECTO — это специализированный инструмент, в том числе для настройки и проведения нагрузочных тестов PostgreSQL, который помогает ответить на ключевые вопросы: как поведет себя система при добавлении новых таблиц, добавлении новых индексов ? Данная статья покажет, как создавать дополнительные сценарии, чтобы ваша база данных всегда была готова к настоящим испытаниям. Обеспечить возможность внесения изменений в тестовые таблицы и сценарии используемые при нагрузочном тестировании с применением pg_expecto. cd /postgres/pg_expecto/sh/load_test/ Отредактировать файл before_start.sql -- before_start.sql -- version 3.1 --Вариант по умолчанию - НИЧЕГО НЕ МЕНЯТЬ --SELECT CURRENT_TIMESTAMP ; --Вариант по умолчанию - НИЧЕГО НЕ МЕНЯТЬ -------------------------------------------------------- -- Изменения добавления тестовых таблиц DROP TABLE IF EXISTS pgbench_test; CREATE TABLE pgbench_test ( aid integer PRIMARY KEY , bid intege
Оглавление
СУБД — сложный станок. Нагрузочное тестирование — его контрольный прогон.
СУБД — сложный станок. Нагрузочное тестирование — его контрольный прогон.

Производительность базы данных нельзя оставлять на волю случая. PG_EXPECTO — это специализированный инструмент, в том числе для настройки и проведения нагрузочных тестов PostgreSQL, который помогает ответить на ключевые вопросы: как поведет себя система при добавлении новых таблиц, добавлении новых индексов ? Данная статья покажет, как создавать дополнительные сценарии, чтобы ваша база данных всегда была готова к настоящим испытаниям.

Задача

Обеспечить возможность внесения изменений в тестовые таблицы и сценарии используемые при нагрузочном тестировании с применением pg_expecto.

Базовые сценарии нагрузочного тестирования

Добавление новых таблиц и изменение сценариев нагрузочного тестирования

1.Добавить новую тестовую таблицу

cd /postgres/pg_expecto/sh/load_test/

Отредактировать файл before_start.sql

-- before_start.sql
-- version 3.1
--Вариант по умолчанию - НИЧЕГО НЕ МЕНЯТЬ
--SELECT CURRENT_TIMESTAMP ;
--Вариант по умолчанию - НИЧЕГО НЕ МЕНЯТЬ
--------------------------------------------------------
-- Изменения добавления тестовых таблиц
DROP TABLE IF EXISTS pgbench_test;
CREATE TABLE pgbench_test
(
aid integer PRIMARY KEY ,
bid integer,
abalance integer,
filler character(84)
);
ALTER TABLE pgbench_test ADD CONSTRAINT "pgbench_test_bid_fkey" FOREIGN KEY (bid) REFERENCES pgbench_branches(bid);
INSERT INTO pgbench_test ( aid , bid , abalance , filler )
SELECT
id ,
floor(random() * 685 ) + 1 ,
floor(random() * (68500000 - 1 + 1)) + 1 ,
md5(random()::text)
FROM generate_series(1,1000000) id;
ANALYZE pgbench_test;
-- Изменения добавления тестовых таблиц
--------------------------------------------------------

2. Изменить тестовый сценарий-1

cd /postgres/pg_expecto/sh/load_test/

Отредактировать файл scenario1.sql

-- scenario1.sql
-- version 3.1
CREATE OR REPLACE FUNCTION scenario1() RETURNS integer AS $$
DECLARE
test_rec record ;
min_i bigint ;
max_i bigint ;
current_aid bigint ;
current_tid bigint ;
current_bid bigint ;
current_delta bigint ;
counter bigint;
BEGIN
---------------------------------------------------
--СЦЕНАРИЙ 1 - SELECT ONLY
SELECT MAX(aid) INTO max_i FROM pgbench_accounts ;
SELECT MIN(aid) INTO min_i FROM pgbench_accounts ;
current_aid = floor(random() * (max_i - min_i + 1)) + min_i ;
----------------------------------------------------
-- тестовый сценарий - изменен
select test.abalance
into test_rec
from pgbench_accounts acc
join pgbench_test test on (test.bid = acc.bid )
where acc.aid = current_aid ;
-- тестовый сценарий - изменен
----------------------------------------------------
--СЦЕНАРИЙ 1 - SELECT ONLY
---------------------------------------------------
return 0 ;
END
$$ LANGUAGE plpgsql;

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

cd /postgres/pg_expecto/sh/load_test/

Отредактировать файл param.conf

# НАСТРОЙКИ НАГРУЗОЧНОГО ТЕСТИРОВАНИЯ
# Максимальная нагрузка
finish_load = 20
# Инициализировать тестовую БД
init_test_db = on
#init_test_db = off
# Размер тестовой БД
# ~200MB
#scale = 20
#~10GB
scale = 685

Запустить нагрузочное тестирование

./load_test_start.sh

TIMESTAMP : 05-11-2025 09:30:21 : OK : НАГРУЗОЧНЫЙ ТЕСТ СУБД - ПОДГОТОВКА
TIMESTAMP : 05-11-2025 09:30:21 : OK : init_test_db = on
TIMESTAMP : 05-11-2025 09:30:21 : OK : СОЗДАНИЕ ТЕСТОВОЙ БД
DROP DATABASE
CREATE DATABASE
TIMESTAMP : 05-11-2025 09:30:24 : OK : МАСШТАБ = 685
TIMESTAMP : 05-11-2025 09:30:24 : OK : pgbench_init_param= --quiet --foreign-keys --scale=685 -i pgbench_db
TIMESTAMP : 05-11-2025 09:30:24 : 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 263.66 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 106.98 s, vacuum 54.46 s, primary keys 79.86 s, foreign keys 22.36 s).
TIMESTAMP : 05-11-2025 09:34:48 : OK : ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД - ЗАКОНЧЕНА
TIMESTAMP : 05-11-2025 09:34:48 : OK : BEFORE_START.SQL
TIMESTAMP : 05-11-2025 09:35:06 : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-1
TIMESTAMP : 05-11-2025 09:35:06 : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-2
TIMESTAMP : 05-11-2025 09:35:06 : OK : СОЗДАТЬ ФУНКЦИЮ ДЛЯ СЦЕНАРИЯ-3
TIMESTAMP : 05-11-2025 09:35:06 : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-1
TIMESTAMP : 05-11-2025 09:35:06 : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-2
TIMESTAMP : 05-11-2025 09:35:06 : OK : pgbench ВЫЗОВ ФУНКЦИИ СЦЕНАРИЯ-3
TIMESTAMP : 05-11-2025 09:35:07 : OK : СОЗДАНИЕ И ИНИЦИАЛИЗАЦИЯ ТЕСТОВОЙ БД - ЗАВЕРШЕНО
TIMESTAMP : 05-11-2025 09:35:07 : OK : НАГРУЗОЧНЫЙ ТЕСТ - ГОТОВ К СТАРТУ
TIMESTAMP : 05-11-2025 09:35:07 : OK : МАКСИМАЛЬНАЯ НАГРУЗКА = 20 СЕССИЙ