Skip to content

Instantly share code, notes, and snippets.

@ruslankonev
Created March 27, 2018 12:56
Show Gist options
  • Save ruslankonev/cbad6fc87a6b2695003d6892bcd68904 to your computer and use it in GitHub Desktop.
Save ruslankonev/cbad6fc87a6b2695003d6892bcd68904 to your computer and use it in GitHub Desktop.
Увеличение максимального количества подключений к серверу

На максимальное количество подключений влияют определенные ограничения на стороне клиента и сервера, хотя и немного по-другому.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment