Гостевая ОС QEMU-KVM не соблюдает настройку MTU.

У меня 3 QEMU-KVM VM работают на хосте Ubuntu. Каждая виртуальная машина имеет один виртуальный компьютер и соединена мостом br0 в ОС хоста. MTU каждой сетевой карты настроен на 1500. Эта платформа запускает приложение на основе очереди сообщений: одна виртуальная машина в качестве производителя, одна виртуальная машина в качестве сервера очереди сообщений и последняя виртуальная машина в качестве потребителя.

Моя проблема: когда гостевые виртуальные машины становятся занятыми, виртуальная машина сервера очереди сообщений может иногда отправлять пакеты размером 2k, 4k или 5k. Это превышает значение MTU сетевой карты, 1500 !!! Насколько я знаю, стек IP Linux должен перед отправкой обрезать IP-фрагменты, размер которых меньше MTU. Почему эта виртуальная машина отправляет большой пакет, когда она занята?

Ниже представлена ​​архитектура платформы:

[w2: celery caller (message queue producer) ] 
     | (messages in TCP)
     V
[w3: rabbitmq server] 
     | (messages in TCP)
     V
[w4: celeryd (message queue consumer)]

Ниже показан снимок экрана на w3, MTU составляет 1500 и отправляет пакет размером> 2000 экран, сделанный на w3

Ниже приведен снимок экрана на w4, MTU составляет 1500 и принимает пакет размером> 2000 введите описание изображения здесь


person Houcheng    schedule 13.03.2014    source источник


Ответы (1)


Всем спасибо, теперь я нашел ответ.

Virtio-NIC в гостевой ОС поддерживает разгрузку сегментации TCP (TSO) и по умолчанию включен. Функция TSO сетевого адаптера состоит в том, что уровень TCP не выполняет сегментацию кадра, а сегментация выполняется в автономном режиме драйвером сетевого адаптера или оборудованием. TSO предназначен для повышения производительности при отправке большого пакета и разгрузки рабочей программы TCP-отправителя, драйвер NIC получит большой пакет в этом режиме и сегментирует его на меньшую полезную нагрузку, IP-заголовок и TCP-заголовок. Преимущество такой обработки разгрузки заключается в том, что драйвер может хорошо использовать оборудование или повторно использовать буфер skb заголовка во время сегментации.

Ниже приведен код драйвера, поддерживающего функцию TSO,

источник драйвера сетевой карты Atheros

В своей функции отправки он вызывает atl1c_tso_csum (), который проверяет флаги передающего буфера и SKB_GSO_TCPV4. если буфер содержит флаг SKB_GSO_TCPV4, сегментируйте его, добавьте заголовок ip и добавьте заголовок tcp.

Однако virtio NIC поддерживает функцию TSO, поскольку пакеты virtio NIC отправляются в ОС хоста. Функция его драйвера tx просто отправляет весь пакет и обеспечивает более высокую пропускную способность сети.

Примечание: после выключения флага TSO на гостевой виртуальной машине большие пакеты не отображаются на tcpdump. вот команды:

$ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: off
tx-vlan-offload: off
ntuple-filters: off
receive-hashing: off
$ethtool -K eth0 tso off
$

ссылка 2: https://blogs.gnome.org/markmc/category/virtio/

person Houcheng    schedule 13.03.2014
comment
TSO = разгрузка сегментации TCP, не в автономном режиме. - person osgx; 13.03.2014
comment
Некоторое время назад я столкнулся с той же проблемой: stackoverflow.com/questions/2350985/ - person kumar; 13.03.2014