Улучшить работу высоконагруженных серверов можно:
- увеличив лимит открытых файлов,
увеличив максимальный лимит подключений к БД MySQL,
увеличив размер буфера для InnoDB в MySQL,
настроив объем redo-логов для InnoDB в MySQL.
Установка лимита открытых файлов
Для установки лимита открытых файлов необходимо:
Проверить текущий лимит командой:
ulimit -a
Результат выполнения команды будет выведен на консоль.
По умолчанию лимит открытых файлов составляет1024:
Данного лимита недостаточно для нормальной работы высоконагруженных серверов.Рекомендуется устанавливать лимит не меньше65536.Установить лимит открытых файлов одним из способов:
Для каждого пользователя:
В файл/etc/security/limits.confдобавить (или отредактировать, если лимиты были установлены ранее) следующие строки:Пример настройки* soft nproc 65536 * hard nproc 65536 * soft nofile 65536 * hard nofile 65536
Для всего сервера:
В файл/etc/sysctl.confдобавить (или отредактировать, если лимиты были установлены ранее) следующие строки:Пример настройкиfs.file-max = 65536 fs.nr_open = 65536 ...
- Актуализировать конфигурационный файл каждого высоконагруженного сервиса. Для этого необходимо:
Создать файл
/etc/systemd/system/НАЗВАНИЕ_СЕРВИСА.service.d/limit.confи добавить в него следующую информацию:Пример настройки[Service] LimitNOFILE=количество_открытых_файлов_на_сервис
Перезапустить
demon-reloadкомандой:systemctl daemon-reload
Перезапустить сервис командой:
systemctl restart service
Установка максимального лимита подключений к БД MySQL
Для установки максимального лимита подключений к БД MySQL необходимо:
Проверить текущее значение командой в консоли MySQL:
show variables like "max_connections"
Результат выполнения команды будет выведен на консоль.
По умолчанию максимальный лимит подключений к БД MySQL составляет151:
Данного лимита недостаточно для высоконагруженных серверов, из-за чего может возникать ошибка «too many connections».Рекомендуется устанавливать лимит не меньше 400.Установить лимит подключений, добавив файл
/etc/mysql/mysql.conf.d/mysqld.cnfв секцию [mysqld] значение:Пример настройкиmax_connections = 400
Для вступления изменений в силу необходимо перезапустить сервер MySQL.
Установка размера буфера для InnoDB в MySQL
Параметр innodb_buffer_pool_size определяет объем оперативной памяти, который MySQL использует для кэширования таблиц и индексов.
Значение параметра напрямую зависит от общего объема ОЗУ на сервере и от размера активной базы данных. Рекомендуется выделить объем памяти, эквивалентный суммарному размеру всех данных, и заложить резерв в 15-25%, учитывая прирост базы в процессе эксплуатации.
Для установки размера буфера для InnoDB в MySQL необходимо:
Оценить эффективность работы буфера командой в консоли MySQL:
show engine InnoDB status\G
Результат выполнения команды будет выведен на консоль в виде значений параметра "
Buffer pool hit rate":Первое значение должно быть не меньше1000. В данном случае размера буфера для работы MySQL достаточно.
Если первое значение меньше1000(например "995/1000" или "990/1000"), то это означает, что не все операции чтения работают с буфером, и MySQL получает часть данных через операцию чтения из файла.- Если сервер выделен исключительно для БД MySQL, то значение
innodb_buffer_pool_sizeне должно превышать 60-80% от общего объема ОЗУ. - Если на сервере развернута не только БД, то объем буфера необходимо подобрать индивидуально, оставив достаточно свободной памяти для ОС и других программ (обычно не более 30-40% от ОЗУ).
- Если сервер выделен исключительно для БД MySQL, то значение
Установить размер буфера MySQL, добавив в конец файла
/etc/mysql/mysql.conf.d/mysqld.cnfпараметр с необходимым значением. Например:Пример настройкиinnodb_buffer_pool_size = 15GB
- Перезапустить сервер MySQL для вступления изменений в силу.
Настройка объема redo-логов для InnoDB в MySQL
Параметр innodb_redo_log_capacity используется в MySQL начиная с версии 8.0.30. В более старых версиях для этих целей настраивался параметр innodb_log_file_size.
Redo-логи (журналы повторения) используются для обеспечения отказоустойчивости. MySQL сначала записывает изменения в redo-лог, а по достижении заданного объема сбрасывает накопленные данные в файлы таблиц.
Параметр зависит от интенсивности операций записи (INSERT, UPDATE, DELETE) и допустимого времени восстановления базы после сбоя.
- Низкие значения (дефолтные 100 MB): При высокой нагрузке на запись MySQL сбрасывает данные из памяти на диск слишком часто, что приводит к снижению скорости работы БД.
- Слишком высокие значения: Повышают производительность записи, но в случае аварийного выключения сервера восстановление MySQL может занять длительное время.
Для настройки redo-логов необходимо:
Проверить текущее значение командой в консоли MySQL:
show variables like 'innodb_redo_log_capacity';
По умолчанию значение часто равно
104857600(100 МБ), что является недостаточным для высоконагруженных систем.Для серверов с умеренной и высокой нагрузкой на запись рекомендуется устанавливать значение в диапазоне от 1GB до 4GB (в зависимости от дисковой подсистемы и нагрузки). Например, начать с
1Gили2Gи проследить за стабильностью записи.Добавить или изменить параметр в файле
/etc/mysql/mysql.conf.d/mysqld.cnfв секции[mysqld]:innodb_redo_log_capacity = 2G
Для версий MySQL ниже 8.0.30 используйте
innodb_log_file_size=1Gиinnodb_log_files_in_group=2.Перезапустить сервер MySQL для вступления изменений в силу.


