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

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

Лучше неделя нагрузочного тестирования с pg_expecto, чем одна бессонная ночь на боевом сервере. Новый инструмент с открытым исходным кодом для статистического анализа, нагрузочного тестирования и построения отчетов доступен в репозиториях GitFlic и GitHub -- 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
Оглавление
Нагрузочное тестирование — это лишь данные. Их смысл открывает pg_expecto.
Нагрузочное тестирование — это лишь данные. Их смысл открывает pg_expecto.
Лучше неделя нагрузочного тестирования с pg_expecto, чем одна бессонная ночь на боевом сервере.

Новый инструмент с открытым исходным кодом для статистического анализа, нагрузочного тестирования и построения отчетов доступен в репозиториях GitFlic и GitHub

kznalp/PG_EXPECTO: Комплекс статистического анализа производительности СУБД PostgreSQL
GitHub - pg-expecto/pg_expecto: Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL

Задача

  1. Выполнить нагрузочное тестирование СУБД PostgreSQL, с использованием расширения pg_expecto .
  2. Подготовить данные отчетов для анализа результатов нагрузочного тестирования.

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

«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

Импортирование данных отчетов в Excel

1. Производительность и ожидания СУБД

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

Показатели производительности и ожиданий СУБД в ходе нагрузочного тестирования

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

Диаграмма Парето по событиям ожидания СУБД

Диаграмма Парето по ожиданиям SQL запросов

2. История выполнений и событий ожиданий по SQL запросам тестовых сценариев

3. Статистические значения vmstat , iostat

Корреляция ожиданий СУБД и показателей vmstat

Статистические показатели iostat для дискового устройства

Чек-лист IO

Чек-лист CPU

Чек-лист RAM

Показатели iostat для дискового устройства

Данные для построения графиков показателей iostat дискового устройства

Показатели vmstat

Данные для построения графиков показателей vmstat