9 ответов:
Google вокруг для проблемы "C10K". Это в основном Обсуждение и технологии вокруг управления 10 000 или более одновременных соединений.
Я подозреваю, что это число было выбрано потому, что это сложно, но теоретически возможно.
Я достиг 1600k параллельных подключений к сокету и в то же время 57k req/s на рабочем столе Linux (16G RAM, i7 2600 CPU). Это один поток http-сервер, написанный на C с epoll. Исходный код находится на github, a здесь Блог.
Edit:
Я сделал 600k параллельных HTTP-соединений (клиент и сервер) на одном и том же компьютере с JAVA/Clojure . подробная информация post, HN обсуждение: http://news.ycombinator.com/item?id=5127251
стоимость подключения(с epoll с):
- приложение нуждается в некоторой оперативной памяти на соединение
- TCP буфер 2 * 4k ~ 10k, или больше
- epoll нужна некоторая память для дескриптора файла, от epoll (7)
каждый зарегистрированный файловый дескриптор стоит примерно 90 байты на 32-разрядном ядре и примерно 160 байт на 64-разрядном ядре.
Это зависит не только от операционной системы, но также о конфигурации, потенциально в реальном времени.
Для Linux:
cat /proc/sys/fs/file-maxпокажет текущее максимальное количество файловых дескрипторов, которые могут быть открыты одновременно. Проверьте http://www.cs.uwaterloo.ca / ~brecht/servers/openfiles.html
10,000? 70,000? это все :)
FreeBSD, вероятно, сервер, который вы хотите, вот маленький пост в блоге о настройке его для обработки 100 000 соединений, у него были некоторые интересные функции, такие как сокеты с нулевой копией в течение некоторого времени, а также kqueue, чтобы действовать как механизм порта завершения.
Solaris может обрабатывать 100 000 соединений еще в прошлом веке!. Они говорят, что Linux будет лучше
лучшее описание у меня есть столкнитесь с этой презентацией / документом о написании масштабируемого веб-сервера. Он не боится сказать это как есть:)
то же самое для программного обеспечения: кретины на прикладной уровень заставил большой инновации на уровне ОС. Потому что Lotus Notes сохраняет одно TCP-соединение на каждого открытого клиента IBM внесла основной вклад оптимизация для "одного процесса, 100.000 открытых соединений " case to Linux
и планировщик O(1) был первоначально создан для некоторые неактуально стандарт Java. Донизу заключается в том, что это выгодно наворотов все нам.
в Linux вы должны смотреть на использование epoll для асинхронного ввода-вывода. возможно, также стоит точно настроить буферы сокетов, чтобы не тратить слишком много места ядра на соединение.
Я бы предположил, что вы должны быть в состоянии достичь 100k соединений на разумной машине.
зависит от приложения. если есть только несколько пакетов от каждого клиента, 100K очень легко для linux. Инженер моей команды сделал тест несколько лет назад, результат показывает : когда нет пакета от клиента после установления соединения, linux epoll может смотреть 400k fd для чтения на уровне использования процессора под 50%.
ограничение на количество открытых сокетов настраивается в файловой системе /proc
cat /proc/sys/fs/file-maxмакс входящий соединения в ОС определяются целочисленными ограничениями.
сам Linux позволяет миллиарды открытых сокетов.
чтобы использовать сокеты, вам нужно прослушивать приложение, например веб-сервер, и это будет использовать определенное количество оперативной памяти на сокет.
оперативной памяти и процессора будет ввести реальные ограничения. (современная 2017, думаю миллионы не миллиарды)
1 миллион возможно, не легко. Ожидайте использовать X гигабайт оперативной памяти для управления 1 миллионом сокетов.
исходящий TCP-соединения ограничены номерами портов ~65000 на IP. Вы можете иметь несколько IP-адресов, но не неограниченные IP-адреса. Это ограничение в TCP не Linux.
какая операционная система?
для машин windows, Если вы пишете сервер для масштабирования и, следовательно, используете порты завершения ввода-вывода и асинхронный ввод-вывод, то основным ограничением является количество невыгружаемого пула, которое вы используете для каждого активного соединения. Это приводит непосредственно к ограничению, основанному на объеме памяти, установленной на вашем компьютере (нестраничный пул-это конечный фиксированный размер, основанный на общей установленной памяти).
для соединения, которые не видят большого трафика, который вы можете уменьшить, делают их более эффективными, публикуя "нулевые байтовые чтения", которые не используют невыгружаемый пул и не влияют на ограничение заблокированных страниц (еще один потенциально ограниченный ресурс, который может помешать вам иметь много открытых соединений сокетов).
кроме того, вам нужно будет профилировать, но мне удалось получить более 70 000 одновременных подключений на скромно указанном сервере (760 МБ памяти); см. здесь http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html для более подробной информации.
очевидно, что если вы используете менее эффективную архитектуру, такую как "поток на соединение" или "выбор", то вы должны ожидать достижения менее впечатляющих показателей; но, IMHO, просто нет причин выбирать такие архитектуры для серверов сокетов windows.
Edit: см. здесь http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx; способ, которым вычисляется объем невыгружаемого пула, изменился в Vista и Server 2008, и теперь он гораздо более доступен.
реалистично для применения, больше после этого 4000-5000 открытых гнезд на одиночной машине будут непрактичными. Просто проверка активности на всех сокетах и управление ими начинает становиться проблемой производительности - особенно в средах реального времени.
Comments