[Из песочницы] Тестирование производительности форков Mysql на реальных данных
Введение Назрел апгрейд системы web сервера, на котором с 2007 года крутился сайт интернет-магазина на самописном движке mysql 5.1 + perl + apache + nginx.Как обычно, при росте посещаемости все стало упираться в базу данных. Стал выбирать новую базу данных, совместимую с текущей. Выбирал из Mysql 5.5, Mysql 5.6, MariaDB 10, Percona Sever 5.6.
После длительного изучения бенчмарков стало понятно, что нужно тестировать производительность на реальных данных. Во-первых, в большинстве случаев сравнивали InnoDB и XtraDB, во-вторых — тестировали в основном бешеные нагрузки на монстр-серверах, интересные мне показатели находились на узеньком участке графика, где обычно ничего не было понятно.
Подготовка к тестированию Создаем виртуалку, я выбрал простую конфигурацию с 4 ядрами и 4 гб оперативки, Debian 7.6; Ставим nginx и аpache, конфигурацию берем из коробки без кэша и тюнинга; Ставим siege — утилиту для нагрузочного тестирования, есть в стандартном репозитории; Лезем в статистику сайта и выбираем самые популярные страницы, чтобы протестировать работу сайта полноценно. Я выбрал первые 50 страниц по хитам за последний месяц, сохраняем эти урлы в urls.txt, Яндекс.Метрика умеет выгружать эти данные в csv; Прописываем в /etc/hosts ip виртуалки для нужного домена; Подключаем репозитории Mysql, Maria, Percona deb http://mirror.timeweb.ru/mariadb/repo/10.0/debian wheezy main deb-src http://mirror.timeweb.ru/mariadb/repo/10.0/debian wheezy main deb http://repo.flops.ru/debian/ wheezy free
deb http://repo.percona.com/apt wheezy main deb-src http://repo.percona.com/apt wheezy main
deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.6 deb-src http://repo.mysql.com/apt/debian/ wheezy mysql-5.6 Mysql 5.5 есть в стандартном репозитории;
Переносим дамп старой базы данных, создаем еще 2 дампа с подменой стореджа sed -e 's/myisam/InnoDB/gi' dump_myisam.sql >dump_innodb.sql sed -e 's/myisam/XtraDB/gi' dump_myisam.sql >dump_xtradb.sql Само тестирование Ставим по очереди базы данных и заливаем туда созданные дампы, проводим тестирование с помощью siege. При установке новой базы полностью сносим пакеты предыдущей и чтобы не париться с конвертацией удаляем каталог /var/lib/mysql, затем по новой заливаем дамп.В качестве параметров для siege я выбрал: /usr/bin/siege -b -c 20 -r 50 -f urls.txt -v
-b включает режим бенчмарка, и не делает произвольных пауз между запросами, на Ваше усмотрение эту опцию можно не использовать; -c 20 задает количество одновременных запросов. Я выбрал 20, это примерно соответствует пиковой нагрузке на боевую конфигурацию в моем случае; -r 50 задает количество запросов с каждого потока, имеет смысл делать равным количеству URL для тестирования, чтобы пробежаться по всем; -f urls.txt — задает файл с тестируемыми URL сайта. В итоге siege делает 1000 запросов к сайту в 20 потоков.Параметры трестируемой базы Размер на диске: 300МБ (в MyIsam)Чтение / Запись: 98% / 2%Основная таблица имеет 40000 записей, порядка 200 столбцов (в ней хранится товары и их свойства), к ней джойнятся дополнительные параметры: производители, курсы валют, группы, акции скидки и другие спецпризнаки, единицы измерения, коллекции… Порядка 10 джойнов.
my.cnf
key_buffer = 512M join_buffer_size = 158M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP max_connections = 100 table_cache = 500 query_cache_limit = 16M query_cache_size = 2G
innodb_log_file_size = 50M innodb_buffer_pool_size = 512M innodb_log_buffer_size = 8M innodb_file_per_table = 1 innodb_open_files = 2548 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT Результаты тестирования Описание колонок ETime — Общее время тестирования (1000 запросов) в секундах RTime — Среднее время ответа в секундах TRate — Среднее количество запросов в секунду Conc — Максимально выдерживаемое количество клиентов одновременно OK — Количество успешно обработанных запросов (статус 200 OK) LA — Максимальный Load Average в процессе тестирования MEM — Общая занятая память на виртуалке База/Стореж ETime RTime TRate Conc OK LA MEM Mysql 5.1 MyISAM 252.98 3.95 3.83 15.15 969 6.98 1055 Mysql 5.5 MyISAM 500.19 7.48 1.80 13.50 902 14.67 1265 Mysql 5.6 MyISAM 289.89 5.55 3.43 19.01 994 6.59 1000 Percona 5.6 MyISAM 510.71 8.42 1.80 15.15 919 11.76 1657 MariaDB 10.0 MyISAM 351.74 6.10 2.74 16.71 964 10.23 889 MariaDB 10.0 Aria page=8k Trans 904.76 12.07 0.74 8.89 666 27.86 1545 MariaDB 10.0 Aria page=1k NonTrans 781.43 10.47 0.94 9.89 738 27.76 1465 Mysql 5.1 InnoDB 368.21 5.91 2.55 15.08 940 7.23 1241 Mysql 5.6 InnoDB 229.92 4.54 4.35 19.76 1000 6.66 1414 MariaDB InnoDB 223.35 4.38 4.48 19.61 1000 6.24 1813 Percona 5.6 XtraDB 223.78 4.42 4.47 19.75 1000 5.09 1176 MariaDB 10.0 XtraDB 222.55 4.38 4.49 19.66 1000 6.39 1176 Диаграммы Из данных теста выбираю между Maria DB и Percona Server на XtraDB. Склоняюсь к Percona. Кроме незначительного выигрыша в производительности есть еще расширенная статистика по запросам к таблицам и хороший набор утилит.
P.S. Тестирование заняло порядка 5 часов, большую часть времени занял перенос данных с боевой машин и установка/снос пакетов. А вообще, мой хостер (flops.ru) позволяет клонировать виртуалку, занимает это порядка 1 минуты и перебрасывать IP между виртуалками. Если бы не старый софт на боевой виртуалке, можно было бы клонировать ее и потестировать (списание средств идет посуточно за потребление). Это сэкономило бы мне кучу времени.
P.P. S. Думаю следующим этапом устроить тестирование в боевом режиме, сделать клон виртуалки, настроить тестовую срезу и на 1 день перекинуть IP адрес с боевой.