Введение
Назрел апгрейд системы 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 MyISAM289.89 5.55 3.43 19.019946.591000 |
Автор: evger