Я программирую сервер, и кажется, что мое количество подключений ограничено, поскольку пропускная способность не насыщается, даже если я установил количество подключений как «неограниченное».
Как я могу увеличить или исключить максимальное количество соединений, которые может одновременно открывать мой Ubuntu Linux box? ОС ограничивает это, или это маршрутизатор или провайдер? Или что-то еще?
linux
networking
linux-kernel
red0ct
источник
источник
Ответы:
На максимальное количество соединений влияют определенные ограничения как на стороне клиента, так и на стороне сервера, хотя и немного по-разному.
На стороне клиента: увеличьте диапазон эфермального порта и уменьшите
tcp_fin_timeout
Чтобы узнать значения по умолчанию:
Диапазон внешних портов определяет максимальное количество исходящих сокетов, которое хост может создать с определенного 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 по умолчанию в стандартном окне Linux для
tcp_tw_recycle
&tcp_tw_reuse
будутОни не разрешают соединение из «используемого» сокета (в состоянии ожидания) и заставляют сокеты длиться полный
time_wait
цикл. Я рекомендую установить:Это позволяет быстро переключать сокеты в
time_wait
состояние и повторно использовать их. Но перед тем, как вы сделаете это изменение, убедитесь, что оно не конфликтует с протоколами, которые вы используете для приложения, которому нужны эти сокеты. Обязательно прочитайте пост «Как справиться с TCP-TIME-WAIT» от Винсента Берната, чтобы понять последствия. Этаnet.ipv4.tcp_tw_recycle
опция довольно проблематична для общедоступных серверов, поскольку она не будет обрабатывать соединения от двух разных компьютеров за одним и тем же устройством NAT , что является проблемой, которую трудно обнаружить и которая ждет вас. Обратите внимание, чтоnet.ipv4.tcp_tw_recycle
было удалено из Linux 4.12.На стороне сервера:
net.core.somaxconn
значение играет важную роль. Это ограничивает максимальное количество запросов в очереди к сокету прослушивания. Если вы уверены в возможностях вашего серверного приложения, увеличьте его значение по умолчанию со 128 до 128 - 1024. Теперь вы можете воспользоваться этим увеличением, изменив переменную listen backlog в вызове listen вашего приложения на равное или большее целое число.txqueuelen
Параметр ваших карт Ethernet также играют свою роль. Значения по умолчанию - 1000, поэтому увеличьте их до 5000 или даже больше, если ваша система справится с этим.Аналогичным образом увеличьте значения для
net.core.netdev_max_backlog
иnet.ipv4.tcp_max_syn_backlog
. Их значения по умолчанию 1000 и 1024 соответственно.Теперь не забудьте запустить как клиентские, так и серверные приложения, увеличивая значения FD в оболочке.
Помимо вышесказанного, еще одна популярная техника, используемая программистами, заключается в сокращении количества вызовов tcp-записи . Я предпочитаю использовать буфер, в который я помещаю данные, которые я хочу отправить клиенту, а затем в соответствующих точках записываю буферизованные данные в реальный сокет. Этот метод позволяет мне использовать большие пакеты данных, уменьшить фрагментацию, уменьшить загрузку процессора как на уровне пользователя, так и на уровне ядра.
источник
(61000 - 32768) / 60 = 470 sockets per second
. Можете ли вы уточнить это?Есть пара переменных, чтобы установить максимальное количество соединений. Скорее всего, у вас заканчиваются номера файлов в первую очередь. Проверьте ulimit -n. После этого в / proc есть настройки, но они по умолчанию равны десяткам тысяч.
Что еще более важно, кажется, что вы делаете что-то не так. Одно TCP-соединение должно иметь возможность использовать всю полосу пропускания между двумя сторонами; если это не так:
ping -s 1472
...)tc
iperf
Возможно, я неправильно понял. Может быть, вы делаете что-то вроде Bittorrent, где вам нужно много соединений. Если это так, вам нужно выяснить, сколько соединений вы на самом деле используете (попробуйте
netstat
илиlsof
). Если это число является существенным, вы можете:ulimit -n
. Тем не менее, ~ 1000 подключений (по умолчанию в моей системе) довольно много.iostat -x
?Кроме того, если вы используете NAT-маршрутизатор потребительского уровня (Linksys, Netgear, DLink и т. Д.), Имейте в виду, что вы можете превзойти его возможности с тысячами соединений.
Я надеюсь, что это поможет. Вы действительно задаете сетевой вопрос.
источник
Чтобы улучшить ответ Дерберта,
Вы можете определить, какое ограничение на количество подключений к вашей ОС вы можете, выполнив команду nf_conntrack_max.
Например: cat / proc / sys / net / netfilter / nf_conntrack_max
Вы можете использовать следующий скрипт для подсчета количества соединений tcp с заданным диапазоном портов tcp. По умолчанию 1-65535.
Это подтвердит, превышаете ли вы максимальный лимит соединения с вашей ОС.
Вот сценарий.
источник
which awk
ваш друг, чтобы определить путь к awk, SunOS также имеет ссылку на него :)which
полагается на программу, вPATH
которой вы можете просто использоватьawk
вместо предоставления полного пути. (при этом я не уверен, что решение в сценарии ближе к совершенству, но это не то, о чем сценарий).awk
местоположения, но предполагает, что оболочка всегда/bin/bash
(pro tip: AIX5 / 6 даже не имеет bash по умолчанию).awk
Полезно ли обнаружение? Лично я бы просто предположил, что есть правильная,PATH
но разумная альтернатива может быть/usr/bin/env awk
и/usr/bin/env bash
соответственно. Что бы это ни стоило, в моей системе Linux неправильно указано местоположение. Это/usr/bin/awk
не/bin/awk
На уровне приложения разработчик может сделать следующее:
Со стороны сервера:
Проверьте, правильно ли работает балансировщик нагрузки (если есть).
Превратите медленные тайм-ауты TCP в 503 Fast Immediate: если вы правильно работаете с балансировщиком нагрузки, он должен выбрать рабочий ресурс для обслуживания, и это лучше, чем зависать там с неожиданными сообщениями об ошибках.
Например: если вы используете сервер узлов, вы можете использовать toobusy из npm. Реализация что-то вроде:
Почему 503? Вот некоторые хорошие идеи для перегрузки: http://ferd.ca/queues-don-t-fix-overload.html
Мы можем также поработать на стороне клиента:
Попробуйте сгруппировать звонки в пакетном режиме, уменьшить трафик и общее количество запросов по ч / б клиенту и серверу.
Попробуйте построить кэш среднего уровня для обработки ненужных дубликатов запросов.
источник