Каково теоретическое максимальное количество открытых TCP-соединений, которое может иметь современная коробка Linux
236
Предполагая бесконечную производительность от оборудования, может ли коробка Linux поддерживать> 65536 открытых TCP-соединений?
Я понимаю, что количество эфемерных портов (<65536) ограничивает количество соединений от одного локального IP до одного порта на одном удаленном IP.
Кортеж (локальный IP, локальный порт, удаленный IP, удаленный порт) - это то, что однозначно определяет TCP-соединение; Означает ли это, что более 65K соединений могут поддерживаться, если более одного из этих параметров свободны. например, соединения с одним номером порта на нескольких удаленных хостах с нескольких локальных IP-адресов.
Есть ли еще один 16-битный лимит в системе? Количество файловых дескрипторов возможно?
Один порт прослушивания может принимать более одного подключения одновременно.
Часто упоминается ограничение в 64 КБ, но оно относится к каждому клиенту на порт сервера и требует уточнения.
Каждый пакет TCP / IP имеет в основном четыре поля для адресации; Эти:
source_ip source_port destination_ip destination_port
< client > < server >
Внутри стека TCP эти четыре поля используются в качестве составного ключа для сопоставления пакетов с соединениями (например, файловыми дескрипторами).
Если у клиента много подключений к одному и тому же порту в одном и том же пункте назначения, три из этих полей будут одинаковыми - они source_portразличаются только для различения разных подключений. Порты представляют собой 16-разрядные числа, поэтому максимальное количество подключений, которое может иметь любой данный клиент к любому заданному порту хоста, составляет 64 КБ.
Тем не менее, несколько клиентов могут иметь до 64 КБ подключений к порту какого-либо сервера, и если на сервере несколько портов или один из них подключен к нескольким сетям, вы можете увеличить это число еще больше.
Таким образом, реальный предел - файловые дескрипторы. Каждому отдельному соединению сокетов присваивается дескриптор файла, поэтому ограничение - это действительно количество дескрипторов файлов, которые система сконфигурировала для разрешения и ресурсов для обработки. Максимальный предел обычно превышает 300 КБ, но его можно настроить, например, с помощью sysctl .
Реальные ограничения для обычных боксов составляют около 80 КБ, например для однопоточных серверов обмена сообщениями Jabber.
Теоретически вы можете иметь более 64K исходящих соединений, если вы (a) используете SO_REUSEADDR и (b) целевые IP-адреса назначения. Но ограничения памяти ядра, вероятно, остановят вас в первую очередь.
Даррон
4
Ограничение sysctl для всей системы, верно? Существует также предел, настраиваемый с помощью ulimit, который ограничивает максимальное количество файловых дескрипторов для процесса. Это по умолчанию намного меньше, чем 300K, обычно 1024.
pacoverflow
1
Небольшая техническая составляющая: клиентскому компьютеру также может быть назначено несколько IP-адресов от маршрутизатора. Все они могут быть назначены одному MAC, или эта машина может иметь несколько физических сетевых интерфейсов для дополнительных IP-адресов. ОП указал 1 IP, но для других важно не исключать больше IP-адресов.
Тодд
2
@ Прекрасно объяснил !! Очень полезно ... Хотел бы дать +100 голосов ... спасибо :-)
Том Тейлор
1
Имейте в виду, что tcp_fin_timeout по умолчанию блокирует один и тот же сокет (источник, цель, комбинация портов) еще на 60 секунд, что значительно сокращает количество фактически доступных соединений tcp между двумя системами, если соединения часто отключаются и повторно подключаются. Эту проблему можно свести к минимуму, разрешив повторно использовать (tcp_tw_reuse = 1) сокеты в состоянии TIME_WAIT (не всегда поддерживается) или нарушив стандарт TCP / IP, сократив это время ожидания до более низкого значения (обычно в любом случае работает нормально).
fgwaller
17
Если вы думаете о запуске сервера и пытаетесь решить, сколько соединений можно обслуживать с одного компьютера, вы можете прочитать о проблеме C10k и потенциальных проблемах, связанных с одновременным обслуживанием большого количества клиентов.
Несколько лет назад: Intel Atom D2700, 2 ГБ ОЗУ, 1,2 М одновременных подключений. Единственные проблемы, которые у меня были, были с коробками Windows в тестовой работе; они регулярно пошли вверх брюхом при попытке к отказу в коробку Intel Atom ...
Klaws
12
Если вы использовали raw socket ( SOCK_RAW) и повторно внедрили TCP в пользовательском пространстве, я думаю, что ответ в этом случае ограничен только числом (local address, source port, destination address, destination port)кортежей (~ 2 ^ 64 на локальный адрес).
Конечно, потребовалось бы много памяти, чтобы сохранить состояние всех этих соединений, и я думаю, что вам придется установить некоторые правила iptables, чтобы стек TCP ядра не расстраивался и / или не отвечал от вашего имени.
Если вы думаете о запуске сервера и пытаетесь решить, сколько соединений можно обслуживать с одного компьютера, вы можете прочитать о проблеме C10k и потенциальных проблемах, связанных с одновременным обслуживанием большого количества клиентов.
источник
Если вы использовали raw socket (
SOCK_RAW
) и повторно внедрили TCP в пользовательском пространстве, я думаю, что ответ в этом случае ограничен только числом(local address, source port, destination address, destination port)
кортежей (~ 2 ^ 64 на локальный адрес).Конечно, потребовалось бы много памяти, чтобы сохранить состояние всех этих соединений, и я думаю, что вам придется установить некоторые правила iptables, чтобы стек TCP ядра не расстраивался и / или не отвечал от вашего имени.
источник