Я запускаю набор нагрузочных тестов, чтобы определить производительность следующей настройки:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Вкратце, набор тестов node.js отправляет определенное количество метрик каждые x секунд в экземпляр StatsD, который находится на другом сервере. Затем StatsD сбрасывает метрики каждую секунду в экземпляр Graphite, расположенный на том же сервере. Затем я смотрю, сколько метрик фактически было отправлено набором тестов и сколько было получено Graphite для определения потери пакетов между набором тестов и Graphite.
Однако я заметил, что иногда я получаю очень большие скорости отбрасывания пакетов (обратите внимание, что он отправляется по протоколу UDP), в пределах 20-50%. И вот тогда я начал изучать, где эти пакеты отбрасывались, видя, что это может быть связано с некоторой проблемой производительности StatsD. Поэтому я начал регистрировать показатели в каждой части системы, чтобы отслеживать, где произошло это падение. И здесь все становится странным.
Я использую tcpdump для создания файла захвата, который я проверяю после завершения теста. Но всякий раз, когда я запускаю тесты с запущенным tcpdump, потеря пакетов практически отсутствует! Похоже, что tcpdump каким-то образом повышает производительность моих тестов, и я не могу понять, почему и как это происходит. Я запускаю следующую команду для регистрации сообщений tcpdump на сервере и клиенте:
tcpdump -i any -n port 8125 -w test.cap
В одном конкретном тестовом примере я посылаю 40000 метрик / с. Тест при запуске tcpdump имеет потерю пакетов около 4%, в то время как тест без потери пакетов составляет около 20%
Обе системы работают как виртуальные машины Xen со следующей настройкой:
- Intel Xeon E5-2630 v2 с частотой 2,60 ГГц
- 2 ГБ ОЗУ
- Ubuntu 14.04 x86_64
Вещи, которые я уже проверил на возможные причины:
- Увеличение размера буфера приема / отправки UDP.
- Нагрузка процессора влияет на тест. (максимальная загрузка 40-50%, как на стороне клиента, так и на стороне сервера)
- Запуск tcpdump на определенных интерфейсах вместо 'any'.
- Запуск tcpdump с '-p' для отключения случайного режима.
- Запуск tcpdump только на сервере. Это привело к потере пакетов на 20% и, похоже, не повлияло на тесты.
- Запуск tcpdump только на клиенте. Это привело к увеличению производительности.
- Увеличение netdev_max_backlog и netdev_budget до 2 ^ 32-1. Это не имеет значения.
- Перепробовал все возможные настройки случайного режима на каждом нике (сервер включен и клиент выключен, сервер выключен и клиент включен, оба включены, оба выключены). Это не имеет значения.
ifconfig eth0 promisc
включает и ifconfig eth0 -promisc
отключает беспорядочный режим на eth0. Если это имеет значение, попробуйте сравнить 4 возможных комбинации включения / выключения на обеих машинах. Это может помочь точно определить источник проблем.
-p
опцию, чтобы пропустить это, чтобы увидеть, если это имеет значение.