Лучше неделя нагрузочного тестирования с pg_expecto, чем одна бессонная ночь на боевом сервере.
Новый инструмент с открытым исходным кодом для статистического анализа, нагрузочного тестирования и построения отчетов доступен в репозиториях GitFlic и GitHub
Задача
- Выполнить нагрузочное тестирование СУБД PostgreSQL, с использованием расширения pg_expecto .
- Подготовить данные отчетов для анализа результатов нагрузочного тестирования.
Тестовые сценарии при выполнении нагрузочного тестирования
«Select only» – выборка данных без изменений
-- scenario1.sql
-- version 1.0
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 br.bbalance
into test_rec
from pgbench_branches br
join pgbench_accounts acc on (br.bid = acc.bid )
where acc.aid = current_aid ;
--СЦЕНАРИЙ 1 - SELECT ONLY
---------------------------------------------------
return 0 ;
END
$$ LANGUAGE plpgsql;
«Select + Update» – чтение и обновление записей
-- scenario2.sql
-- version 1.0
CREATE OR REPLACE FUNCTION scenario2() 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
---------------------------------------------------
--СЦЕНАРИЙ 2 - SELECT + UPDATE
--1)UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
--2)SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
--3)UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
--4) UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
current_delta = (ROUND( random ())::bigint)*10 + 1 ;
SELECT MIN(aid) INTO min_i FROM pgbench_accounts ;
SELECT MAX(aid) INTO max_i FROM pgbench_accounts ;
current_aid = floor(random() * (max_i - min_i + 1)) + min_i ;
--1)
UPDATE pgbench_accounts SET abalance = abalance + current_delta WHERE aid = current_aid ;
--1)
--2)
SELECT abalance INTO test_rec FROM pgbench_accounts WHERE aid = current_aid ;
--2)
SELECT MIN(tid) INTO min_i FROM pgbench_tellers ;
SELECT MAX(tid) INTO max_i FROM pgbench_tellers ;
current_tid = floor(random() * (max_i - min_i + 1)) + min_i ;
--3)
UPDATE pgbench_tellers SET tbalance = tbalance + current_delta WHERE tid = current_tid ;
--3)
SELECT MIN(bid) INTO min_i FROM pgbench_branches ;
SELECT MAX(bid) INTO max_i FROM pgbench_branches ;
current_bid = floor(random() * (max_i - min_i + 1)) + min_i ;
--4)
UPDATE pgbench_branches SET bbalance = bbalance + current_delta WHERE bid = current_bid ;
--4)
-- СЦЕНАРИЙ 2 - OLTP
return 0 ;
END
$$ LANGUAGE plpgsql;
«Insert only» – добавление новых записей
-- scenario3.sql
-- version 1.0
CREATE OR REPLACE FUNCTION scenario3() 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
---------------------------------------------------
--СЦЕНАРИЙ 3 - INSERT ONLY
SELECT MIN(aid) INTO min_i FROM pgbench_accounts ;
SELECT MAX(aid) INTO max_i FROM pgbench_accounts ;
current_aid = floor(random() * (max_i - min_i + 1)) + min_i ;
SELECT MIN(tid) INTO min_i FROM pgbench_tellers ;
SELECT MAX(tid) INTO max_i FROM pgbench_tellers ;
current_tid = floor(random() * (max_i - min_i + 1)) + min_i ;
SELECT MIN(bid) INTO min_i FROM pgbench_branches ;
SELECT MAX(bid) INTO max_i FROM pgbench_branches ;
current_bid = floor(random() * (max_i - min_i + 1)) + min_i ;
SELECT random() * 1000.0
INTO current_delta;
FOR counter IN 1..1000
LOOP
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime)
VALUES ( current_tid , current_bid , current_aid , current_delta , CURRENT_TIMESTAMP );
END LOOP;
--ССЦЕНАРИЙ 3 - INSERT ONLY
---------------------------------------------------
return 0 ;
END
$$ LANGUAGE plpgsql;
Методика проведения нагрузочного тестирования
Для создания нагрузки используется инструмент pgbench, позволяющий параллельно запускать несколько сценариев выполнения SQL-запросов. В данной методике предусмотрено три типа сценариев:
- «Select only» – выборка данных без изменений;
- «Select + Update» – чтение и обновление записей;
- «Insert only» – добавление новых записей.
Каждый сценарий обладает определенным весом, определяющим долю от общей нагрузки:
- Select only: вес = 0.5
- Select + Update: вес = 0.35
- Insert only: вес = 0.15
Количество одновременно выполняемых сессий каждого сценария рассчитывается как произведение общей нагрузки на соответствующий вес сценария.
Общая нагрузка возрастает экспоненциально, а длительность одной итерации составляет 10 минут. Максимальное значение нагрузки определяется значением соответствующего параметра в конфигурационном файле.
Изменение сценариев нагрузочного тестирования
1. Настройка и запуск нагрузочного тестирования СУБД PostgreSQL
2. Подготовка отчетов по результатам нагрузочного тестирования
Скрипт для формирования исходных текстовых файлов для импорта в Excel
cd /postgres/pg_expecto/performance_reports
./load_test_report.sh
Исходные текстовые файлы для импорта в Excel
1.Производительность и ожидания СУБД
- postgres._load_test.txt : график производительности по итерациями нагрузочного тестирования.
- postgres.1.cluster_report_meta.txt : Показатели производительности и ожиданий СУБД.
- postgres.1.cluster_report_4graph.txt : Данные для построения графиков производительности и ожиданий СУБД.
- postgres.2.wait_event.txt : Диаграмма Парето по событиям ожидания СУБД.
- postgres.3.queryid.txt : Диаграмма Парето по ожиданиям SQL запросов.
- postgres.x.sql_list.txt : Список SQL запросов.
2. История выполнений и событий ожиданий по SQL запросам тестовых сценариев
scenario.N.wait_event_type.txt
- История выполнений и событий ожидания по типу ожидания wait_event_type.
- По тестовому сценарию N (от 1 до 3)
3. Статистические значения vmstat , iostat
- linux.1.waitings_vmstat_corr.txt : Корреляция ожиданий СУБД и показателей vmstat
- linux.2.vmstat_iostat_DEVICE.txt : Статистические показатели iostat для дискового устройства DEVICE
- linux.3.vmstat_io.txt : Чек-лист IO
- linux.4.vmstat_cpu.txt : Чек-лист CPU
- linux.5.vmstat_ram.txt : Чек-лист RAM
- linux.x.iostat_DEVICE_meta.txt : Показатели iostat для дискового устройства DEVICE
- linux.x.iostat_DEVICE_4graph.txt : Данные для построения графиков показателей iostat дискового устройства DEVICE
- linux.x.vmstat_meta.txt : Показатели vmstat
- linux.x.vmstat_4graph.txt : Данные для построения графиков показателей vmstat