Я установил kvm с помощью virt-manager, используя Debian Buster, обновленный до Kernel 5.4, для тестирования моей программы AF-XDP. Я использую NI C, который я обычно использую на своем хост-сервере с драйвером macvtap
, установленным на virtio
и passthrough
внутри гостевой системы.
Первый раз, когда я запустил свою программу внутри ВМ я заметил это сообщение об ошибке:
virtio_net virtio0 eth1: request 2 queues but max is 1
. После поиска в Google я нашел решение. Изменение конфигурации моего интерфейса на это (всегда только с 1 виртуальным процессором):
<interface type='direct' trustGuestRxFilters='yes'>
<mac address='52:54:00:b7:7d:c2'/>
<source dev='eth20' mode='passthrough'/>
<model type='virtio'/>
<driver name='vhost' queues='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Чтобы наблюдать, что происходит, для какой очереди RX я установил BPF_MAP_TYPE_ARRAY
в моей XDP-программе, которая содержит количество пакетов прибыл в каждую RX-очередь (наблюдается с bpftool map dump id xx
):
const int rx_queue_idx = ctx->rx_queue_index;
unsigned long *idx_counter = bpf_map_lookup_elem(&rx_queue_pckt_counter_map, &rx_queue_idx);
if(idx_counter != NULL) {
*idx_counter += 1;
}
Поскольку я не нашел способа сделать Receive Side Steering
с macvtap
( KVM / QEMU virtio (macvtap): Возможна ли RSS с несколькими очередями? ) Я тестирую только одну очередь RX с несколькими сокетами AF-XDP (они используют один и тот же модуль). Каждый сокет отвечает за обработку пакетов из одного источника многоадресной рассылки.
Теперь я наблюдаю, что некоторые пакеты принимаются в другой очереди, даже если я установил sudo ethtool -L eth1 combined 1
. В случае, если я пытаюсь обработать один многоадресный источник (это означает setsockopt(fd, IP_ADD_MULTICAST)
), bpf-карта выглядит так:
$ sudo bpftool map dump id 57
key: 00 00 00 00 value: 00 00 00 00 00 00 00 00
key: 01 00 00 00 value: 29 dd 2d 00 00 00 00 00
Немного странно, что virtio не запускается с первого RX - Конечно, но хорошо, я могу адаптировать свою программу. Общая потеря пакетов составляет около 0,2% при 270 кбит / с.
В случае, если я добавлю два многоадресных потока (снова с IP_ADD_MULTICAST
), это bpf-карта:
$ sudo bpftool map dump id 61
key: 00 00 00 00 value: 00 00 00 00 00 00 00 00
key: 01 00 00 00 value: 76 a4 4b 00 00 00 00 00
Потеря пакетов сейчас около 16% при 455kpps, что далеко не соответствует исходной производительности (это нормально?).
Если я добавлю еще один многоадресный поток, это карта bpf:
$ sudo bpftool map dump id 65
key: 00 00 00 00 value: 2f 6a 0e 00 00 00 00 00
key: 01 00 00 00 value: 77 d9 20 00 00 00 00 00
Как вы можете видеть, есть пакеты в RX-Queue 0 и RX-Queue 1. Почему это так?
Я не понимаю, почему ethtool показывает мне это, хотя у меня есть доказательства, что существует несколько RX -Queues, где пакеты получены на:
$ sudo ethtool -S eth1
NIC statistics:
rx_queue_0_packets: 80341229
rx_queue_0_bytes: 119871244125
rx_queue_0_drops: 79419999
rx_queue_0_xdp_packets: 80332151
rx_queue_0_xdp_tx: 0
rx_queue_0_xdp_redirects: 79922548
rx_queue_0_xdp_drops: 79419999
rx_queue_0_kicks: 1586
tx_queue_0_packets: 165
tx_queue_0_bytes: 13552
tx_queue_0_xdp_tx: 0
tx_queue_0_xdp_tx_drops: 0
tx_queue_0_kicks: 165