Я виконую набір тестів навантаження, щоб визначити продуктивність наступних налаштувань:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Коротше кажучи, тестовий набір node.js надсилає задану кількість метрик кожні x секунд екземпляру StatsD, який знаходиться на іншому сервері. StatsD потім по черзі розмиває показники щосекунди до екземпляра Graphite, розташованого на одному сервері. Потім я розглядаю, скільки метрик насправді було надіслано тестовим набором і скільки отримано графітом для визначення втрат пакету між тестовим набором та графітом.
Однак я помітив, що інколи отримую дуже великі показники падіння пакетів (зауважте, що він надсилається за допомогою протоколу UDP), коливаючись від 20-50%. Тож саме тоді я почав розбиратися, куди скидають ці пакети, бачачи, що це може бути певна проблема з програмою StatsD. Тож я почав фіксувати показники в кожній частині системи, щоб відстежувати, де відбулася ця крапля. І ось тут речі стають дивними.
Я використовую tcpdump для створення файлу захоплення, який я перевіряю після запуску тесту. Але щоразу, коли я запускаю тести із запуском tcpdump, втрата пакету майже не існує! Схоже, tcpdump якось збільшує ефективність моїх тестів, і я не можу зрозуміти, чому і як це робиться. Я виконую наступну команду для реєстрації tcpdump повідомлень на сервері та клієнті:
tcpdump -i any -n port 8125 -w test.cap
В одному конкретному тестовому випадку я надсилаю 40000 метрик / с. Тест під час роботи tcpdump втрачає пакет близько 4%, а той, що не має втрати пакета, становить близько 20%
Обидві системи працюють як Xen VM із наступною установкою:
- 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. Якщо це має значення, спробуйте порівняти чотири можливі комбінації вимкнення / вимикання на обох машинах. Це може допомогти точно визначити джерело проблем.
-p
параметр, щоб пропустити це, щоб побачити, чи це має значення.