Настройка оптимизации ядра Linux
Для поддержки большего количества одновременных соединений в системе, помимо обязательной установки расширения event, настройка ядра Linux также очень важна. Каждая из следующих оптимизаций крайне важна, поэтому обязательно выполните их поочередно.
Объяснение параметров:
max-file: обозначает количество открываемых файловых дескрипторов на уровне системы. Это относится ко всей операционной системе, а не к конкретному пользователю.
ulimit -n: контролирует количество файловых дескрипторов, которые могут быть открыты на уровне процесса. Это управляет количеством доступных файловых дескрипторов для текущего пользователя командной оболочки и его запущенных процессов.
Просмотреть количество открываемых файловых дескрипторов на уровне системы: cat /proc/sys/fs/file-max
Откройте файл /etc/sysctl.conf и добавьте следующие настройки
# Этот параметр устанавливает количество TIME_WAIT в системе, и, если оно превышено, оно будет немедленно очищено
net.ipv4.tcp_max_tw_buckets = 20000
# Определяет максимальную длину очереди прослушивания для каждого порта в системе
net.core.somaxconn = 65535
# Максимальное количество неподтвержденных соединений, которое может быть сохранено в очереди
net.ipv4.tcp_max_syn_backlog = 262144
# Когда скорость приема пакетов на каждом сетевом интерфейсе выше, чем скорость обработки этих пакетов ядром, максимальное количество пакетов, размещенных в очереди, разрешается
net.core.netdev_max_backlog = 30000
# Этот параметр позволяет клиентам в сетях NAT истекать, рекомендуется установить в 0. Начиная с версии ядра 4.12 Linux удалил параметр настройки tcp_tw_recycle. Если вы видите ошибку "No such file or directory", проигнорируйте ее.
net.ipv4.tcp_tw_recycle = 0
# Максимальное количество файлов, которые могут быть открыты всеми процессами в системе
fs.file-max = 6815744
# Размер таблицы слежения за брандмауэром. Обратите внимание, если брандмауэр отключен, может появиться ошибка "net.netfilter.nf_conntrack_max" is an unknown key, просто проигнорируйте ее
net.netfilter.nf_conntrack_max = 2621440
net.ipv4.ip_local_port_range = 10240 65000
Выполните sysctl -p
для немедленного вступления в силу изменений.
Примечание:
/etc/sysctl.conf имеет множество настраиваемых параметров, другие параметры могут быть настроены в соответствии с вашими потребностями окружения.
Открытие файлов
Установка параметров открытия файлов в системе, для решения проблемы too many open files
при высокой загруженности. Этот параметр напрямую влияет на количество клиентских соединений, которые может обработать один процесс.
Soft open files - это параметр системы Linux, который влияет на максимальное количество файловых дескрипторов, которое может открыть один процесс, этот параметр влияет на количество одновременных подключений для долгосрочных приложений, таких как чаты. Вы можете увидеть значение этого параметра, запустив ulimit -n
. Если значение равно 1024, это означает, что один процесс может поддерживать только 1024 соединения или меньше (потому что другие файловые дескрипторы уже открыты). Если вы запустите 4 процесса для поддержания соединений клиентов, то всего количество поддерживаемых соединений не превысит 4 * 1024, то есть максимум 4×1024 пользователей онилайн. Можно увеличить это значение, чтобы приложение могло поддерживать больше TCP-соединений.
Изменение параметра Soft open files возможно тремя способами:
Первый способ: выполнить команду ulimit -HSn 102400
в терминале и перезапустить workerman.
Это действует только в текущем терминале и сбросится при выходе из него.
Второй способ: добавить строку ulimit -HSn 102400
в конец файла /etc/profile
, чтобы она выполнялась автоматически каждый раз при входе в терминал. После изменения этого параметра необходимо перезапустить workerman.
Третий способ: для окончательного установления нового значения open files значение параметра, необходимо изменить конфигурационный файл: /etc/security/limits.conf
. Добавьте следующее в этот файл:
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
Для активации этого изменения потребуется перезапуск сервера.