Статьи

Использование Sysbench 0.5 для выполнения тестов MySQL

Первоначально написано Майкл Коберн

Учитывая недавнее волнение и интерес к OpenStack, я хотел убедиться, что я готов провести соответствующие оценки производительности системы. Я обычно обращаюсь к sysbench, так как он поставляется с различными тестами (доступ через интерфейс –test = option), включая:

  • fileio — File I / O test
  • CPU — тест производительности процессора
  • память — тест скорости памяти функций
  • потоки — Тест производительности подсистемы потоков
  • mutex — тест производительности Mutex

Как вы видите, sysbench позволяет вам выделить многие фундаментальные компоненты вашего оборудования и инфраструктуры, такие как дисковая подсистема, а также ваши процессоры и память. Существует дополнительная опция, предназначенная для проведения синтетического стресс-тестирования MySQL, и я был удивлен, когда не увидел его в вышеприведенном списке в версии 0.5, так как он раньше отображался как «oltp — OLTP test». Что случилось с –test = oltp ??

Этот список взят из последней версии sysbench, которая составляет 0.5 — вы будете в этой версии только в том случае, если вы соберете ее самостоятельно или используете пакет, предоставленный Фредериком Декампом.(спасибо, Лефред!) Если вы используете версию из EPEL, Ubuntu 14.04 или Debian 7, вы все еще используете версию 0.4.12 (проверьте с помощью sysbench –version). Вы заметите, что тестовый тип OLTP больше не отображается. Что дает? Я чесал голову, пока не спросил о Percona IRC и обнаружил, что в 0.5 стандартный тип теста OLTP был заменен другим синтаксисом, что вместо передачи параметров в sysbench вы вместо ссылок на скрипты, написанные на lua. Преимущество здесь в том, что теперь у вас есть интерфейс для написания ваших собственных специфических нагрузочных тестов (при условии, что вы знаете lua, но это не сложно). Для тех из вас, кто хочет запустить предконсервированные нагрузочные тесты, они все еще существуют, но вы должны иметь их как часть установки RPM или иным образом скопировать в вашу систему.

К счастью, если вы используете пакет, предоставленный lefred, вы найдете эти сценарии lua здесь (это использование Amazon ami по состоянию на 4 августа 2014 г.):

[root@pxc-control ~]# ls -l /usr/share/doc/sysbench/tests/db/
total 44
-rw-r--r-- 1 root root 3585 Sep 7 2012 common.lua
-rw-r--r-- 1 root root 340 Sep 7 2012 delete.lua
-rw-r--r-- 1 root root 830 Sep 7 2012 insert.lua
-rw-r--r-- 1 root root 2925 Sep 7 2012 oltp.lua
-rw-r--r-- 1 root root 342 Sep 7 2012 oltp_simple.lua
-rw-r--r-- 1 root root 425 Sep 7 2012 parallel_prepare.lua
-rw-r--r-- 1 root root 343 Sep 7 2012 select.lua
-rw-r--r-- 1 root root 3964 Sep 7 2012 select_random_points.lua
-rw-r--r-- 1 root root 4066 Sep 7 2012 select_random_ranges.lua
-rw-r--r-- 1 root root 343 Sep 7 2012 update_index.lua
-rw-r--r-- 1 root root 552 Sep 7 2012 update_non_index.lua

Таким образом, хитрость (если вы хотите это так назвать) заключается в том, что вместо передачи одного слова в директиву –test вместо этого вы передаете полный путь к сценарию lua.

Это старый способ (sysbench 0.4.12 из репозитория EPEL):

--test=oltp --oltp-test-mode=complex

Это новый способ (sysbench 0.5):

--test=/usr/share/doc/sysbench/tests/db/insert.lua

Вот пример теста, который я запускаю через haproxy для 3-узлового кластера PXC, выполняющего тип теста только для INSERT, чтобы вы могли увидеть полный синтаксис, который я передаю sysbench:

[root@pxc-control ~]# cat sys_haproxy.sh
#!/bin/bash
 
sysbench 
--test=/usr/share/doc/sysbench/tests/db/insert.lua 
--mysql-host=pxc-control 
--mysql-port=9999 
--mysql-user=sysbench-haproxy 
--mysql-password=sysbench-haproxy 
--mysql-db=sbtest 
--mysql-table-type=innodb 
--oltp-test-mode=complex 
--oltp-read-only=off 
--oltp-reconnect=on 
--oltp-table-size=1000000 
--max-requests=100000000 
--num-threads=3 
--report-interval=1 
--report-checkpoints=10 
--tx-rate=24 
$1

А вот как выглядит скрипт insert.lua:

[root@pxc-control ~]# cat /usr/share/doc/sysbench/tests/db/insert.lua
pathtest = string.match(test, "(.*/)") or ""
 
dofile(pathtest .. "common.lua")
 
function thread_init(thread_id)
   set_vars()
end
 
function event(thread_id)
   local table_name
   local i
   local c_val
   local k_val
   local pad_val
 
   table_name = "sbtest".. sb_rand_uniform(1, oltp_tables_count)
 
   if (oltp_auto_inc) then
      i = 0
   else
      i = sb_rand_uniq(1, oltp_table_size)
   end
   k_val = sb_rand(1, oltp_table_size)
   c_val = sb_rand_str([[
###########-###########-###########-###########-###########-###########-###########-###########-###########-###########]])
   pad_val = sb_rand_str([[
###########-###########-###########-###########-###########]])
 
   rs = db_query("INSERT INTO " .. table_name ..  " (id, k, c, pad) VALUES " .. string.format("(%d, %d, '%s', '%s')",i, k_val, c_val, pad_val))
end

Что мне больше всего нравится в sysbench 0.5 (за пределами интерфейса lua, конечно же!), Так это то, что он теперь поставляется с опцией –report-interval (которую я обычно устанавливаю как = 1), так что вы получаете вывод во время работы скрипта , Больше не нужно ждать до конца теста, чтобы получить обратную связь! Вот пример sysbench 0.5 в действии, который может выполнить тест INSERT через локальный экземпляр haproxy и выполнить запись в три узла в кластере PXC, таких как OpenStack Trove:

[root@pxc-control ~]# ./sys_haproxy.sh run
sysbench 0.5:  multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 3
Report intermediate results every 1 second(s)
Random number generator seed is 0 and will be ignored
Threads started!
[   1s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1099.28, response time: 9.86ms (95%)
[   2s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 973.02, response time: 10.77ms (95%)
[   3s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1181.01, response time: 6.23ms (95%)
[   4s] threads: 3, tps: 0.00, reads/s: 0.00, writes/s: 1103.00, response time: 6.77ms (95%)

Я также хотел бы обратить ваше внимание на сообщение в  блоге Нилнандана Джоши из команды поддержки Percona, где он описывает метод сборки sysbench 0.5 на Debian 7. Спасибо Нилу за то, что указал на это!

Я надеюсь, что это поможет другим, которые обновятся до sysbench 0.5, а затем зададут вопросы о том, куда направился –test = oltp. Мне бы очень хотелось услышать ваши собственные сценарии использования sysbench и то, публикует ли кто-нибудь еще сценарии lua для собственного нагрузочного тестирования!