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