С помощью инструмента sysbench
можно запускать различные эталонные тесты. Он разработан не только для тестирования производительности базы данных, но и для определения того, насколько хорошо работает система как сервер баз данных. Фактически авторы Петр и Вадим изначально разработали его для запуска эталонных тестов, особенно важных для оценки производительности MySQL, даже несмотря на то, что они на самом деле не являются эталонными тестами MySQL. Мы начнем с некоторых тестов, не характерных для MySQL и измеряющих производительность подсистем, которые определяют общие ограничения системы. Затем покажем, как измерять производительность базы данных.
Мы настоятельно рекомендуем познакомиться с sysbench. Это один из самых полезных инструментов в наборе пользователя MySQL. И хотя существует множество других инструментов, которые выполняют часть его функций, эти инструменты не всегда надежны и полученные результаты не всегда отражают производительность MySQL. Например, вы можете тестировать производительность ввода/вывода с помощью iozone
, bonnie++
и ряда других инструментов, однако потребуется приложить много усилий, чтобы заставить их тестировать ввод/вывод таким же образом, как InnoDB нагружает диски. А вот sysbench
ведет себя так же, как InnoDB, поэтому его тест fileio
вполне релевантен в поставляемом виде.
Эталонное тестирование процессора с помощью инструмента sysbench
Стандартным тестом подсистемы является эталонный тест процессора, в котором для вычисления простых чисел до указанного максимума используются 64-разрядные целые числа. Мы запустили этот тест на двух серверах, каждый под управлением GNU/Linux, и сравнили результаты. Вот характеристики оборудования первого сервера:
[server1 ~]$ cat /proc/cpuinfo
...
model name : AMD Opteron(tm) Processor 246
stepping : 1
cpu MHz : 1992.857
cache size : 1024 KB
И вот как прошел запуск эталонного теста:
[server1 ~]$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench v0.4.8: multithreaded system evaluation benchmark
...
Test execution summary: total time: 121.7404s
У второго сервера другой процессор:
[server2 ~]$ cat /proc/cpuinfo
...
model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz
stepping : 6
cpu MHz : 1995.005
Вот результат его эталонного теста:
[server1 ~]$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench v0.4.8: multithreaded system evaluation benchmark
...
Test execution summary: total time: 61.8596s
Результат показывает общее время, требуемое для вычисления простых чисел, которое очень легко сравнить. В данном случае второй сервер выполнил эталонный тест приблизительно в два раза быстрее, чем первый.
Эталонное тестирование файлового ввода/вывода с помощью инструмента sysbench
Эталонный тест fileio
измеряет параметры работы системы при различных нагрузках ввода/вывода. Он очень полезен для сравнения жестких дисков, RAID-контроллеров и режимов RAID, а также настройки подсистемы ввода/вывода. Тест эмулирует работу InnoDB с дисками.
Первым делом нужно подготовить несколько файлов. Вам необходимо сгенерировать намного больше данных, чем помещается в памяти. Когда данные загрузятся в память, операционная система будет кэшировать большую их часть, а результаты не совсем точно отразят нагрузку на подсистему ввода/вывода. Начнем с создания набора данных:
$ sysbench --test=fileio --file-total-size=150G prepare
Эта команда создает файлы в текущем рабочем каталоге, на этапе запуска в него будет производиться запись и из него — чтение.
Вторым шагом является запуск теста. Для тестирования производительности при различных типах нагрузки на систему ввода/вывода используется несколько параметров:
seqwi
— последовательная запись;seqrewr
— последовательная перезапись;seqrd
— последовательное чтение;rndrd
— произвольное чтение;rndwr
— произвольная запись;rndrw
— произвольное чтение в сочетании с произвольной записью.
Следующая команда запускает тест ввода/вывода с произвольными чтением/записью:
$ sysbench --test=fileio --file-total-size=150G --file-test-mode=rndrw/
--init-rng=on --max-time=300 --max-requests=0 run
И вот результаты:
sysbench v0.4.8: multithreaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Initializing random number generator from timer.
Extra file open flags: 0
128 files, 1.1719Gb each
150Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Time limit exceeded, exiting...
Done.
Operations performed: 40260 Read, 26840 Write, 85785 Other = 152885 Total
Read 629.06Mb Written 419.38Mb Total transferred 1.0239Gb (3.4948Mb/sec)
223.67 Requests/sec executed
Test execution summary:
total time: 300.0004s
total number of events: 67100
total time taken by event execution: 254.4601
per-request statistics:
min: 0.0000s
avg: 0.0038s
max: 0.5628s
approx. 95 percentile: 0.0099s
Threads fairness:
events (avg/stddev): 67100.0000/0.00
execution time (avg/stddev): 254.4601/0.00
Получен большой объем информации. Для измерения производительности подсистемы ввода/вывода наиболее интересны количество запросов в секунду и общая пропускная способность — в данном случае 223,67 запроса в секунду и 3,4948 Мбайт/с соответственно. Эти значения дают хорошее представление о производительности диска.
Закончив тестирование, можете запустить очистку, чтобы удалить файлы, созданные программой sysbench для эталонного тестирования:
$ sysbench --test=fileio --file-total-size=150G cleanup
Эталонное тестирование OLTP-системы с помощью инструмента sysbench
Эталонное тестирование системы OLTP эмулирует рабочую нагрузку, характерную для обработки транзакций. Приведем пример такого тестирования для таблицы, содержащей 1 миллион строк. В первую очередь нужно подготовить эту таблицу:
$ sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test/
--mysql-user=root prepare
sysbench v0.4.8: multithreaded system evaluation benchmark
No DB drivers specified, using mysql
Creating table 'sbtest'...
Creating 1000000 records in table 'sbtest'...
Это все, что нужно сделать для подготовки тестовых данных. Затем на 60 секунд запустим эталонный тест в режиме чтения с восьмью конкурентными потоками:
$ sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=test --mysql-user=root/
--max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run
sysbench v0.4.8: multithreaded system evaluation benchmark
No DB drivers specified, using mysql
WARNING: Preparing of "BEGIN" is unsupported, using emulation
(last message repeated 7 times)
Running the test with following options:
Number of threads: 8
Doing OLTP test.
Running mixed OLTP test
Doing read-only test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct
cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Threads started!
Time limit exceeded, exiting...
(last message repeated 7 times)
Done.
OLTP test statistics:
queries performed:
read: 179606
write: 0
other: 25658
total: 205264
transactions: 12829 (213.07 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 179606 (2982.92 per sec.)
other operations: 25658 (426.13 per sec.)
Test execution summary:
total time: 60.2114s
total number of events: 12829
total time taken by event execution: 480.2086
per-request statistics:
min: 0.0030s
avg: 0.0374s
max: 1.9106s
approx. 95 percentile: 0.1163s
Threads fairness:
events (avg/stddev): 1603.6250/70.66
execution time (avg/stddev): 60.0261/0.06
Как и ранее, в полученных результатах содержится очень много информации. Наибольший интерес представляют следующие данные:
- счетчик транзакций;
- количество транзакций в секунду;
- временная статистика (минимальное, среднее, максимальное время и 95-й процентиль);
- татистика равномерности загрузки потоков, которая показывает, насколько справедливо распределялась между ними имитированная нагрузка.
Приводимый пример применим к версии 4 инструмента sysbench
, которая доступна в предварительно созданных двоичных файлах на SourceForge.net. Но если вы скомпилируете sysbench
из исходного кода на Launchpad (это легко и просто!), то сможете воспользоваться большим количеством улучшений, внесенных в версию 5. Вы сможете запускать эталонные тесты не для одной таблицы, а для нескольких, через равные интервалы (например, каждые 10 секунд) видеть пропускную способность и время отклика. Эти показатели очень важны для понимания поведения системы.
Другие возможности инструмента sysbench
Инструмент sysbench может запускать другие эталонные тесты системы, которые непосредственно не измеряют производительность сервера базы данных.
- memory. Выполняет последовательные операции чтения или записи в памяти.
- threads. Проводит эталонное тестирование производительности планировщика потоков. Особенно полезно тестировать поведение планировщика при высоких нагрузках.
- mutex. Измеряет производительность работы мьютексов, эмулируя ситуацию, когда все потоки большую часть времени конкурируют, захватывая мьютекс только на короткое время (мьютекс — это структура данных, которая гарантирует взаимоисключающий доступ к некоторому ресурсу, предотвращая возникновение проблем, связанных с конкурентным доступом).
- seqwr. Измеряет производительность последовательной записи. Это очень важно для тестирования практических пределов производительности системы. Тест может показать, насколько хорошо работает кэш RAID-контроллера, и предупредить, если результаты оказываются необычными. Например, если отсутствует кэш записи с резервным питанием от батареи, а диск обрабатывает 3000 запросов в секунду, то что-то идет не так и вашим данным определенно угрожает опасность.
Кроме параметра, задающего режим тестирования (--test
), инструмент sysbench
принимает и некоторые другие общие параметры, такие как --num-threads
, --max-requests
и --maxtime
. Подробное описание этих параметров вы найдете в соответствующей технической документации.