Вкратце: вы сможете достичь порядка миллионов одновременных активных TCP-соединений и HTTP-запросов по расширению. Это говорит о максимальной производительности, которую вы можете ожидать от правильной платформы с правильной конфигурацией.
Сегодня меня беспокоило, будет ли IIS с ASP.NET поддерживать порядка 100 одновременных подключений (посмотрите мое обновление, ожидайте ~ 10 тыс. Ответов в секунду в более старых версиях ASP.Net Mono). Когда я увидел этот вопрос / ответы, я не смог удержаться от ответа сам, многие ответы на вопрос здесь совершенно неверны.
В лучшем случае
Ответ на этот вопрос должен касаться только простейшей конфигурации сервера, чтобы отделиться от бесчисленных переменных и конфигураций, возможных ниже по течению.
Итак, рассмотрим следующий сценарий моего ответа:
- Нет трафика в сеансах TCP, за исключением пакетов keep-alive (в противном случае вам, очевидно, потребуется соответствующая пропускная способность сети и другие ресурсы компьютера)
- Программное обеспечение, предназначенное для использования асинхронных сокетов и программирования, а не аппаратного потока на запрос из пула. (т.е. IIS, Node.js, Nginx ... веб-сервер [но не Apache] с прикладным программным обеспечением, разработанным для асинхронного программирования)
- Хорошая производительность / доллар CPU / Ram. Сегодня произвольно скажем i7 (4 ядра) с 8 ГБ ОЗУ.
- Хороший межсетевой экран / роутер под стать.
- Нет виртуального лимита / регулятора - т.е. Linux somaxconn, IIS web.config ...
- Нет зависимости от другого более медленного оборудования - нет чтения с жесткого диска, потому что это будет наименьший общий знаменатель и узкое место, а не сетевой ввод-вывод.
Подробный ответ
Синхронные схемы с привязкой к потоку, как правило, хуже всего работают по сравнению с реализациями асинхронного ввода-вывода.
WhatsApp может обрабатывать миллион С трафиком на одной машине с ОС Unix - https://web.archive.org/web/20120108184257/https://blog.whatsapp.com/index.php/2012/01/1-миллион-is-so-2011/.
И, наконец, этот, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html, переходит в много деталей, исследуя, как можно достичь даже 10 миллионов. Серверы часто имеют аппаратные механизмы разгрузки TCP, ASIC, предназначенные для этой конкретной роли более эффективно, чем ЦП общего назначения.
Хороший выбор дизайна программного обеспечения
Дизайн асинхронного ввода-вывода будет отличаться для разных операционных систем и платформ программирования. Node.js был разработан с учетом асинхронности. По крайней мере, вы должны использовать Promises, а когда появится ECMAScript 7, _1 _ / _ 2_. C # /. Net уже имеет полную поддержку асинхронного режима, например node.js. Независимо от ОС и платформы, следует ожидать, что асинхронный режим будет работать очень хорошо. И какой бы язык вы ни выбрали, ищите ключевое слово asynchronous, большинство современных языков будут иметь некоторую поддержку, даже если это какое-то дополнение.
На веб-ферму?
Каким бы ни был предел для вашей конкретной ситуации, да, веб-ферма - хорошее решение для масштабирования. Для этого существует множество архитектур. Один из них использует балансировщик нагрузки (хостинг-провайдеры могут предлагать их, но даже у них есть ограничение вместе с потолком пропускной способности), но я не поддерживаю этот вариант. Для одностраничных приложений с длительными соединениями я предпочитаю вместо этого иметь открытый список серверов, которые клиентское приложение будет выбирать случайным образом при запуске и повторно использовать в течение всего жизненного цикла приложения. Это устраняет единую точку отказа (балансировщик нагрузки) и обеспечивает масштабирование через несколько центров обработки данных и, следовательно, гораздо большую пропускную способность.
Развенчание мифа - 64 КБ портов
Чтобы ответить на вопрос, касающийся 64 000, это заблуждение. Сервер может подключаться к более чем 65535 клиентам. См. https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284
Кстати, Http.sys в Windows позволяет нескольким приложениям использовать один и тот же порт сервера в соответствии со схемой URL-адреса HTTP. Каждый из них регистрирует отдельную привязку к домену, но в конечном итоге существует одно серверное приложение, проксирующее запросы к правильным приложениям.
Обновление 2019-05-30
Вот актуальное сравнение самых быстрых библиотек HTTP - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Дата тестирования: 2018-06-06
- Используемое оборудование: Dell R440 Xeon Gold + 10 GbE
- Лидер имеет ~ 7 миллионов ответов в открытом виде в секунду (ответы, а не соединения)
- Второй Fasthttp для golang рекламирует 1,5 миллиона одновременных подключений - см. https://github.com/valyala/fasthttp
- Ведущими языками являются Rust, Go, C ++, Java, C и даже C #, получивший 11-е место (6,9 Мбайт в секунду). Еще ниже идут Scala и Clojure. Python занимает 29-е место со скоростью 2,7 млн в секунду.
- В конце списка отмечу laravel и cakephp, rails, aspnet-mono-ngx, symfony, zend. Все ниже 10к в секунду. Обратите внимание, что большинство этих фреймворков построены для динамических страниц и довольно старые, могут быть более новые варианты, которые находятся выше в списке.
- Помните, что это открытый текст HTTP, а не для специализации Websocket: многие люди, приходящие сюда, вероятно, будут заинтересованы в одновременных подключениях для websocket.
person
Todd
schedule
28.03.2014