Тонкая настройка сетевого стека линукс для обработки большого числа запросов.
Открытые файлы
Каждый TCP сокет требует собственного файлового идентификатора, необходимо увеличить лимит открытых файлов. Текущие лимиты возможно посмотреть командой ulimit -a
. Лимит открытых файлов выставим 999999
и скорее всего быстрее закончится память чем мы упремся в это ограничение, хотя все возможно. Нужно так же помнить, что лимиты возможно выставлять для определенных пользователей в системе.
Лимиты должный быть заданы в файле, который необходимо разместить в директории /etc/security/limits.d/
. Содержание файла:
* soft nofile 999999
* hard nofile 999999
* - для всех пользователей
Порты
Неободимо увеличить число портов учавствующих в открытии соединения. По умолчанию для использования доступны порты с 32768
по 61000
. Надо изменить это значение на 18000
- 65535
.
Состояние TIME_WAIT
Соединение TCP проходит несколько стадий во время своей жизни. Рассмотрим последнюю стадию закрытия соединения TIME_WAIT
. Это время которое отведено на окончание соединения и по умолчанию оно равно 120 секунд и это очень много. Пока соединение не закрыто занимаются ресурсы сервера. В качестве эксперемента возможно установить значение папраметра TIME_WAIT
в 1 секунду, НО это подходит не для всех шаблонов использование и должно внедрятся эксперементально.
Для того чтоб изменения вступили в силу необходимо внести их в фаил, который надо разместить в дирректории /etc/sysctl.d/
. Содержание файла:
net.ipv4.ip_local_port_range = 18000 65535
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 1
Отслеживание соединения
Побочный эффект iptables
это разрастание таблицы в которую заносятся ESTABLISHED
соединения. Таблица находится в оперативной памяти. Самый правильный способ не допустить разрастания или переполнения этой таблицы, это уменьшить время хранения значения в таблицы nf_conntrack_tcp_timeout_established
. По умолчанию значение равно 432000 секунд. Надо изменить на значение намного меньше.
Занесем в фаил следующее значение:
net.netfilter.nf_conntrack_tcp_timeout_established=600
Ядро
В ядре линукса >3.5 внесено много оптимизация по умолчанию, которые раньше приходилось делать вручную. Используйте новые ядра :)
Дополнительно
#Retry SYN/ACK only three times, instead of five
net.ipv4.tcp_synack_retries = 3
# Try to close things only twice
net.ipv4.tcp_orphan_retries = 2
# FIN-WAIT-2 for only 5 seconds
net.ipv4.tcp_fin_timeout = 5
# Increase syn socket queue size (default: 512)
net.ipv4.tcp_max_syn_backlog = 2048
# One hour keepalive with fewer probes (default: 7200 & 9)
net.ipv4.tcp_keepalive_time = 3600
net.ipv4.tcp_keepalive_probes = 5
# Max packets the input can queue
net.core.netdev_max_backlog = 2500
# Keep fragments for 15 sec (default: 30)
net.ipv4.ipfrag_time = 15
# Use H-TCP congestion control
net.ipv4.tcp_congestion_control = htcp
Вольный перевод www.lognormal.com и news.ycombinator.com