Хтось уявляє, скільки підключень tcp-socket можливо на сучасному стандартному кореневому сервері? (Взагалі на кожному з’єднанні трафіку менше, але всі зв’язки повинні бути постійно активованими.)
EDIT: Ми будемо використовувати сервер Linux.
Хтось уявляє, скільки підключень tcp-socket можливо на сучасному стандартному кореневому сервері? (Взагалі на кожному з’єднанні трафіку менше, але всі зв’язки повинні бути постійно активованими.)
EDIT: Ми будемо використовувати сервер Linux.
Відповіді:
Я досягнув 1600 тис. Одночасних бездіяльних підключень до сокетів і одночасно 57 тис. Запитів / с на робочому столі Linux (16 Гб оперативної пам'яті, процесор I7 2600). Це однопотоковий http-сервер, написаний на мові C з epoll. Вихідний код розміщений на github , тут є блог .
Редагувати:
Я зробив 600 тис. Одночасних HTTP-з'єднань (клієнт і сервер) на обох тих самих комп'ютерах за допомогою JAVA / Clojure. детальна інформаційна публікація , обговорення HN: http://news.ycombinator.com/item?id=5127251
Вартість з'єднання (з epoll):
Кожен зареєстрований дескриптор файлу коштує приблизно 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 відкритих з'єднань" для Linux
А планувальник O (1) спочатку був створений, щоб добре оцінювати деякі невідповідні тести Java. Суть в тому, що це роздуття приносить користь усім нам.
Обмеження кількості відкритих сокетів можна налаштувати у файловій системі / proc
cat /proc/sys/fs/file-max
Макс. Для вхідних з'єднань в ОС визначається цілочисельними обмеженнями.
Сам Linux дозволяє мільярди відкритих сокетів.
Щоб використовувати сокети, вам потрібно прослуховування додатків, наприклад, веб-сервер, який використовуватиме певну кількість оперативної пам'яті на сокет.
Оперативна пам’ять і процесор вводять реальні межі. (сучасний 2017, думаю мільйони, а не мільярди)
1 мільйон можливо, непросто. Очікуйте використання X гігабайт оперативної пам'яті для управління 1 мільйоном сокетів.
Вихідні з'єднання TCP обмежені номерами портів ~ 65000 на IP. Ви можете мати кілька IP-адрес, але не необмежену кількість IP-адрес. Це обмеження для TCP, а не для Linux.
залежить від програми. якщо від кожного клієнта лише кілька пакетів, 100K дуже легко для Linux. Інженер з моєї команди провів тестування багато років тому, результат показує: коли після встановлення з'єднання від клієнта немає пакета, Linux epoll може спостерігати за читабельністю 400 тис. Фд при рівні використання процесора менше 50%.
Яка операційна система?
Для машин 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, і тепер доступно набагато більше.
Реально для програми, більше 4000-5000 відкритих розеток на одній машині стає недоцільним. Просто перевірка активності у всіх сокетах та управління ними починає ставати проблемою продуктивності - особливо в середовищі реального часу.