В предыдущих публикациях мы уже рассказали как оценить производительность сервера MySQL или MariaDb с помощью утилит Sysbench, MySQL Benchmark Suite и http_load. В сегодняшней статье мы рассмотрим еще одну программу для тестирования - dbt2
. Инструмент dbt2
из комплекта Database Test Suite представляет собой бесплатную реализацию теста ТРС-С для базы данных MySQL. ТРС-С — это спецификация (опубликована организацией ТРС), которая эмулирует нагрузку, характерную для сложной оперативной обработки транзакций. Этот инструмент сообщает результаты, измеряемые в транзакциях в минуту (tpmC), а также стоимость каждой транзакции (Price/tpmC). Итоги сильно зависят от оборудования, поэтому опубликованные результаты эталонного теста ТРС-С содержат подробные характеристики серверов, использованных при его проведении.
Тест
dbt2
не является настоящим тестом ТРС-С. Он не сертифицирован
организацией ТРС, и его результаты нельзя непосредственно сравнивать
с результатами ТРС-С.
Давайте посмотрим, как настраивать и запускать эталонный тест dbt2
. Мы использовали его версию 0.37, наиболее свежую из подходящих для MySQL (более поздние версии содержат исправления, которые MySQL поддерживает не полностью). Выполнены следующие шаги.
1. Подготовка данных
Следующая команда создает данные по десяти хранилищам данных в указанном каталоге. Вся информация по десяти хранилищам занимает надиске около 700 Мбайт. Требуемое место изменяется пропорционально количеству хранилищ данных, так что можете изменить параметр -w для создания набора данных нужного вам размера:
# src/datagen -w 10 -d /mnt/data/dbt2-w10
warehouses = 10
districts = 10
customers = 3000
items = 100000
orders = 3000
stock = 100000
new_orders = 900
Output directory of data files: /mnt/data/dbt2-w10
Generating data files for 10 warehouse(s)...
Generating item table data...
Finished item table data...
Generating warehouse table data...
Finished warehouse table data...
Generating stock table data...
2. Загрузка данных в базу MySQL
Следующая команда создает базу данных с названием dbt2wl0
и заполняет ее данными, которые мы сгенерировали на предыдущем шаге (флаг -d
задает имя базы, a -f
- каталог со сгенерированными данными):
# scripts/mysql/mysql_load_db.sh -d dbt2w10 -f /mnt/data/dbt2-w10/
-s /var/lib/mysql/mysql.sock
3. Запуск эталонного теста
Последний шаг заключается в выполнении следующей команды из каталога scripts:
# run_mysql.sh -c 10 -w 10 -t 300 -n dbt2w10/
-u root -o /var/lib/mysql/mysql.sock-e
************************************************************************
* DBT2 test for MySQL started *
* *
* Results can be found in output/9 directory *
************************************************************************
* *
* Test consists of 4 stages: *
* *
* 1. Start of client to create pool of databases connections *
* 2. Start of driver to emulate terminals and transactions generation *
* 3. Test *
* 4. Processing of results *
* *
************************************************************************
DATABASE NAME: dbt2w10
DATABASE USER: root
DATABASE SOCKET: /var/lib/mysql/mysql.sock
DATABASE CONNECTIONS: 10
TERMINAL THREADS: 100
SCALE FACTOR(WARHOUSES): 10
TERMINALS PER WAREHOUSE: 10
DURATION OF TEST(in sec): 300
SLEEPY in (msec) 300
ZERO DELAYS MODE: 1
Stage 1. Starting up client...
Delay for each thread - 300 msec. Will sleep for 4 sec to start 10 database
connections
CLIENT_PID = 12962
Stage 2. Starting up driver...
Delay for each thread - 300 msec. Will sleep for 34 sec to start 100 terminal
threads
All threads has spawned successfuly.
Stage 3. Starting of the test. Duration of the test 300 sec
Stage 4. Processing of results...
Shutdown clients. Send TERM signal to 12962.
Response Time (s)
Transaction % Average : 90th % Total Rollbacks %
------------ ----- ----------------- ------ --------- -----
Delivery 3.53 2.224 : 3.059 1603 0 0.00
New Order 41.24 0.659 : 1.175 18742 172 0.92
Order Status 3.86 0.684 : 1.228 1756 0 0.00
Payment 39.23 0.644 : 1.161 17827 0 0.00
Stock Level 3.59 0.652 : 1.147 1630 0 0.00
3396.95 new-order transactions per minute (NOTPM)
5.5 minute duration
0 total unknown errors
31 second(s) ramping up
Наиболее важная информация содержится в одной из последних строк:
3396.95 new-order transactions per minute (NOTPM)
Она показывает, сколько транзакций в минуту может выполнить система. Чем больше это значение, тем лучше. (Термин new-order — это не специальное определение для типа транзакции, он просто обозначает, что тест имитирует новый заказ в воображаемом интернет-магазине.)
Вы можете менять некоторые параметры для создания различных эталонных тестов.
-с.
Количество соединений с базой данных. Изменяя этот параметр, вы эмулируете различные уровни параллелизма и видите, как система масштабируется.-е
. Этот параметр активизирует режим нулевой задержки и означает, что между запросами не будет задержки. Это позволяет выполнить нагрузочное тестирование базы данных. Однако такая ситуация не вполне реалистична, так как живым пользователям перед генерацией очередного запроса требуется некоторое время подумать.-t
. Общая продолжительность эталонного теста. Выбирайте этот параметр тщательно, иначе результаты будут бессмысленными. Слишком малое время для эталонного тестирования производительности ввода/вывода даст неправильные результаты, поскольку у системы не будет достаточно времени для «прогрева» кэша и перехода в нормальный режим работы. Но если вы хотите выполнить эталонное тестирование системы в режиме загрузки процессора, то не стоит устанавливать это значение слишком большим, поскольку набор данных может заметно вырасти и нагрузка ляжет в основном на подсистему ввода/вывода.
Результаты эталонного теста могут дать информацию не только о производительности. Например, если вы увидите слишком много откатов транзакций, то поймете: скорее всего, что-то в системе работает неправильно.