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

PG_EXPECTO v.6 : имитация OLTP/OLAP , дополненные чек-листы IO и RAM, статистика vm_dirty и shared_buffers.

Тестирование производительности PostgreSQL часто упирается в вопрос: как система поведёт себя под реальной, смешанной нагрузкой? Методы «на глазок» и разрозненные метрики не дают полной картины. PG_EXPECTO v.6 — инструмент, который целенаправленно создаёт реалистичную имитацию OLTP и OLAP-нагрузки, дополняя её структурированными чек-листами по вводу-выводу и памяти, а также ключевой статистикой по vm_dirty и shared_buffers для глубокой диагностики. Глоссарий терминов | Postgres DBA | Дзен GitHub - Комплекс pg_expecto для статистического анализа производительности и нагрузочного тестирования СУБД PostgreSQL # НАСТРОЙКИ НАГРУЗОЧНОГО ТЕСТИРОВАНИЯ # 6.0 # Максимальная нагрузка finish_load = 20 # Тестовая БД testdb = default # testdb = demo # Тип синтетической нагрузки load_mode = oltp #load_mode = olap # Веса сценариев по умолчанию scenario1 = 0.7 scenario2 = 0.2 scenario3 = 0.1 # Инициализировать тестовую БД init_test_db = on #init_test_db = off # Размер тестовой БД # ~200MB #scale = 20
Оглавление
Вся статистика — в фокусе.
Вся статистика — в фокусе.

Тестирование производительности PostgreSQL часто упирается в вопрос: как система поведёт себя под реальной, смешанной нагрузкой? Методы «на глазок» и разрозненные метрики не дают полной картины. PG_EXPECTO v.6 — инструмент, который целенаправленно создаёт реалистичную имитацию OLTP и OLAP-нагрузки, дополняя её структурированными чек-листами по вводу-выводу и памяти, а также ключевой статистикой по vm_dirty и shared_buffers для глубокой диагностики.

Глоссарий терминов | Postgres DBA | Дзен

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

Начало работ по исследованиям имитации нагрузки OLTP и OLAP с помощью PG_EXPECTO

Версия 6

Конфигурационный файл нагрузочного тестирования

# НАСТРОЙКИ НАГРУЗОЧНОГО ТЕСТИРОВАНИЯ
# 6.0
# Максимальная нагрузка
finish_load = 20
# Тестовая БД
testdb = default
# testdb = demo
# Тип синтетической нагрузки
load_mode = oltp
#load_mode = olap
# Веса сценариев по умолчанию
scenario1 = 0.7
scenario2 = 0.2
scenario3 = 0.1
# Инициализировать тестовую БД
init_test_db = on
#init_test_db = off
# Размер тестовой БД
# ~200MB
#scale = 20
#~10GB
scale = 685

Тип имитируемой нагрузки определяется значением параметра "load_mode":

  • oltp : Нагрузочное тестирование под синтетической нагрузкой, имитирующей OLTP.
  • olap : Нагрузочное тестирование под синтетической нагрузкой, имитирующей OLAP.

Изменение тестовых таблиц для корректной имитации нагрузки OLTP

-- before_start.sql -- 6.0 -------------------------------------------------------- -- Изменения/добавления тестовых таблиц ALTER TABLE pgbench_history DROP CONSTRAINT IF EXISTS pgbench_history_aid_fkey ; ALTER TABLE pgbench_history DROP CONSTRAINT IF EXISTS pgbench_history_bid_fkey ; ALTER TABLE pgbench_history DROP CONSTRAINT IF EXISTS pgbench_history_tid_fkey ; -- 1. Добавить столбец для…
Postgres DBA4 февраля

Тестовые SQL запросы для имитации нагрузки OLTP и OLAP

SELECT - OLTP

-- scenario1.sql -- 6.0 -- OLTP -- SELECT 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 min_i = 1 ; SELECT MAX(aid) INTO max_i FROM…
Postgres DBA4 февраля

SELECT - OLAP

-- scenario1.sql -- 6.0 -- OLAP -- SELECT CREATE OR REPLACE FUNCTION scenario1() RETURNS integer AS $$ DECLARE  test_rec record ; BEGIN WITH branch_summary AS ( SELECT b.bid, COUNT(a.aid) as account_count, SUM(a.abalance) as total_balance, AVG(a.abalance) as avg_balance FROM pgbench_branches b LEFT JOIN pgbench_accounts a ON b.bid = a.bid GROUP BY b.bid ), transaction…
Postgres DBA4 февраля

INSERT - OLTP

-- scenario2.sql -- 6.0 -- OLTP -- INSERT CREATE OR REPLACE FUNCTION scenario2() RETURNS integer AS $$ DECLARE  min_i bigint ;  max_i_aid bigint ;  max_i_tid bigint ;  max_i_bid bigint ;  current_aid bigint ;  current_tid bigint ;  current_bid bigint ;  counter integer ; BEGIN min_i = 1 ; SELECT MAX(aid) INTO max_i_aid FROM pgbench_accounts ; SELECT MAX(tid) INTO max_i_tid FROM pgbench…
Postgres DBA4 февраля

INSERT - OLAP

-- scenario2.sql -- 6.0 -- OLAP -- INSERT CREATE OR REPLACE FUNCTION scenario2() RETURNS integer AS $$ DECLARE  min_i bigint ;  max_i bigint ;  current_aid bigint ;  current_tid bigint ;  current_bid bigint ;  counter integer ; BEGIN min_i = 1 ; SELECT MAX(aid) INTO max_i FROM pgbench_accounts ; current_aid = floor(random() * (max_i - min_i + 1)) + min_i ; SELECT MAX(tid) INTO max_i FROM…
Postgres DBA4 февраля

UPDATE - OLTP

-- scenario3.sql -- 6.0 -- OLTP -- UPDATE CREATE OR REPLACE FUNCTION scenario3() RETURNS integer AS $$ DECLARE  min_i bigint ;  max_i bigint ;  current_aid bigint ;  current_delta bigint ;  counter integer; BEGIN   -- Атомарный выбор и блокировка одной строки с пропуском заблокированных   -- Используем LIMIT 1 и FOR UPDATE SKIP LOCKED для выбора одной доступной строки min_i = 1 ; SELECT MAX…
Postgres DBA4 февраля

UPDATE - OLAP

-- scenario3.sql -- 6.0 -- OLAP -- UPDATE CREATE OR REPLACE FUNCTION scenario3() RETURNS integer AS $$ DECLARE  min_i bigint ;  max_i bigint ;  current_aid bigint ;  current_delta bigint ; BEGIN -- Генерация случайного сдвига   current_delta := (ROUND(RANDOM())::BIGINT) * 10 + 1;   -- Атомарный выбор и блокировка одной строки с пропуском заблокированных   -- Используем LIMIT 1 и FOR UPDATE…
Postgres DBA4 февраля

Характерные паттерны операционной скорости и ожиданий СУБД при имитации нагрузки OLTP и OLAP

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

-2

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

-3

Операционная скорость СУБД при имитации нагрузки OLTP

-4

Операционная скорость СУБД при имитации нагрузки OLAP

-5

Сравнительный чек-лист IO

-6

Сравнительный чек-лист RAM

-7

Отчет по статистике shared_buffers

Исходный файл: postgres.1.1.shared_buffers.report.txt

Время чтения/записи блоков shared_buffers при имитации нагрузки OLTP

-8

Время чтения/записи блоков shared_buffers при имитации нагрузки OLAP

-9

Отчет по статистике vm_dirty*

Исходный файл: linux.5.1.vm_dirty.txt

Объем "грязных страниц кэша ОС" при имитации нагрузки OLTP

-10

Объем "грязных страниц кэша ОС" при имитации нагрузки OLAP

-11

Послесловие

Имитация нагрузки — это лишь первый шаг. Истинная ценность подхода, реализованного в PG_EXPECTO v.6, — в целостной интерпретации результатов. Когда данные с «датчиков» vm_dirty и shared_buffers рассматриваются через призму чек-листов по IO и RAM, вы перестаётся быть пассивным наблюдателем за сбоями. Вы становитесь инженером, который понимает язык своей системы и может проактивно устранять риски, обеспечивая её устойчивость и скорость. Добро пожаловать в эпоху осознанной производительности.