XDP + virtio: virtio распределяет пакеты по нескольким очередям RX, которые мне не нужны - PullRequest
0 голосов
/ 09 апреля 2020

Я установил 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
...