«

»

Окт 18 2012

TCP-echo сервер на основе первичной версии CSO

Несколько дней назад провёл стресс-тест TCP-echo сервера (входит в примеры CFW). И получились довольно любопытные результаты.

Тест проводился с помощью 4-х виртуальных машин VMWare, запущенных на одном физическом компьютере и объединенных одной виртуальной сетью. На всех машинах была установлена CentOS 6.3. Теперь подробно о каждой из машин и алгоритмах работы ПО:

Задача Конфигурация Алгоритм работы
Host-машина 6х4.2 ГГЦ, 24ГБ ОЗУ
Сервер 2х4.2 ГГц, 1ГБ ОЗУ После приёма входящего соединения сервер ожидает поступления сообщений следующего формата: 2 байта – длинна сообщения (от 1-го до 4094-х байт)  и далее тело сообщения. По получению целого сообщения, сервер должен отправить клиенту сообщение той же длинны, но байты тела сообщения должны следовать в обратном порядке. Если сообщений от клиента нету в течении 30 секунд – данного клиента следует отключить.
Нагрузочный клиент  1х4.2 ГГц, 4ГБ ОЗУ (3 машины) Устанавливаем заданное кол-во соединений с сервером, пока сокет доступен для записи производим отсылку сообщений произвольной длинны, все входящие данные отбрасываем (проверку корректности работы не производим).
Тестовый клиент Выполняется на одной из нагрузочный машин Устанавливает единственное соединение с сервером и далее в цикле шлёт ему запрос случайной длинны и содержания, ожидает ответ (с замером времени обработки запроса), проверяет ответ на корректность, выживает секунду и снова шлёт запрос.

Использование памяти при загрузке серверной машины составляло около 78Мб, при запущенном приложении 515Мб. Без нагрузки на установление соединения с сервером уходило примерно 200-250us, на обработку сообщения 120-200 us (отправка с клиента-обработка сервером-получение клиентом). Размеры TCP-буферов были указаны статическими и равными 8КБ как на приём, так и на передачу, алгоритм Нейгла был отключён.

Результаты тестов

Условия Загрузка процессора по данным top (пользователь/система/прерывания/сеть)  Фактическое использование памяти Средняя скорость обработки данных  Время обработки запроса 
Один рабочий поток, 10к подключений  100% (0.1/8/2/38) ~ 683МБ 27-30МБ/с ~ 1s
Один рабочий поток, 20к подключений  100% (0.1/20/4/26) ~ 824МБ 27-30МБ/с ~ 1s
Один рабочий поток, 30к подключений  100% (0.1/40/5/5) ~ 934МБ 27-30МБ/с ~ 1s
Два рабочих потока, 10к подключений  127% (1.4/43/4.5/15.2) ~ 683МБ 44-47МБ/с 250us-2ms
Два рабочих потока, 20к подключений  152% (5.4/39.5/4.8/44) ~ 824МБ 94-96МБ/с 3-6ms
Два рабочих потока, 30к подключений  90% (0.8/38/4.2/58) ~ 934МБ 90-117МБ/с ~ 1.7s
Добавил серверу третье ядро, три рабочих потока, 30к подключений замеров не проводил ~ 980МБ  110-116МБ/с  20-50ms (пики до 300ms)

P.S. Я конечно не могу ручаться за 100% верность чисел, но картина примерно такая.

Добавить комментарий