Назад |
Перейти на главную страницу
Что могло вызвать значительные задержки в запросах сервер-сервер с высоким уровнем параллелизма?
Настроить
- 4 блейд-сервера в одном шасси, каждое с 48 ядрами и 1 ТБ памяти. Виртуальные машины управляются с помощью Proxmox.
- «Родительский» сервис с 7 виртуальными машинами под управлением Linux (Debian) / Apache / PHP, вызывающий несколько микросервисов с использованием cURL (multi) из PHP. Каждому из них назначено 4 ядра и 4 ГБ памяти.
- 1 балансировщик нагрузки / кеш для одного из микросервисов (NLP) под управлением Linux (Debian) и Varnish (конфигурация: https://pastebin.com/prE3ZtmN) с 16 процессорами и 16 ГБ памяти.
- 6 Vms микросервиса NLP, каждый с 6 процессорами и 12 ГБ памяти.
Проблема
При нагрузочном тестировании родительской службы (с несколькими сотнями одновременных запросов) 7 экземпляров будут генерировать тысячи (> 10k) запросов к балансировщику NLP в секунду.
Во время этого нагрузочного теста балансировщик нагрузки становится медленным / не отвечает - запросы, выполнение которых обычно занимает 1–1000 мс (в зависимости от сложности запроса и всегда <10 мс в случае кеширования), могут занять несколько секунд, если не истекло время ожидания полностью.
Вещи, которые я проверил / исключил как источник проблемы
- Виртуальные машины NLP: при нагрузочном тестировании по отдельности они могут обрабатывать ~ 10 тыс. Запросов в секунду в каждой виртуальной машине до 100% использования ЦП. Во время теста нагрузки родительской службы они не достигают 100% ЦП.
- Пропускная способность сети: Использование
iperf
Я тестировал пропускную способность между виртуальными машинами на одном и том же blade-сервере (~ 10 Гбит / с) и на разных лезвиях (~ 3 Гбит / с). Эти скорости передачи значительно выше, чем измеренные в Proxmox для балансировщика нагрузки (и блейд-сервера, на котором работает виртуальная машина балансировки нагрузки). - Пропускная способность диска: Proxmox сообщает о <10 МБ / с активности диска на балансировщике нагрузки и виртуальных машинах NLP вместе взятых.
- Varnish (по крайней мере, насколько мне известно): вызывая балансировщик нагрузки с отдельной виртуальной машины (с запросом, который, как я знаю, должен быть кэширован), я измеряю время отклика в несколько секунд, но Varnish сообщает, что ответ предоставляется за <1 мс ( вывод varnishlog: https://pastebin.com/kQSdC7p1). Загрузка ЦП во время теста родительской службы также составляет всего ~ 60%. Я также попытался запустить Varnish на нескольких портах одновременно, но безуспешно.
Мой вывод
Я думаю, что это проблема TCP-соединения Linux - в частности, что-то, связанное с максимальным количеством одновременных подключений и временем ожидания. Это также объясняет, почему другая сетевая активность (например, использование PuTTY) медленная во время нагрузочного теста.
netstat -an
вывод во время теста загрузки родительской службы (пришлось разделить его на 4 части, чтобы избежать максимального размера файла Pastebin): netstat -s
вывод во время теста нагрузки родительской службы: https://pastebin.com/eN3ANb7s
Возможно ли, что я прав в своем предположении? Какие у меня есть варианты решения проблемы?