Приложение A отправляет трафик в B через TCP. B с помощью многоадресной рассылки (UDP) отправляет трафик дальше в C. Приложения на D получают эти данные через TCP.
A -> (TCP) -> B -> (UDP) -> C -> (TCP) -> D
A - Windows Server
B - виртуальная машина Linux на хосте ESX
C - виртуальная машина Linux на другом хосте ESX (без нагрузки - только одна виртуальная машина)
D - Windows-клиенты
когда B направляет трафик на C могут наблюдаться множественные отбрасывания из-за характера трафика (пакетов), происходящего на уровне NIC (ixgbe) (rx_missed_errors напрямую соответствуют тому, какое приложение на C наблюдает).
Увеличение размера кольцевого буфера (на C) до максимального значения (4096) делает ситуацию еще хуже.
Все соединения 10G, уровень трафика не превышает 2 Гбит / с (во время пакетов) (проверено с помощью sar -n DEV 1
).
Как я могу измерять пакеты с интервалом менее 1 секунды?
Почему увеличение размера кольца может ухудшить ситуацию?
Есть ли способ замедлить трафик на B, чтобы его можно было обрабатывать на C без сбоев на уровне NIC? (Формирование трафика, изменение размера окна TCP / размера буфера?)
Почему, если я заменяю B хостом Windows, отказов вообще не происходит, как будто пакеты udp формируются более удобоваримым образом.
Как еще я мог подойти, проанализировать эту проблему?
Спасибо