Оптимизация ядра Linux

Для того чтобы система могла поддерживать большую конкурентность, помимо обязательной установки расширения event, оптимизация ядра Linux также является наиболее важной. Каждая из следующих оптимизаций очень важна, и их обязательно нужно выполнять поочередно.

Объяснение параметров:

max-file: обозначает количество дескрипторов файлов, которые могут быть открыты на системном уровне. Это значение относится ко всей ОС, а не к пользователю.

ulimit -n: обозначает контроль за количеством дескрипторов файлов, которые могут быть открыты на уровне процесса. Это значение контролирует доступные дескрипторы файлов для текущего пользователя и процессов, запущенных из текущего shell.

Посмотреть количество дескрипторов файлов, которые могут быть открыты на системном уровне: 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. Начиная с ядра Linux 4.12, конфигурация 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 процесса для поддержки пользовательских соединений, общее количество соединений, которое может поддерживать приложение, не превысит 41024, что означает, что одновременно могут находиться в сети лишь 4 1024 пользователей, это значение можно увеличить, чтобы сервер мог поддерживать больше TCP-соединений.

Три способа изменения soft open files:

Первый способ: непосредственно в терминале выполнить ulimit -HSn 102400, затем перезапустите workerman.

Это будет действовать только в текущем терминале, после выхода количество open files снова вернется к значению по умолчанию.

Второй способ: добавьте в конце файла /etc/profile строку ulimit -HSn 102400, так что при каждом входе в терминал будет автоматически выполнено это действие. После изменения необходимо перезапустить workerman.

Третий способ: для того чтобы сделать изменение количества open files постоянным, необходимо изменить файл конфигурации: /etc/security/limits.conf. Добавьте в этот файл:

* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000

Этот метод требует перезагрузки сервера для вступления в силу.