...

среда, 5 ноября 2014 г.

[Из песочницы] Тестирование производительности форков Mysql на реальных данных

Введение




Назрел апгрейд системы web сервера, на котором с 2007 года крутился сайт интернет-магазина на самописном движке mysql 5.1 + perl + apache + nginx.

Как обычно, при росте посещаемости все стало упираться в базу данных. Стал выбирать новую базу данных, совместимую с текущей. Выбирал из Mysql 5.5, Mysql 5.6, MariaDB 10, Percona Sever 5.6.


После длительного изучения бенчмарков стало понятно, что нужно тестировать производительность на реальных данных. Во-первых, в большинстве случаев сравнивали InnoDB и XtraDB, во-вторых — тестировали в основном бешеные нагрузки на монстр-серверах, интересные мне показатели находились на узеньком участке графика, где обычно ничего не было понятно.



Подготовка к тестированию





  1. Создаем виртуалку, я выбрал простую конфигурацию с 4 ядрами и 4гб оперативки, Debian 7.6;

  2. Ставим nginx и аpache, конфигурацию берем из коробки без кэша и тюнинга;

  3. Ставим siege — утилиту для нагрузочного тестирования, есть в стандартном репозитории;

  4. Лезем в статистику сайта и выбираем самые популярные страницы, чтобы протестировать работу сайта полноценно. Я выбрал первые 50 страниц по хитам за последний месяц, сохраняем эти урлы в urls.txt, Яндекс.Метрика умеет выгружать эти данные в csv;

  5. Прописываем в /etc/hosts ip виртуалки для нужного домена;

  6. Подключаем репозитории Mysql, Maria, Percona

    deb http://ift.tt/1s3fgqs wheezy main
    deb-src http://ift.tt/1s3fgqs wheezy main
    deb http://ift.tt/1x34DM8 wheezy free

    deb http://ift.tt/KKlZ39 wheezy main
    deb-src http://ift.tt/KKlZ39 wheezy main

    deb http://ift.tt/1x34DMb wheezy mysql-5.6
    deb-src http://ift.tt/1x34DMb wheezy mysql-5.6

    Mysql 5.5 есть в стандартном репозитории;



  7. Переносим дамп старой базы данных, создаем еще 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 — Общая занятая память на виртуалке





































































































































База/СторежETimeRTimeTRateConcOKLAMEM
Mysql 5.1 MyISAM252.983.953.8315.159696.981055
Mysql 5.5 MyISAM500.197.481.8013.5090214.671265
Mysql 5.6 MyISAM289.895.553.4319.019946.591000
Percona 5.6 MyISAM510.718.421.8015.1591911.761657
MariaDB 10.0 MyISAM351.746.102.7416.7196410.23889
MariaDB 10.0 Aria page=8k Trans904.7612.070.748.8966627.861545
MariaDB 10.0 Aria page=1k NonTrans781.4310.470.949.8973827.761465
Mysql 5.1 InnoDB368.215.912.5515.089407.231241
Mysql 5.6 InnoDB229.924.544.3519.7610006.661414
MariaDB InnoDB223.354.384.4819.6110006.241813
Percona 5.6 XtraDB223.784.424.4719.7510005.091176
MariaDB 10.0 XtraDB222.554.384.4919.6610006.391176

Диаграммы





Из данных теста выбираю между Maria DB и Percona Server на XtraDB. Склоняюсь к Percona. Кроме незначительного выигрыша в производительности есть еще расширенная статистика по запросам к таблицам и хороший набор утилит.


P.S. Тестирование заняло порядка 5 часов, большую часть времени занял перенос данных с боевой машин и установка/снос пакетов. А вообще, мой хостер (flops.ru) позволяет клонировать виртуалку, занимает это порядка 1 минуты и перебрасывать IP между виртуалками. Если бы не старый софт на боевой виртуалке, можно было бы клонировать ее и потестировать (списание средств идет посуточно за потребление). Это сэкономило бы мне кучу времени.


P.P.S. Думаю следующим этапом устроить тестирование в боевом режиме, сделать клон виртуалки, настроить тестовую срезу и на 1 день перекинуть IP адрес с боевой.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий