Итак, на текущий момент мы изучили для чего, что измерять и какими способами тестировать производительность БД MySQL. Теперь обратим внимание на то, какие программные средства, инструменты и утилиты для этого используются. Если нет веских оснований считать, что готовые инструменты не подходят для ваших целей, то не стоит создавать собственную систему эталонного тестирования баз данных MySQL, а использовать готовые проверенные решения. В этой статье я расскажу о некоторых из этих инструментов.
Полностековые инструменты
Вспомним, что существует два типа эталонного тестирования: полностековое и покомпонентное. Нет ничего удивительного в том, что имеются инструменты для тестирования всего приложения и тестирования под нагрузкой MySQL и других компонентов по отдельности. Полностековое тестирование — обычно лучший способ получить полное представление о производительности всей системы. В число инструментов полностекового тестирования входят следующие:
- ab. Это инструмент тестирования производительности сервера HTTP Apache. Он показывает, сколько запросов в секунду способен обслуживать НТТР-сервер. Если вы тестируете веб-приложение, это число демонстрирует, какое количество запросов в секунду может обслужить приложение в целом. Это очень простой инструмент, но полезность его ограниченна, поскольку он просто обращается к одному адресу URL настолько быстро, насколько это возможно. Дополнительную информацию об утилите ab вы найдете на странице;
- http_load. Концепция этого инструмента похожа на концепцию
ab
: он также предназначен для создания нагрузки на веб-сервер, но более гибок. Вы можете создать входной файл, включающий много разных адресов URL, ahttp_load
будет выбирать их случайным образом. Также можете настроить параметры таким образом, что запросы станут отправляться с заданным интервалом, а не с максимально возможной скоростью. Подробности смотрите на этой странице; - JMeter. Представляет собой приложение на языке Java, которое может загружать другое приложение и измерять его производительность. Эта утилита была разработана для тестирования веб-приложений, но ее можно использовать и при тестировании FTP-серверов, и при отправке запросов к базе данных через интерфейс JDBC.
Утилита
JMeter
значительно сложнее, чемab
иhttp_load
. С ее помощью можно более гибко имитировать поведение реальных пользователей, управляя таким параметром, как время нарастания нагрузки. У нее есть графический пользовательский интерфейс со встроенными средствами построения графиков, также она позволяет сохранять результаты и воспроизводить их в автономном режиме. Подробности смотрите на этой странице.
Инструменты покомпонентного тестирования
Предусмотрены несколько полезных инструментов для тестирования производительности MySQL и операционной системы, на которой она работает. Далее приведем примеры эталонных тестов, в которых эти инструменты используются.
- mysqlslap. Имитирует нагрузку на сервер и выдает данные хронометража. Эта утилита является частью дистрибутива MySQL 5.1, но ее можно использовать и с более ранними версиями, начиная с 4.1. Вы можете настроить количество конкурентных соединений и передать программе с помощью либо команды SQL в командной строке, либо файла с командами SQL. Если вы не зададите режим тестирования вручную, программа сама исследует схему базы данных и автоматически сгенерирует команды
SELECT
. - MySQL Benchmark Suite (sql-bench). Вместе с сервером MySQL распространяется набор инструментов эталонного тестирования, который можно использовать для исследования нескольких различных серверов баз данных. Он однопоточный и измеряет скорость выполнения запросов сервером. Результаты показывают, какие типы операций сервер хорошо выполняет.
Главным преимуществом этого набора является то, что он содержит множество готовых тестов, так что с его помощью легко сравнивать различные подсистемы хранения или конфигурации. Как высокоуровневый инструмент эталонного тестирования, он полезен для сравнения общей производительности двух серверов. Кроме того, вы можете запускать подмножество тестов (например, тестировать только производительность команды
UPDATE
). В основном тесты нагружают процессоры, но есть короткие периоды, в течение которых выполняется большой объем операций дискового ввода/вывода.Среди основных недостатков этого инструмента можно выделить следующие: он работает в однопользовательском режиме, задействует очень маленький набор исходных значений, не допускает тестирования на данных, характерных именно для ваших условий, а его результаты могут сильно варьироваться от запуска к запуску. Поскольку он однопоточный и полностью последовательный, с его помощью невозможно оценить выигрыш от наличия нескольких процессоров, но вместе с тем он вполне пригоден для сравнения однопроцессорных серверов. Эталонное тестирование сервера базы данных требует установки драйверов DBD и языка Perl. Документацию можно найти по адресу.
- Super Smack. Это инструмент эталонного тестирования, тестирования под нагрузкой и создания нагрузки для MySQL и PostgreSQL. Он мощный, но довольно сложный, позволяет имитировать работу нескольких пользователей, загружать тестовые данные в базу и заполнять таблицы случайно сгенерированными значениями. Эталонные тесты содержатся в smack-файлах, использующих простой язык определения клиентов, таблиц, запросов и т. д.
- Database Test Suite. Инструмент разработан компанией The Open Source Development Labs (OSDL) и размещен на сайте SourceForge по этому адресу, представляет собой набор утилит для запуска эталонного тестирования, сходного со стандартными промышленными эталонными тестами, такими как опубликованные Советом по оценке производительности обработки транзакций (Transaction Processing Performance Council, TPC). В частности, инструмент dbt2 представляет собой бесплатную (но несертифицированную) реализацию теста ТРС-С OLTP. Мы неоднократно использовали его, пока не разработали специальный инструмент для MySQL.
- Percona's TPCC-MySQL Tool. Мы создали реализацию эталонного теста, аналогичного тесту ТРС-С, с инструментами, специально разработанными для эталонного тестирования MySQL. Обычно используем его для оценки поведения MySQL при нестандартных нагрузках. (Для более простых эталонных тестов применяем sysbench.) Исходный код доступен на этой странице, также в исходном репозитории хранится краткая документация по использованию.
- sysbench. Это многопоточный инструмент для эталонного тестирования системы. Цель его применения — получить представление о производительности системы с точки зрения факторов, важных для работы сервера базы данных. Например, вы можете измерить производительность файлового ввода/вывода, планировщика операционной системы, распределения памяти и скорости передачи данных, потоков POSIX и самого сервера базы данных,
sysbench
поддерживает скрипты на языке Lua, что делает его очень гибким при тестировании множества сценариев. Это наш любимый универсальный инструмент эталонного тестирования MySQL, операционной системы и производительности оборудования.
Функция MySQL BENCHMARK()
В MySQL имеется удобная функция BENCHMARK()
, которую можно использовать для тестирования скорости выполнения определенных типов операций. Для этого нужно указать количество прогонов и подлежащее выполнению выражение. Им может быть любое скалярное выражение, например скалярный подзапрос или функция. Это удобно для тестирования относительных скоростей некоторых операций, в частности для оценки того, какая из функций, MD5()
или SHA1()
, работает быстрее:
mysql> SET @input := 'hello world';
mysql> SELECT BENCHMARK(1000000, MD5(@input));
+---------------------------------+
| BENCHMARK(1000000, MD5(@input)) |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (2.78 sec)
mysql> SELECT BENCHMARK(1000000, SHA1(@input));
+----------------------------------+
| BENCHMARK(1000000, SHA1(@input)) |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (3.50 sec)
Возвращаемым значением всегда является 0, клиентское приложение сообщает, сколько времени потребовалось на выполнение запроса. В данном случае, похоже, быстрее работает MD5()
. Однако корректно использовать функцию BENCHMARK()
непросто, если вы не совсем понимаете, что она делает. А она просто определяет, как быстро сервер может выполнить выражение, но не сообщает ничего об издержках на синтаксический анализ и оптимизацию. И если выражение не включает в себя пользовательскую переменную, как в нашем примере, то второй и последующие случаи выполнения сервером данного выражения могут оказаться обращением к кэшу.
Несмотря на удобство функции BENCHMARK()
, мы никогда не применяем ее для реального эталонного тестирования: слишком трудно определить, что она в действительности измеряет. Кроме того, ее результаты относятся лишь к небольшой части всего процесса выполнения.
Теперь рассмотрим на конкретных примерах, как работает каждая утилита. Начнем с http_load.