Оптимизация сервера MySQL с помощью утилиты MySQL Tuner
Оптимизация сервера MySQL с помощью специальной утилиты mysqltuner.
После установки MySQL на выделенный сервер, базовый файл конфигурации находится в /etc/my.cnf
.
В такой конфигурации работать сервер будет, но про оптимальную работу говорить не буду.
Сперва потребуется конфигурационный файл my.cnf
, более подходящий для нашего сервера.
По умолчанию примеры расположены в директории /usr/share/mysql
.
Выбираем конфигурационный файл исходя из наших потребностей:
my-small.cnf
- для систем с объемом памяти менее 64Mb, где MySQL используется редко или в незначительной степени;
medium.cnf
- под MySQL может выделяться до 64Мb памяти (для маломощных VDS/VPS);
my-large.cnf
- для систем с оперативной памятью от 512Мb;
my-huge.cnf
- для систем с оперативной памятью 1-2Gb;
Выбираем одну из наиболее подходящих нам конфигураций и переписываем её вместо текущей my.cnf
.
1 | cp /usr/share/mysql/my-large.cnf /etc/my.cnf |
Приступим к оптимизации с помощью утилиты MySQL Tuner
Скачиваем утилиту
1 | wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl |
и запускаем
1 | perl mysqltuner.pl |
Скрипт попросит имя и пароль MySQL администратора, после чего выведет результаты своей работы.
Вывод результатов работы утилиты примерно такой:
1 | >> MySQLTuner 1.4.0 - Major Hayden <major@mhtx.net> |
Очень важно обратить внимание на строку
1 | [OK] Highest usage of available connections: 10% (16/151) |
Количество текущих соединений - 16, количество возможных соединений - 151. Параметр 151 - это параметр использующийся по умолчанию. Обычно этого значения маловато, именно из-за него появляются сообщения вида “Too many active connections”. Увеличим этот параметр до 300.
В секции [mysqld]
в конфигурационном файле /etc/my.cnf
1 | max_connections = 300 |
Еще одним, наиболее важным параметром увеличения производительности MySQL является key_buffer_size
. Параметр определяет размер общего для всех пользовательских процессов буфера индексных блоков MyISAM таблиц. Обычно устанавливается в пределах 30-40% от общей выделенной под MySQL оперативной памяти.
Следует помнить, что рекомендации утилиты MySQL Tuner будут тем более оптимальны, чем дольше работает без перезагрузок сервер MySQL.
Рекомендации
- Ставим MyISAM по умолчанию и отключаем ненужные нам вещи:
1 | default-storage-engine=MyISAM |
- Привязываем базу для использования только на нашем сервере:
1 | bind-address = 127.0.0.1 |
- Выставляем необходимые максимальные ограничения:
1 | max_connect_errors = 1K |
- Устанавливаем общий буфер, кэш для запросов и максимальный размер для временных таблиц:
1 | key_buffer_size=128M |
- Максимальное число соединений к базе и ожидающих их процессов:
1 | max_connections = 160 |
- Буферы на каждый процесс (большие значения типа 1Mb и выше для нас это явно перебор).
1 | read_buffer_size = 128K |
- Служебный сортировочный буфер (память постоянно не занимает) и кэш открытых таблиц.
1 | myisam_sort_buffer_size = 512M |
- Необходимые таймауты, чтобы отсекать долгие ожидания.
1 | interactive_timeout = 60 |
- Установка кодировки UTF-8:
1 | character-set-server=utf8 |
- По-желанию можно добавить логи медленных запросов или неиспользуемых индексов
(создайте доступным на запись файл для лога).
1 | log_slow_queries = 1 |
Обратите внимание на “1.7M per thread (151 max threads)”. Увеличив количество max_connections
в 3 раза, сильно увеличится использование оперативной памяти. Поэтому не стоит ставить max_connections
про запас. Посмотрите свои текущие метрики, сколько соединений бывает в пике, прибавьте к этому 10-20%.