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


77

Хтось уявляє, скільки підключень tcp-socket можливо на сучасному стандартному кореневому сервері? (Взагалі на кожному з’єднанні трафіку менше, але всі зв’язки повинні бути постійно активованими.)

EDIT: Ми будемо використовувати сервер Linux.


1
Для Windows см це питання [Що це максимальна кількість одночасних TCP / IP з'єднання для Windows?] [1] [1]: stackoverflow.com/questions/413110 / ...
lsalamon

Відповіді:


86

Я досягнув 1600 тис. Одночасних бездіяльних підключень до сокетів і одночасно 57 тис. Запитів / с на робочому столі Linux (16 Гб оперативної пам'яті, процесор I7 2600). Це однопотоковий http-сервер, написаний на мові C з epoll. Вихідний код розміщений на github , тут є блог .

Редагувати:

Я зробив 600 тис. Одночасних HTTP-з'єднань (клієнт і сервер) на обох тих самих комп'ютерах за допомогою JAVA / Clojure. детальна інформаційна публікація , обговорення HN: http://news.ycombinator.com/item?id=5127251

Вартість з'єднання (з epoll):

  • додатку потрібно трохи оперативної пам'яті на кожне з'єднання
  • Буфер TCP 2 * 4k ~ 10k або більше
  • epoll потрібно трохи пам'яті для дескриптора файлу, від epoll (7)

Кожен зареєстрований дескриптор файлу коштує приблизно 90 байт для 32-розрядного ядра і приблизно 160 байт для 64-розрядного ядра.


2
ха-ха-ха ... 10 мільйонів підключень highscalability.com/blog/2013/5/13/…
Лотар

5
@Bangash Мій коментар не має абсолютно нічого спільного з Ерлангом, або насправді щось інше, крім того факту, що Leef розмістив коментар, що розповідає про 1 мільйон підключень сокетів на одному ящику, але ця відповідь говорить про 1,6 мільйона - отже, це здавалося трохи безглуздий коментар. Ерланг - велика держава CouchDB. Однак я не бачу, як ваш коментар має тут якесь значення.
Wallacer

23

Це залежить не тільки від операційної системи, про яку йде мова, але й від конфігурації, можливо, конфігурації в реальному часі.

Для Linux:

cat /proc/sys/fs/file-max

покаже поточну максимальну кількість дескрипторів файлів, дозволених для одночасного відкриття. Перевірте http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html


1
Щойно перевірив мій ноутбук ubuntu (13.04) ... 386491. Я сумніваюся, що це буде перша межа, на яку я наткнувся б.
Gerry

На моєму нестабільному Debian (ядро 4.19.0-1-amd64): 18446744073709551615.;)
Пер Лундберг

8

10 000? 70 000? це все :)

FreeBSD - це, мабуть, той сервер, який вам потрібен. Ось невеликий допис у блозі про налаштування його на обробку 100 000 підключень; у нього вже деякий час є кілька цікавих функцій, таких як сокети з нульовою копією, а також kqueue, який виступає як механізм порту завершення.

Solaris може обробити 100 000 підключень ще в минулому столітті !. Вони кажуть, що Linux буде краще

Найкращий опис, з яким я стикався, - це презентація / стаття про написання масштабованого веб-сервера. Він не боїться сказати це так, як є :)

Те саме для програмного забезпечення: кретини на прикладному рівні викликали великі нововведення на рівні ОС. Оскільки Lotus Notes тримає одне TCP-з'єднання на кожного клієнта відкритим, IBM внесла основні оптимізації для випадку "одного процесу, 100 000 відкритих з'єднань" для Linux

А планувальник O (1) спочатку був створений, щоб добре оцінювати деякі невідповідні тести Java. Суть в тому, що це роздуття приносить користь усім нам.


2
Я зупинився на 70 000, бо це було більше, ніж вимагав мій клієнт; отже, тест був пройдений. Зі змінами в способі обчислення меж пулу не-сторінок, я вважаю, що машина Windows Server 2008 не матиме проблем зі 100 000 підключень.
Лен Холгейт

Чи можете ви поділитися посиланням на цитовану презентацію?
Брайан Клайн

1
@BrianCline Вам, напевно, це більше не потрібно, але я теж хотів це, і думаю, що знайшов: slideshare.net/Arbow/scalable-networking (слайд 33)
Пійін,

6

Обмеження кількості відкритих сокетів можна налаштувати у файловій системі / proc

cat /proc/sys/fs/file-max

Макс. Для вхідних з'єднань в ОС визначається цілочисельними обмеженнями.

Сам Linux дозволяє мільярди відкритих сокетів.

Щоб використовувати сокети, вам потрібно прослуховування додатків, наприклад, веб-сервер, який використовуватиме певну кількість оперативної пам'яті на сокет.

Оперативна пам’ять і процесор вводять реальні межі. (сучасний 2017, думаю мільйони, а не мільярди)

1 мільйон можливо, непросто. Очікуйте використання X гігабайт оперативної пам'яті для управління 1 мільйоном сокетів.

Вихідні з'єднання TCP обмежені номерами портів ~ 65000 на IP. Ви можете мати кілька IP-адрес, але не необмежену кількість IP-адрес. Це обмеження для TCP, а не для Linux.


5

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

Я гадаю, що ви повинні мати змогу досягти 100 тис. З'єднань на розумній машині.


3

залежить від програми. якщо від кожного клієнта лише кілька пакетів, 100K дуже легко для Linux. Інженер з моєї команди провів тестування багато років тому, результат показує: коли після встановлення з'єднання від клієнта немає пакета, Linux epoll може спостерігати за читабельністю 400 тис. Фд при рівні використання процесора менше 50%.


1

Яка операційна система?

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

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

Окрім цього, ну, вам потрібно буде профайлювати, але мені вдалося отримати більше 70 000 одночасних з'єднань на скромно визначеному (760 Мб пам'яті) сервері; докладніше див. тут http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html .

Очевидно, що якщо ви використовуєте менш ефективну архітектуру, таку як "потік на з'єднання" або "виберіть", тоді слід очікувати досягнення менш вражаючих показників; але, IMHO, просто немає причин вибирати такі архітектури для серверів сокетів Windows.

Редагувати: дивіться тутhttp://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx ; спосіб обчислення кількості незастосованого пулу змінився у Vista та Server 2008, і тепер доступно набагато більше.


Хм Цікаво. Завдяки 128 Мб пулу без виклику на W2K, з IOCP, я міг би підтримувати 4000 активних сокетів (наприклад, потокова передача одночасно). Коли ці розетки простоюють, я міг би підтримувати близько 16 000. Я припускаю, що ваші сокети простоюють та / або цей нульовий байт для читання допоміг.

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

Я думав, що ви можете отримати лише 65 тисяч підключень у Windows - вам потрібно змінити налаштування реєстру tcpnumconnections. (а на XP вони обмежують це додатково в tcpip.sys, про це багато говорили на сайтах bittorrent)
gbjbaanb

2
ви заплуталися, я думаю. Обмеження в tcpip.sys призначене для напіввідкритих з'єднань і діє як обмеження кількості одночасних з'єднань, яке ви можете виконувати в будь-який час. Запис реєстру MaxUserPort обмежує кількість клієнтських портів, тому максимальне значення, яке ви можете там встановити, буде обмежувати кількість вихідних з'єднань, які ви можете встановити, буде обмежено цим. Кількість можливих підключень INBOUND не обмежена.
Лен Холгейт

-12

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


3
Надто широке твердження. Насправді все залежить від того, що ви робите на рівні програми; це буде вашим вузьким місцем у виконанні майже у всіх випадках.
DarkSquid

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