На максимальное количество подключений влияют определенные ограничения на стороне клиента и сервера, хотя и немного по-другому.
На стороне клиента: увеличьте диапазон эргового порта и уменьшите tcp_fin_timeout
Чтобы узнать значения по умолчанию:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
Диапазон ephermal port определяет максимальное количество исходящих сокетов, которые хост может создавать с определенного IP-адреса. Параметр fin_timeout
определяет минимальное время, в течение которого эти сокеты остаются в TIME_WAIT состоянии (неприменимо после использования один раз). Обычными настройками системы являются:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
Это в основном означает, что ваша система не может последовательно гарантировать больше, чем (61000 - 32768) / 60 = 470сокеты в секунду. Если вы недовольны этим, вы можете начать с увеличения port_range
. В настоящее время настройка диапазона 15000 61000 очень обычна. Вы можете увеличить доступность, уменьшив fin_timeout
. Предположим, что вы оба, вы можете увидеть более 1500 исходящих подключений в секунду, с большей готовностью.
Чтобы изменить значения:
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
Вышеупомянутое не должно интерпретироваться как факторы, влияющие на возможности системы для исходящих соединений в секунду. Но, скорее, эти факторы влияют на способность системы обрабатывать параллельные соединения устойчивым образом для больших периодов «активности».
Значения по умолчанию Sysctl в типичном linux для tcp_tw_recycle & tcp_tw_reuse будут
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
Они не позволяют подключиться от «использованного» сокета (в состоянии ожидания) и заставляют сокеты длиться полный time_wait
цикл. Я рекомендую установить:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
Это позволяет быстро циклировать сокеты в состоянии time_wait
и повторно использовать их. Но прежде чем вы сделаете это изменение, убедитесь, что это не противоречит протоколам, которые вы будете использовать для приложения, которое нуждается в этих сокетах.
На стороне сервера: net.core.somaxconn
значение играет важную роль. Он ограничивает максимальное количество запросов в очереди на прослушивание. Если вы уверены в возможностях своего серверного приложения, поднимите его с 128 по умолчанию до 128 - 1024. Теперь вы можете воспользоваться этим увеличением, изменив переменную прослушивания прослушивания в вызове прослушивания вашего приложения равным или более высоким целым числом.
sysctl net.core.somaxconn=1024
txqueuelen
Параметр ваших карт Ethernet также должен играть определенную роль. Значения по умолчанию - 1000, поэтому они могут быть увеличены до 5000 или даже больше, если ваша система может справиться с этим.
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
Аналогичным образом поднимите значения для net.core.netdev_max_backlog
и net.ipv4.tcp_max_syn_backlog
. Их значения по умолчанию - 1000 и 1024 соответственно.
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
Теперь не забудьте запустить как клиентские, так и серверные приложения, увеличив FD ulimts в оболочке.
Помимо вышеупомянутого, еще один популярный метод, используемый программистами, заключается в сокращении числа вызовов записи tcp . Мое собственное предпочтение заключается в использовании буфера, в котором я нажимаю данные, которые я хочу отправить клиенту, а затем в соответствующих точках я выписываю буферизованные данные в фактический сокет. Этот метод позволяет мне использовать большие пакеты данных, уменьшать фрагментацию, уменьшать использование моего процессора как на земле пользователя, так и на уровне ядра.