MySQL: mysqlslap – нагрузочное тестирование

Автор: | 10/08/2014

mysqllogomysqlslap устанавливается вместе с MySQL:

# yum provides "*mysqlslap"
...
mysql-5.1.71-1.el6.x86_64 : MySQL client programs and shared libraries
Repo : base
Matched from:
Filename : /usr/bin/mysqlslap
# which mysqlslap
/usr/bin/mysqlslap

Создаём тестовую базу:

mysql> create database mysqlslap;
Query OK, 1 row affected (0.02 sec)

Назначаем привилегии:

mysql> grant all on mysqlslap.* to 'setevoy'@'localhost';
Query OK, 0 rows affected (0.03 sec)

Самый простой вариант проверки скорости работы MySQL:

$ mysqlslap -u setevoy -p --auto-generate-sql
Enter password:
Benchmark
Average number of seconds to run all queries: 0.001 seconds
Minimum number of seconds to run all queries: 0.001 seconds
Maximum number of seconds to run all queries: 0.001 seconds
Number of clients running queries: 1
Average number of queries per client: 0

Тут – mysqlslap автоматически создаёт таблицу, выполняет INSERT произвольных данных в неё, затем выполняет SELECT и удаляет таблицу.

Что бы просмотреть все выполняемые действия – добавьте -v, -vv или -vvv:

$ mysqlslap -u setevoy -p --auto-generate-sql -vvv
...
Building Create Statements for Auto
Building Query Statements for Auto
Parsing engines to use.
Starting Concurrency Test
DROP SCHEMA IF EXISTS `mysqlslap`;
Loading Pre-data
CREATE SCHEMA `mysqlslap`;
CREATE SCHEMA `mysqlslap`;
CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));
INSERT INTO t1 VALUES (1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekbWtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1KQ1lT4zg9rdxBL');
INSERT INTO t1 VALUES (822890675,'97RGHZ65mNzkSrYT3zWoSbg9cNePQr1bzSk81qDgE4Oanw3rnPfGsBHSbnu1evTdFDe83ro9w4jjteQg4yoo9xHck3WNqzs54W5zEm92ikdRF48B2oz3m8gMBAl11W');
INSERT INTO t1 VALUES (1308044878,'50w46i58Giekxik0cYzfA8BZBLADEg3JhzGfZDoqvQQk0Akcic7lcJInYSsf9wqin6LDC1vzJLkJXKn5onqOy04MTw1WksCYqPl2Jg2eteqOqTLfGCvE4zTZwWvgMz');
INSERT INTO t1 VALUES (964445884,'DPh7kD1E6f4MMQk1ioopsoIIcoD83DD8Wu7689K6oHTAjD3Hts6lYGv8x9G0EL0k87q8G2ExJjz2o3KhnIJBbEJYFROTpO5pNvxgyBT9nSCbNO9AiKL9QYhi0x3hL9');
...
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (866596855,'naQuzhMt1IrZIJMkbLAKBNNKKK2sCknzI5uHeGAgQuDd5SLgpN0smODyc7qorTo1QaI5qLl97qmCIzl0Mds81x7TxpIoJyqlY0iEDRNKA1PS0AKEn5NhuMAr3KgEIM');
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (364531492,'qMa5SuKo4M5OM7ldvisSc6WK9rsG9E8sSixocHdgfa5uiiNTGFxkDJ4EAwWC2e4NL1BpAgWiFRcp1zIH6F1BayPdmwphatwnmzdwgzWnQ6SRxmcvtd6JRYwEKdvuWr');
Generating stats
Benchmark
Average number of seconds to run all queries: 0.001 seconds
Minimum number of seconds to run all queries: 0.001 seconds
Maximum number of seconds to run all queries: 0.001 seconds
Number of clients running queries: 1
Average number of queries per client: 0

DROP SCHEMA IF EXISTS `mysqlslap`;

Что бы добавить эмуляцию нескольких одновременных подключений – используйте опцию --concurrency:

$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10
Enter password:
Benchmark
Average number of seconds to run all queries: 0.444 seconds
Minimum number of seconds to run all queries: 0.444 seconds
Maximum number of seconds to run all queries: 0.444 seconds
Number of clients running queries: 10
Average number of queries per client: 0

Что бы повторить тестирование несколько раз – имеется опция --iterations:

$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10 --iterations 10
Enter password:
Benchmark
Average number of seconds to run all queries: 0.016 seconds
Minimum number of seconds to run all queries: 0.015 seconds
Maximum number of seconds to run all queries: 0.018 seconds
Number of clients running queries: 10
Average number of queries per client: 0

Что бы указать количество запросов, выполняемых каждым “клиентом” – используйте опцию --number-of-queries. Её число будет поделено на кол-во “клиентов”.

Например – при вызове mysqlslap  с опциями --concurrency=10 --number-of-queries=100 – 100/10, следовательно каждый “клиент” выполнит по 10 запросов:

$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency=10 --number-of-queries=100
Enter password:
Benchmark
Average number of seconds to run all queries: 0.024 seconds
Minimum number of seconds to run all queries: 0.024 seconds
Maximum number of seconds to run all queries: 0.024 seconds
Number of clients running queries: 10
Average number of queries per client: 10

По-умолчанию – mysqlslap  создаёт таблицу с двумя столбцами – один int и один var.

Если вы хотите изменить эти значения и увеличить таблицу – используйте опции --number-char-cols для указания количества столбцов типа char, и --number-int-cols – для столбцов ineteger:

$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10 --number-of-queries 100 --number-char-cols=5 --number-int-cols=10
Enter password:
Benchmark
Average number of seconds to run all queries: 0.040 seconds
Minimum number of seconds to run all queries: 0.040 seconds
Maximum number of seconds to run all queries: 0.040 seconds
Number of clients running queries: 10
Average number of queries per client: 10

Наиболее удобная опция – вызов собственных запросов с помощью опции --query:

$ mysqlslap -u setevoy -p --create-schema=setevoyorgua_db1 --query="select post_author, post_date from db_posts;" -vvv
Parsing engines to use.
Enter password:
Starting Concurrency Test
Generating primary key list
connected!
select post_author, post_date from db_posts;;
Generating stats
Benchmark
Average number of seconds to run all queries: 0.000 seconds
Minimum number of seconds to run all queries: 0.000 seconds
Maximum number of seconds to run all queries: 0.000 seconds
Number of clients running queries: 1
Average number of queries per client: 1

Опция --create-schema служит для указания используемой базы данных.

Так же – в --query можно указать путь к sql-файлу с запросом.

И ещё одна приятная возможность – опция – --engine, с помощью которой можно явно задать тип таблиц для тестирования и сравнения:

$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10 --number-of-queries 100 --number-char-cols=5 --number-int-cols=10 --engine=innodb
Enter password:
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 0.175 seconds
Minimum number of seconds to run all queries: 0.175 seconds
Maximum number of seconds to run all queries: 0.175 seconds
Number of clients running queries: 10
Average number of queries per client: 10
$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10 --number-of-queries 100 --number-char-cols=5 --number-int-cols=10 --engine=myisam
Enter password:
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.040 seconds
Minimum number of seconds to run all queries: 0.040 seconds
Maximum number of seconds to run all queries: 0.040 seconds
Number of clients running queries: 10
Average number of queries per client: 10
$ mysqlslap -u setevoy -p --auto-generate-sql --concurrency 10 --number-of-queries 100 --number-char-cols=5 --number-int-cols=10 --engine=memory
Enter password:
Benchmark
Running for engine memory
Average number of seconds to run all queries: 0.033 seconds
Minimum number of seconds to run all queries: 0.033 seconds
Maximum number of seconds to run all queries: 0.033 seconds
Number of clients running queries: 10
Average number of queries per client: 10

Полный список опций можно посмотреть командой:

$ mysqlslap --help

Либо на странице http://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html