Несколько дней назад провёл стресс-тест 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% верность чисел, но картина примерно такая.