Каково теоретическое максимальное количество открытых TCP-соединений, которое может иметь современная коробка Linux

236

Предполагая бесконечную производительность от оборудования, может ли коробка Linux поддерживать> 65536 открытых TCP-соединений?

Я понимаю, что количество эфемерных портов (<65536) ограничивает количество соединений от одного локального IP до одного порта на одном удаленном IP.

Кортеж (локальный IP, локальный порт, удаленный IP, удаленный порт) - это то, что однозначно определяет TCP-соединение; Означает ли это, что более 65K соединений могут поддерживаться, если более одного из этих параметров свободны. например, соединения с одним номером порта на нескольких удаленных хостах с нескольких локальных IP-адресов.

Есть ли еще один 16-битный лимит в системе? Количество файловых дескрипторов возможно?

fadedbee
источник

Ответы:

350

Один порт прослушивания может принимать более одного подключения одновременно.

Часто упоминается ограничение в 64 КБ, но оно относится к каждому клиенту на порт сервера и требует уточнения.

Каждый пакет TCP / IP имеет в основном четыре поля для адресации; Эти:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Внутри стека TCP эти четыре поля используются в качестве составного ключа для сопоставления пакетов с соединениями (например, файловыми дескрипторами).

Если у клиента много подключений к одному и тому же порту в одном и том же пункте назначения, три из этих полей будут одинаковыми - они source_portразличаются только для различения разных подключений. Порты представляют собой 16-разрядные числа, поэтому максимальное количество подключений, которое может иметь любой данный клиент к любому заданному порту хоста, составляет 64 КБ.

Тем не менее, несколько клиентов могут иметь до 64 КБ подключений к порту какого-либо сервера, и если на сервере несколько портов или один из них подключен к нескольким сетям, вы можете увеличить это число еще больше.

Таким образом, реальный предел - файловые дескрипторы. Каждому отдельному соединению сокетов присваивается дескриптор файла, поэтому ограничение - это действительно количество дескрипторов файлов, которые система сконфигурировала для разрешения и ресурсов для обработки. Максимальный предел обычно превышает 300 КБ, но его можно настроить, например, с помощью sysctl .

Реальные ограничения для обычных боксов составляют около 80 КБ, например для однопоточных серверов обмена сообщениями Jabber.

Будет
источник
3
Теоретически вы можете иметь более 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 и потенциальных проблемах, связанных с одновременным обслуживанием большого количества клиентов.

Spaceghost
источник
14
C10k 10 лет и больше не весело. [Прочитайте это], чтобы увидеть, как C1024K может быть решена.
Чандраншу
@Chandranshu - Вы имели в виду metabrew.com/article/… ?
Микко Ранталайнен
1
@MikkoRantalainen - да. Я думаю, что сейчас есть лучшие тесты. Ребята из Феникса уже подтолкнули его к 2 миллионам одновременных подключений.
Chandranshu
3
@Chandranshu - демонстрация Dell с 12M-соединениями: mrotaru.wordpress.com/2013/06/20/…
Микко Ранталайнен,
1
Несколько лет назад: 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 ядра не расстраивался и / или не отвечал от вашего имени.

sbirch
источник