Почему отличается пропускная способность физического и виртуального сетевого интерфейса?

При использовании утилиты nicstat можно заметить расхождение измерений скорости трафика на физическом и виртуальном интерфейсе. На стороне OS – Origin Server – мы измерим записанные байты.
eth0 – физический интерфейс, eth0.20 – виртуальный. Других источников трафика на eth0 нет.

Time Int rKB/s wKB/s rPk/s wPk/s rAvs wAvs %Util Sat
07:11:42 eth0 8655.8 251401 50505.1 183807 175.5 1400.6 100 0.00
07:11:42 eth0.20 7772.0 246345 51621.8 39909.1 154.2 6320.8 100 0.00
Видно, что записано на eth0 со скоростью 251401 Кбайт/сек, а на eth0.20 показатель на 2% меньше — 246345. Первая догадка была: разное отсечки времени в самой утилите, но ведь схожие числа можно наблюдать и в /proc/net/dev.

Некоторые статьи по теме предполагали, что причиной расхождения могут быть в пакетах при их передаче с физического интерфейса на виртуальный: обрезаются заголовки MAC адреса. Но в этом случае эффект должен быть обратным: MAC адрес добавляется физическим интерфейсом только когда пакеты покидают виртуальную машину. Я решил посмотреть средний размер пакета. Средние показатели за 10 секунд из /proc/net/dev выдали:

eth0: 3,107,058,068 bytes, 2,226,355 packets; giving an average packet size of 1396 bytes.
eth0.20: 2,970,609,171 bytes, 483,592 packets; giving an average packet size of 6143 bytes.
Результаты сначала сбили с толку. Почему размер пакета такой большой (выше MTU) на виртуальном интерфейсе?

Тут я решил почитать про настройки драйверов, там обнаружились Generic Segmentation Offload и TCP Segmentation Offload. Эти настройки заставляют драйвер NIC сегментировать пакеты для передачи самостоятельно. У них есть аналоги для сборки прибывающих пакетов на принимающей стороне — Generic Receive Offload и Large Receive Offload.

После отключения Generic Segmentation Offload и TCP Segmentation Offload средние результаты стали такими:

eth0: 1373
eth0.20: 1367
Разница в 6 байт — ровно в размер заголовка MAC Source. Значит, при измерениях стОит доверять именно показателям на физическом интерфейсе (при условии, что виртуальный интерфейс только один).

Стоит отметить, что настройки offload стоит включить после ваших проверок (как это сделал я), т.к. они улучшают производительность.

Сейчас на сайте

Сейчас на сайте 0 пользователей и 3 гостя.