Улучшить работу высоконагруженных серверов можно:

  • увеличив лимит открытых файлов,
  • увеличив максимальный лимит подключений к БД MySQL,

  • увеличив размер буфера для InnoDB в MySQL,

  • настроив объем redo-логов для InnoDB в MySQL.

Установка лимита открытых файлов

Для установки лимита открытых файлов необходимо:

  1. Проверить текущий лимит командой:

    ulimit -a

    Результат выполнения команды будет выведен на консоль.
    По умолчанию лимит открытых файлов составляет 1024:

    Данного лимита недостаточно для нормальной работы высоконагруженных серверов.

    Рекомендуется устанавливать лимит не меньше 65536.
  2. Установить лимит открытых файлов одним из способов:

    • Для каждого пользователя:
      В файл /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
      ...
  3. Актуализировать конфигурационный файл каждого высоконагруженного сервиса. Для этого необходимо:
    1. Создать файл /etc/systemd/system/НАЗВАНИЕ_СЕРВИСА.service.d/limit.conf и добавить в него следующую информацию:

      Пример настройки
      [Service]
      LimitNOFILE=количество_открытых_файлов_на_сервис
    2. Перезапустить demon-reload командой:

      systemctl daemon-reload
    3. Перезапустить сервис командой:

      systemctl restart service

Установка максимального лимита подключений к БД MySQL

Для установки максимального лимита подключений к БД MySQL необходимо:

  1. Проверить текущее значение командой в консоли MySQL:

    show variables like "max_connections"

    Результат выполнения команды будет выведен на консоль.
    По умолчанию максимальный лимит подключений к БД MySQL составляет 151:

    Данного лимита недостаточно для высоконагруженных серверов, из-за чего может возникать ошибка «too many connections».

    Рекомендуется устанавливать лимит не меньше 400.
  2. Установить лимит подключений, добавив файл /etc/mysql/mysql.conf.d/mysqld.cnf в секцию [mysqld] значение:

    Пример настройки
    max_connections = 400
  3. Для вступления изменений в силу необходимо перезапустить сервер MySQL.

Установка размера буфера для InnoDB в MySQL

Параметр innodb_buffer_pool_size определяет объем оперативной памяти, который MySQL использует для кэширования таблиц и индексов.

Значение параметра напрямую зависит от общего объема ОЗУ на сервере и от размера активной базы данных. Рекомендуется выделить объем памяти, эквивалентный суммарному размеру всех данных, и заложить резерв в 15-25%, учитывая прирост базы в процессе эксплуатации.

Для установки размера буфера для InnoDB в MySQL необходимо:

  1. Оценить эффективность работы буфера командой в консоли 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% от ОЗУ).
  2. Установить размер буфера MySQL, добавив в конец файла /etc/mysql/mysql.conf.d/mysqld.cnf параметр с необходимым значением. Например:

    Пример настройки
    innodb_buffer_pool_size = 15GB
  3. Перезапустить сервер 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-логов необходимо:

  1. Проверить текущее значение командой в консоли MySQL:

    show variables like 'innodb_redo_log_capacity';

    По умолчанию значение часто равно 104857600 (100 МБ), что является недостаточным для высоконагруженных систем.

    Для серверов с умеренной и высокой нагрузкой на запись рекомендуется устанавливать значение в диапазоне от 1GB до 4GB (в зависимости от дисковой подсистемы и нагрузки). Например, начать с 1G или 2G и проследить за стабильностью записи.

  2. Добавить или изменить параметр в файле /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.

  3. Перезапустить сервер MySQL для вступления изменений в силу.

  • No labels