Я розробляю систему для обробки 10000 TCP-з'єднань в секунду, які проблеми у мене виникнуть?


18

У мене відносно нова 8-ядерна коробка під управлінням CentOS. Я хотів би розробити сервер статистики, який використовує TCP. Це дуже просто, він приймає TCP-з'єднання, збільшує лічильник і закриває з'єднання. Улов полягає в тому, що для цього потрібно зробити щонайменше 10 к запитів на секунду. Я підозрюю, що процесор / пам'ять не буде проблемою, але мене більше турбують штучні обмеження (наприклад, напіввідкриті з'єднання), які, можливо, знадобляться на моєму сервері, щоб забезпечити такий об'єм. Отже, чи можливо це? Про які налаштування мені слід знати? Чи мій NIC не зможе це впоратися?


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

1
+1 для повідомлення про свої кінцеві результати тут :)
agsamek

Відповіді:


17

Це широко відоме як проблема c10k . На цій сторінці є багато корисної інформації про проблеми, з якими ви зіткнетесь.


Так, гарне посилання!
sybreon

1
Я би сподівався побачити більше / інші проблеми, ніж зазначені на сторінці c10k. Встановлення та закриття з'єднання 10k в секунду відрізняється від 10k відкритих з'єднань. Підключення, що перебувають у стані TIME_WAIT, було б одним, а обмеження відставання для прослуховування розетки може бути іншим. І я не був би здивований, якщо цей випадок використання не отримав стільки профілювання / оптимізації в коді ядра, ніж більш поширений випадок відкритого з'єднання 10k.
cmeerw

2

ви повинні вміти це робити [хоча це, мабуть, погана ідея].

на смолі appserv я можу отримати ~ 5k req / сек на чотирьохядерному ядрі 2,6 ГГц xeon. запити викликати простий сервлет, який читає 1 рядок з mysql і надсилає дуже маленьку відповідь xml.

тест робився с

ab -n 10000 -c 16 http://some/url/

результати тесту:

Concurrency Level:      16
Time taken for tests:   1.904 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3190000 bytes
HTML transferred:       1850000 bytes
Requests per second:    5252.96 [#/sec] (mean)
Time per request:       3.046 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          1636.42 [Kbytes/sec] received

але я думаю, що вам буде набагато краще використовувати просту програму c, безумовно, без нерестування нових тем для кожного запиту. посилання від Грега Хьюгілла має дати вам гарне уявлення про це.

навіть під час тривалого тестування у мене не виникає проблем із підключенням (згадані напіввідкриті розетки); тестовий пробіг між двома скриньками Linux, підключеними через гігабітну мережу Ethernet [хоча, як ви бачите, пропускна здатність не є вузьким місцем].


Чи закриті ваші зв’язки після кожної відповіді, як ОП? Чи надсилає ab З'єднання: закрити заголовок?
Нейт

1
@Nate це http 1.0 - єдине з'єднання для кожного запиту http.
pQd

1

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


0

Я б використовував UDP замість TCP, якщо це можливо. Він повинен бути більш легким і, отже, кращим накидом.


Я згоден. UDP був би набагато
легшим

1
У UDP є свої недоліки, як перевірка відправника та доставки, тому слід розглянути їх, перш ніж використовувати UDP у виробництві.
SaveTheRbtz

0

Ваш нік має бути в змозі впоратися з цим, але я сумніваюся в дизайні наявності 10 к нових TCP-з'єднань в секунду; якщо ви швидко створюєте / руйнуєте з'єднання, вам слід або: а) тримати їх відкритими довше, або b) використовувати замість UDP.

У випадку, коли у вас є клієнти 1М, яким потрібно час від часу робити запит, але де навантаження буде досягати 10 к / с, UDP, мабуть, кращий вибір.

У випадку, коли у вас є лише 10 клієнтів, яким потрібно робити запит щосекунди, вони можуть просто тримати наявні з'єднання відкритими та використовувати їх повторно. Це було б набагато приємніше до ОС, а також призведе до набагато меншої затримки, оскільки це не потребуватиме кожного нового рукостискання кожен раз.

У випадку, коли у вас є 10 кб запитів в секунду, я думаю, у вас все одно є балансир навантаження, тому вам також потрібно перевірити це.

(NB: Я думаю, що це належало до переповнення стека)

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