Скільки підключень сокет може обробити веб-сервер?


114

Скажіть, якщо я маю отримати спільний, віртуальний або виділений хостинг, я десь читав, що сервер / машина може обробляти лише 64 000 TCP-з'єднань одночасно, це правда? Скільки може працювати будь-який тип хостингу незалежно від пропускної здатності? Я припускаю, що HTTP працює над TCP.

Чи означає це, що лише 64 000 користувачів можуть підключитися до веб-сайту, і якщо я хотів би більше обслуговувати, мені доведеться перейти на веб-ферму?


2
Вибачаючись у відповідь, я прорвав цю нитку, як смерч. Просто було занадто багато невірних відповідей на мій уподобання, і все ще немає прямої відповіді. Я багато використовую stackoverflow і знаходжу багато якісних відповідей. Я сподіваюся, що інші зможуть знайти цю тему і знайти корисну усвідомлену відповідь.
Тодд

Привіт, Девіде, ти знайшов правильну відповідь на це питання?
Блюдо

64000 TCP-з'єднань через один IP-сервер. Ви можете оновити свою серверну мережу до масштабу та підтримки понад 64000.
Ейрі

Відповіді:


108

Коротше кажучи: ви повинні мати можливість досягти мільйонів одночасних активних TCP-з'єднань та шляхом розширення HTTP-запитів. Це говорить вам про максимальну ефективність, яку ви можете очікувати при правильній платформі з правильною конфігурацією.

Сьогодні я переживав, чи підтримуватиме IIS з ASP.NET порядком 100 одночасних з'єднань (дивіться на моє оновлення, очікуйте ~ 10k відповідей в секунду на старих версіях ASP.Net Mono). Коли я побачив це питання / відповіді, я не втримався відповісти на себе, багато відповідей на питання тут абсолютно невірні.

Кращий випадок

Відповідь на це питання повинна стосуватися лише найпростішої конфігурації сервера, щоб від'єднатись від незліченних змінних та конфігурацій, можливих нижче за течією.

Тому розгляньте такий варіант моєї відповіді:

  1. Немає трафіку на сесіях TCP, за винятком пакетів, які зберігаються в живих (інакше вам, очевидно, знадобиться відповідна кількість пропускної здатності мережі та інших комп'ютерних ресурсів)
  2. Програмне забезпечення, призначене для використання асинхронних розеток та програмування, а не апаратних потоків за запитом з пулу. (тобто. IIS, Node.js, Nginx ... веб-сервер [але не Apache] з прикладним програмним забезпеченням, розробленим async)
  3. Хороша продуктивність / долар CPU / Ram. Сьогодні, умовно, скажімо, i7 (4 core) з 8 Гб оперативної пам’яті.
  4. Хороший брандмауер / маршрутизатор.
  5. Ніякого віртуального ліміту / губернатора - тобто. Linux somaxconn, IIS web.config ...
  6. Ніякої залежності від інших повільніших апаратних засобів - не зчитування з жорсткого диска, оскільки це був би найменший загальний знаменник і вузьке місце, а не мережевий IO.

Детальний відповідь

Синхронні конструкції, пов'язані з потоками, як правило, є найгіршими в порівнянні з реалізаціями асинхронного вводу-виводу.

WhatsApp отримає мільйон трафіку на одній ОС з ароматизованою системою Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .

І нарешті, цей, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , детально описується. , досліджуючи, як можна досягти навіть 10 мільйонів. Сервери часто мають апаратні двигуни розвантаження TCP, ASIC розроблені для цієї конкретної ролі ефективніше, ніж процесор загального призначення.

Гарний вибір програмного забезпечення

Асинхронний дизайн IO відрізнятиметься від операційних систем та платформ програмування. Node.js був розроблений з урахуванням асинхронності . Ви повинні використовувати Обіцянки принаймні, і коли ECMAScript 7 прийде разом, async/ await. C # /. Net вже має повну асинхронну підтримку, як node.js. Незалежно від ОС та платформи, слід очікувати, що асинхронність буде дуже ефективною. І яку б мову ви не вибрали, шукайте ключове слово "асинхронний", більшість сучасних мов матимуть певну підтримку, навіть якщо це якесь доповнення.

Для WebFarm?

Незалежно від межі для вашої конкретної ситуації, так, веб-ферма - це хороше рішення для масштабування. Для цього є багато архітектур. Один з них використовує балансир завантаження (хостинг-провайдери можуть запропонувати їх, але навіть у них є обмеження, поряд із стелею пропускної здатності), але я не підтримую цей варіант. Для програм на одній сторінці із тривалими зв’язками я вважаю за краще мати відкритий список серверів, які клієнтська програма обиратиме випадковим чином при запуску та повторному використанні протягом життя програми. Це видаляє єдину точку відмови (балансир навантаження) і дозволяє масштабувати через декілька центрів обробки даних і, отже, набагато більше пропускної здатності.

Розбиття міфу - 64K порти

Для вирішення питання щодо "64 000" це помилкова думка. Сервер може підключитися до багатьох більш ніж 65535 клієнтів. Дивіться /networkengineering/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.5M одночасних з'єднань - див. Https://github.com/valyala/fasthttp
  • Провідні мови - це Rust, Go, C ++, Java, C і навіть C # з рангом 11 (6,9 М в секунду). Скала і Клуджур проходять далі вниз. Python займає 29-е місце із швидкістю 2,7 М в секунду.
  • Внизу списку зазначу laravel і cakephp, рейки, aspnet-mono-ngx, symfony, zend. Усі нижче 10 к в секунду. Зауважте, більшість цих фреймворків створені для динамічних сторінок і є досить старими, можливо, існують новіші варіанти, які відображаються вище в списку.
  • Пам'ятайте, що це протокол HTTP, не призначений для спеціальності Websocket: багато людей, які приїдуть сюди, швидше за все, будуть зацікавлені в одночасному підключенні для веб-сокета.

2
Дякуємо, що включили посилання на людей, які розповідають про те, як вони це роблять.
Рік Сміт

Що робити, якщо єдиний сервер, до якого підключений клієнт, знизиться? А що робити, якщо всі ваші SPA випадково підключились до одного сервера і перевантажили його? Ідея використання навантажувачів - це не просто використання 1, якого ви можете використовувати скільки завгодно
pyros2097

3
Клієнти вибрали б випадковий вибір сервера. Шанси всіх випадкових підключень до одного практично неможливі. Хоча можна було б продовжити кількість клієнтів і сервер міг попросити клієнта перейти на інший сервер, якщо він занадто переповнений.
Тодд

1
Що стосується: обмеження на 64K - те, що ви говорите, є правдою, але це серверне додаток, як правило, для проксі-запитів через деякі сервіси, що входять до складу резервного сервісу, і в цьому випадку "сервер" тепер стає "клієнтом" і може мати турбуватися про виснаження ефемерних портів (наприклад: nginx.com/blog/overcoming-ephemeral-port-exhavior-nginx-plus ). Я впевнений, що ви це знаєте, але згадуючи про це для інших (:
jwd

@jwd хороша точка, контекстуальна для nginx у веб-додатку, але для базового веб-сайту подібне проксі не потребуватиметься. Те саме можна сказати і про підключення до бази даних через TCP веб-додатком. Теоретично це вирішується за допомогою всіх адрес у діапазоні 127. *. *. *, Але на практиці я не знаю, чи є це доступний варіант.
Тодд

54

Це питання є досить складним. Немає реального обмеження програмного забезпечення щодо кількості активних підключень, які може мати машина, хоча деякі ОС більш обмежені, ніж інші. Проблема стає однією з ресурсів. Наприклад, скажімо, що одна машина хоче підтримувати 64 000 одночасних з'єднань. Якщо сервер використовує 1 Мб оперативної пам’яті за з'єднання, йому знадобиться 64 ГБ оперативної пам’яті. Якщо кожному клієнту потрібно прочитати файл, завантаження доступу до диска або масиву зберігання стає значно більшим, ніж ті пристрої, які можуть впоратися. Якщо серверу необхідно розщедрити один процес на з'єднання, ОС буде витрачати більшість свого часового контексту на перемикання або голодування процесів протягом часу процесора.

Проблема C10K сторінка має дуже гарне обговорення цього питання.


3
Трохи змішаної відповіді. ОП, схоже, посилається на найкращий сценарій випадку, і включає, як було б корисно, а не знайти найгірший випадок, а потім посилається на статтю, яка може мати рішення. Відзначити вузьке місце диска корисно. Використовуючи асинхронний IO, можна досягти дуже великої кількості одночасних клієнтів.
Тодд

Як можна сказати, що реального обмеження програмного забезпечення немає, оскільки розмір порту сам по собі становить 16 біт, що робить максимум відсутніми портами в будь-який момент на максимумі 65,5 К. Я вважаю, що ваша відповідь неправильна.
आनंद

Ваша машина може мати більше 1 IP, тому доступно більше 2 ^ 16 портів.
Арман Ордухані

8

Щоб додати два мої центи до розмови, процес може одночасно відкрити кількість підключених сокетів, рівних цьому номеру (у системних системах Linux) / proc / sys / net / core / somaxconn

cat / proc / sys / net / core / somaxconn

Це число можна змінювати на ходу (звичайно, тільки користувач root)

echo 1024> / proc / sys / net / core / somaxconn

Але повністю залежить від серверного процесу, апаратного забезпечення машини та мережі, реальної кількості розеток, які можна підключити до виходу з ладу системи


1
Хоча можливо це стосується Linux, це стосується віртуального ліміту, а не орієнтира можливостей. Ця відповідь трохи специфічна для мого вподобання, і не містить жодної кількості або вказівки на кількість одночасних з'єднань. Незважаючи на ваші зусилля, це не дуже корисно. Можливо, ви могли б самостійно відповісти на запитання: "Чому я не можу подати більше X одночасних підключень TCP в Linux"
Тодд,

2
Наскільки я можу сказати, це неправильно . somaxconn - це максимальна кількість з'єднань у черзі у відкритому сокеті (тобто це максимальне значення параметра відставання listen(int socket, int backlog). Це не пов'язано з кількістю сокетів, які може відкрити процес.
Timmmm

8

Схоже, що відповідь становить щонайменше 12 мільйонів, якщо у вас є надійний сервер, ваша серверна програма оптимізована для цього, у вас достатньо клієнтів. Якщо ви протестуєте від одного клієнта до одного сервера, кількість номерів портів на клієнті буде одним із очевидних обмежень ресурсів (Кожне з'єднання TCP визначається унікальною комбінацією IP-номера та номера порту у джерелі та пункт призначення).

(Вам потрібно запустити декілька клієнтів, оскільки в іншому випадку ви спочатку встановите ліміт 64K для номерів портів)

Якщо мова йде про це, то це класичний приклад дотепності, що "різниця між теорією та практикою набагато більша на практиці, ніж в теорії" - на практиці досягнення більших чисел здається циклом "a". запропонувати конкретні зміни конфігурації / архітектури / коду, b. тестуйте його, поки не досягнете межі, c. Я закінчив? Якщо ні, то d. опрацювати, що було обмежуючим фактором, e. повернутися до кроку a (промити та повторити).

Ось приклад з 2 мільйонами TCP-з'єднань на полегшеній коробці (128 ГБ оперативної пам’яті та 40 ядер), на якій працює Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections - вони закінчилися потрібно 50 або більше досить значних серверів лише для того, щоб забезпечити завантаження клієнта (їхні початкові менші клієнти заздалегідь відраховуються, наприклад, "maxed наш 4core / 15gb box @ 450k клієнтів").

Ось ще одна довідка про поїздку цього разу на 10 мільйонів: http://goroutines.com/10m .

Здається, що на базі Java і 12 мільйонів підключень: https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/


Чудові нові посилання, з правильним розумінням питання. Мені подобається загальна порада щодо перешкод удару -> виправити бар'єр. Кожна ситуація має різну специфіку, але принаймні тут є вказівка ​​на те, що економічно / практично досяжно. Не варто обіцяти клієнту 100 мільйонів на сервері найближчим часом.
Тодд

5

Зауважте, що HTTP зазвичай не підтримує TCP-з'єднання відкритими довше, ніж потрібно для передачі сторінки клієнту; і користувачеві зазвичай потрібно набагато більше часу, щоб прочитати веб-сторінку, ніж потрібно для завантаження сторінки ... поки користувач переглядає сторінку, він зовсім не додає навантаження на сервер.

Таким чином, кількість людей, які можуть одночасно переглядати ваш веб-сайт, значно більша, ніж кількість підключень TCP, які він може одночасно обслуговувати.


12
Це зовсім не відповідає на питання. Незалежно від точності, що ви сказали, все ще буде кількість паралельних TCP-з'єднань у даний момент часу, який максимум? У цьому суть питання.
Тодд

3
Якщо у вас є щось, що варто зробити свій внесок, Тодд, безумовно, продовжуйте це робити.
Джеремі Фріснер

8
У мене вже була відповідь 28 березня, ви, мабуть, її пропустили. У сучасному світі програм для одних сторінок із довгим опитуванням та підключенням до веб-сокетів HTTP не завжди залишається недоступним. Але навіть якщо він короткий, все одно існує максимальна кількість одночасних з'єднань. Спроба пояснити це питання не є низьким ІМО. Цю відповідь краще розмістити як коментар до питання, це, безумовно, корисно, але питання стосується "сокетних з'єднань", а не "людей". Питання про співвідношення (користувачі: активні з'єднання) має бути окремим питанням за бажанням.
Тодд

1
Тримайте Alive на HTTP-з'єднаннях TCP існує і запитується браузерами з останнього тисячоліття - це залежить від сервера, якщо він дозволяє залишатись живим і яким буде період очікування в режимі очікування. Дозвіл Keep Alive зменшує затримку групи запитів (наприклад, html-сторінку та пов’язані з нею ресурси), але збільшує використання ресурсів на сервері.
iheggie

1

у випадку протоколу IPv4 сервер з однією IP-адресою, який прослуховує лише один порт, може обробляти 2 ^ 32 IP-адреси x 2 ^ 16 портів, так що 2 ^ 48 унікальних сокетів. Якщо ви говорите про сервер як про фізичну машину, і ви можете використовувати всі 2 ^ 16 порти, то для однієї IP-адреси може бути максимум 2 ^ 48 x 2 ^ 16 = 2 ^ 64 унікальних сокетів TCP / IP. Зверніть увагу, що деякі порти зарезервовані для ОС, тому це число буде нижчим. Підсумовуючи:

1 IP та 1 порт -> 2 ^ 48 розеток

1 IP та всі порти -> 2 ^ 64 розетки

всі унікальні розетки IPv4 у Всесвіті -> 2 ^ 96 розеток


0

Тут проходять дві різні дискусії: одна - скільки людей може підключитися до вашого сервера. На це відповіли адекватно інші, тому я не буду в цьому займатись.

Інше - скільки портів може прослухати ваш сервер? Я вважаю, що звідси походить номер 64K. Насправді протокол TCP використовує 16-бітний ідентифікатор для порту, що перекладається на 65536 (трохи більше 64 Кб). Це означає, що ви можете мати стільки різних "слухачів" на сервері за IP-адресою.


для вашої користі я додав додатковий розділ до своєї відповіді щодо вашого помилкового уявлення. Також це питання стосується "сокетних з'єднань", а не "людей", що є важливою відмінністю в контексті цього питання.
Тодд

Якщо ми говоримо про одну єдину серверну машину і один єдиний маршрутизатор, я вважаю, що ця відповідь є правильною. Але @Todd займає ферму серверних машин, яку користувач може підключити до будь-якого з них випадковим чином через балансир навантаження.
Amr

@amr це неправильно. Моя відповідь - про одну машину. "Вебфарм?" У розділі є контраст та поради щодо виходу за межі, і робиться висновок, що балансири навантажень не потрібні з хорошою архітектурою. Ви просто ще не прочитали детально моєї відповіді.
Тодд

0

Я думаю, що кількість паралельних підключень сокет, якими може користуватися один веб-сервер, багато в чому залежить від кількості ресурсів, які споживає кожне з'єднання, і кількості загального ресурсу, доступного на сервері, що забороняє будь-який інший ресурс веб-сервера, що обмежує конфігурацію.

Для ілюстрації, якщо кожне з'єднання з сокетом споживало 1 Мб ресурсу сервера, а сервер має (теоретично) 16 ГБ оперативної пам’яті, це означає, що він міг би обробляти (16 ГБ / 1 МБ) одночасні з'єднання. Я думаю, що це так просто, як це ... дійсно!

Тому незалежно від того, як веб-сервер обробляє з'єднання, кожне з'єднання в кінцевому рахунку буде споживати певний ресурс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.