Sysbench и PostgreSQL — генерация тестовой нагрузки

Бенчмарк — это способ определения производительности вашей инфраструктуры. Sysbench — отличный инструмент для сравнения серверов PostgreSQL. В этой статье попробуем генерировать тестовые нагрузки с помощью sysbench. Будем использовать настройку потоковой репликации master-slave с двумя узлами. Это также поможет сгенерировать некоторую активность в кластере и проверить, работает ли репликация должным образом.

Установим последнюю версию sysbench, которая в настоящее время поддерживается здесь. Мы также будем использовать стандартные PostgreSQL 14.2. Обратите внимание, что путь, используемый в этой статье, может отличаться в зависимости от установленной версии PostgreSQL и поставщика.

В качестве примечания мы рассмотрели аналогичное сообщение в блоге о бенчмаркинге PostgreSQL с помощью pgbench в этом сообщении в блоге, как сравнить производительность PostgreSQL.

Сервер СУБД (master) — vav-pg
Сервер СУБД (secondary) — vav-pgs
Сервер sysbench — vav-sysbench

Установка Sysbench

Установка sysbench проста. Для Debian / Ubuntu:

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
$ sudo apt -y install sysbench

И для RHEL / CentOS:

$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench

Проверьте версию:

$ sysbench --version
sysbench 1.0.15

Инициализация тестовых данных

Если вы знакомы с sysbench, он использует следующие значения по умолчанию для параметров PostgreSQL:

  • pgsql-host=localhost
  • pgsql-port=5432
  • pgsql-user=sbtest
  • pgsql-password=пароль
  • pgsql-db=sbtest

Во-первых, создайте базу данных и пользователя в PostgreSQL:

$ su - postgres
$ psql
> CREATE USER sbtest WITH PASSWORD 'password';
> CREATE DATABASE sbtest;
> GRANT ALL PRIVILEGES ON DATABASE sbtest TO sbtest;

Затем отредактируйте файл доступа на основе хоста, pg_hba.conf

И добавьте следующую строку, чтобы разрешить подключения для пользователя sbtest, к базе данных sbtest со всех хостов:

host    sbtest          sbtest          0.0.0.0/0         scram-sha-256

Перезагрузите конфигурацию, чтобы применить изменения:

$ su - postgres
$ psql
> select pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

Проверьте из клиента командной строки psql, правильно ли работает аутентификация пользователя:

$ psql -U sbtest -h vav-pg -p 5432 -d sbtest -W
Password:
psql (14.2)
Type "help" for help.
sbtest=>

Теперь мы можем инициализировать базу данных с помощью sysbench с помощью следующей команды:

$ sysbench \
--db-driver=pgsql \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=1 \
--pgsql-host=vav-pg \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua \
run

Приведенная выше команда генерирует 100 000 строк в каждой таблице для 24 таблиц (от sbtest1 до sbtest24) внутри базы данных «sbtest». Имя схемы «public» по умолчанию. Данные подготавливаются скриптом parallel_prepare.lua, который доступен в /usr/share/sysbench/tests/include/oltp_legacy.

Проверьте сгенерированные таблицы с помощью следующей команды:

$ psql -U sbtest -h vav-pg -p 5432 -W -c '\dt+\'
Password for user sbtest:
                    List of relations
 Schema |   Name   | Type  | Owner  | Size  | Description
--------+----------+-------+--------+-------+-------------
 public | sbtest1  | table | sbtest | 21 MB |
 public | sbtest10 | table | sbtest | 21 MB |
 public | sbtest11 | table | sbtest | 21 MB |
 public | sbtest12 | table | sbtest | 21 MB |
 public | sbtest13 | table | sbtest | 21 MB |
 public | sbtest14 | table | sbtest | 21 MB |
 public | sbtest15 | table | sbtest | 21 MB |
 public | sbtest16 | table | sbtest | 21 MB |
 public | sbtest17 | table | sbtest | 21 MB |
 public | sbtest18 | table | sbtest | 21 MB |
 public | sbtest19 | table | sbtest | 21 MB |
 public | sbtest2  | table | sbtest | 21 MB |
 public | sbtest20 | table | sbtest | 21 MB |
 public | sbtest21 | table | sbtest | 21 MB |
 public | sbtest22 | table | sbtest | 21 MB |
 public | sbtest23 | table | sbtest | 21 MB |
 public | sbtest24 | table | sbtest | 21 MB |
 public | sbtest3  | table | sbtest | 21 MB |
 public | sbtest4  | table | sbtest | 21 MB |
 public | sbtest5  | table | sbtest | 21 MB |
 public | sbtest6  | table | sbtest | 21 MB |
 public | sbtest7  | table | sbtest | 21 MB |
 public | sbtest8  | table | sbtest | 21 MB |
 public | sbtest9  | table | sbtest | 21 MB |
(24 rows)

Теперь загружены тестовые данные.

Создание тестовых нагрузок

Существуют различные виды рабочей нагрузки базы данных, которые вы можете выполнять с помощью sysbench, как показано в следующих разделах.

Загрузка чтения/записи

Команда похожа на версию MySQL sysbench. Можно использовать аналогичные параметры, кроме параметров, связанных с PostgreSQL:

$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=vav-pg \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
run

Приведенная выше команда сгенерирует рабочую нагрузку OLTP из скрипта LUA с именем /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua с данными размером 100 000 строк в 24 таблиц в 64 рабочих потока в течение 60 секунд на хосте vav-pg (master). Каждые 2 секунды sysbench будет сообщать промежуточную статистику (--report-interval = 2).

После выполнения вы получите что-то вроде ниже:

sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 64
Report intermediate results every 2 second(s)
Initializing random number generator from current time

Initializing worker threads...

Threads started!
[ 2s ] thds: 64 tps: 299.91 qps: 6318.96 (r/w/o: 4468.63/1221.08/629.25) lat (ms,95%): 612.21 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 64 tps: 362.61 qps: 7376.22 (r/w/o: 5201.07/1446.94/728.22) lat (ms,95%): 257.95 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 64 tps: 488.57 qps: 9765.38 (r/w/o: 6850.97/1937.27/977.14) lat (ms,95%): 193.38 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 64 tps: 544.39 qps: 10715.42 (r/w/o: 7437.56/2187.58/1090.29) lat (ms,95%): 144.97 err/s: 1.00 reconn/s: 0.00
[ 10s ] thds: 64 tps: 411.01 qps: 8145.24 (r/w/o: 5684.17/1638.55/822.52) lat (ms,95%): 272.27 err/s: 0.00 reconn/s: 0.00
[ 12s ] thds: 64 tps: 409.04 qps: 8510.43 (r/w/o: 6033.66/1657.68/819.09) lat (ms,95%): 282.25 err/s: 0.50 reconn/s: 0.00
[ 14s ] thds: 64 tps: 463.45 qps: 9256.51 (r/w/o: 6483.81/1845.80/926.90) lat (ms,95%): 200.47 err/s: 0.00 reconn/s: 0.00
[ 16s ] thds: 64 tps: 381.06 qps: 7482.73 (r/w/o: 5210.85/1508.25/763.63) lat (ms,95%): 253.35 err/s: 0.50 reconn/s: 0.00

Пока тест выполняется, мы можем отслеживать активность PostgreSQL с помощью pg_activity или pg_top, чтобы подтвердить промежуточную статистику, сообщенную sysbench. 

Установим pg_activity

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y https://repo.ius.io/ius-release-el7.rpm
sudo yum install -y pg_activity

В терминале на мастере выполните:

$ su - postgres
$ pg_activity

А также поток репликации, просмотрев таблицу pg_stat_replication на главном сервере:

$ su - postgres
$ watch -n1 'psql -xc "select * from pg_stat_replication"'
Every 1.0s: psql -xc "select * from pg_stat_replication"                                                                                                                                                                                              Fri May 13 09:18:15 2022
-[ RECORD 1 ]----+------------------------------
pid              | 19761
usesysid         | 10
usename          | postgres
application_name | walreceiver
client_addr	 | 123.123.123.123
client_hostname  |
client_port	 | 60498
backend_start    | 2022-05-13 09:15:49.99184+00
backend_xmin     |
state            | streaming
sent_lsn         | 0/F5C105D8
write_lsn        | 0/F5C105D8
flush_lsn        | 0/F5C105D8
replay_lsn	 | 0/F5C105D8
write_lag        | 00:00:00.000802
flush_lag        | 00:00:00.002841
replay_lag	 | 00:00:00.002842
sync_priority    | 0
sync_state	 | async
reply_time	 | 2022-05-13 09:18:12.646698+00

Приведенная выше команда «watch» запускает команду psql каждые 1 секунду. Вы должны увидеть, что столбцы «* _location» обновляются соответствующим образом при передаче изменений.

В конце теста вы должны увидеть резюме:

SQL statistics:
    queries performed:
        read:                            283766
        write:                           81017
        other:                           40563
        total:                           405346
    transactions:                        20252  (337.31 per sec.)
    queries:                             405346 (6751.35 per sec.)
    ignored errors:                      17     (0.28 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0373s
    total number of events:              20252

Latency (ms):
         min:                                   19.83
         avg:                                  189.69
         max:                                 1102.99
         95th percentile:                      272.27
         sum:                              3841547.45
Threads fairness:
    events (avg/stddev):           316.4375/6.55
    execution time (avg/stddev):   60.0242/0.00

Приведенное выше резюме говорит нам, что наш сервер баз данных PostgreSQL может обрабатывать в среднем около 337 транзакций в секунду и около 6751 запросов в секунду в 64 рабочих потоках.

Загрузка только для чтения

Для теста только для чтения вы можете использовать ту же команду, но измените сценарий LUA на select.luaselect_random_points.luaselect_random_ranges.lua или oltp_simple.lua:

$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=vav-pgs \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/select.lua \
run

Приведенная выше команда запускает рабочую нагрузку только для чтения с именем select.lua на реплике PostgreSQL (потоковая репликация) с 64 рабочими потоками.

Другие нагрузки

Существует много других рабочих нагрузок OLTP, которые вы можете создать с помощью sysbench, как указано в каталоге /usr/share/sysbench/tests/include/oltp_legacy:

ls -1 /usr/share/sysbench/tests/include/oltp_legacy/
bulk_insert.lua
common.lua
delete.lua
insert.lua
oltp.lua
oltp_simple.lua
parallel_prepare.lua
select.lua
select_random_points.lua
select_random_ranges.lua
update_index.lua
update_non_index.lua

Вы можете использовать аналогичную команду и изменить путь к скрипту LUA, чтобы загрузить его.

Заключительные мысли

Используя sysbench, мы можем генерировать тестовые нагрузки для нашего сервера PostgreSQL. Обратите внимание, что лучший тест будет с вашими реальными данными и приложениями, но это не всегда возможно. Это также может быть новое приложение, которое будет быстро развиваться. Несмотря на то, что нагрузка, создаваемая sysbench, может не отражать вашу реальную рабочую нагрузку OLTP, она может быть достаточно хорошей для тестирования производительности.

Добавить комментарий

Ваш адрес email не будет опубликован.