Низкая пропускная способность с XDP_TX по сравнению с XDP_DROP/REDIRECT

Я разработал программу XDP, которая фильтрует пакеты на основе определенных правил, а затем либо отбрасывает их (XDP_DROP), либо перенаправляет (xdp_redirect_map) на другой интерфейс. Эта программа вполне справлялась с синтетической нагрузкой ~11Mpps (это все, на что способен мой генератор трафика) всего на четырех ядрах процессора.

Теперь я изменил эту программу, чтобы использовать XDP_TX для отправки пакетов на интерфейс, на котором они были получены, вместо перенаправления их на другой интерфейс. К сожалению, это простое изменение привело к значительному падению пропускной способности, и теперь он с трудом справляется с ~4Mpps.

Я не понимаю, в чем может быть причина или как это дальше отлаживать, поэтому и спрашиваю здесь.

Моя минимальная тестовая установка для воспроизведения проблемы:

  • Два компьютера с сетевыми адаптерами Intel x520 SFP+ напрямую подключены друг к другу, оба сетевых адаптера настроены на наличие столько объединенных очередей, сколько ядер ЦП на компьютере.
  • Машина 1 запускает pktgen с использованием примера приложения из исходников Linux: ./pktgen_sample05_flow_per_thread.sh -i ens3 -s 64 -d 1.2.3.4 -t 4 -c 0 -v -m MACHINE2_MAC (4 потока, потому что эта конфигурация привела к максимальному количеству генерируемых Mpps, даже несмотря на то, что машина имеет более 4 ядер)
  • Компьютер 2 запускает простой программа, которая отбрасывает (или отражает) все пакеты и подсчитывает количество пакетов в секунду. В этой программе я заменил код возврата XDP_DROP на XDP_TX. - Если я поменяю местами MAC-адреса src/dest перед отражением пакета, это никогда не повлияет на пропускную способность, поэтому я не буду об этом говорить.

При запуске программы с XDP_DROP 4 ядра на Machine 2 слегка загружены ksoftirqd потоками, при этом скорость снижается примерно на ~11 Мбит/с. То, что загружаются только 4 ядра, имеет смысл, учитывая, что pktgen отправляет 4 разных пакета, которые заполняют только 4 очереди rx из-за того, как работает хеширование в сетевой карте.

Но при запуске программы с XDP_TX одно из ядер занято ~100% с ksoftirqd и обрабатывается только ~4Mpps. Здесь я не уверен, почему это происходит.

У вас есть идея, что может быть причиной этого падения пропускной способности и увеличения использования ЦП?

Редактировать: вот еще некоторые подробности о конфигурации машины 2:

# ethtool -g ens2f0
Ring parameters for ens2f0:
Pre-set maximums:
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:
RX:             512   # changing rx/tx to 4096 didn't help
RX Mini:        n/a
RX Jumbo:       n/a
TX:             512

# ethtool -l ens2f0
Channel parameters for ens2f0:
Pre-set maximums:
RX:             n/a
TX:             n/a
Other:          1
Combined:       63
Current hardware settings:
RX:             n/a
TX:             n/a
Other:          1
Combined:       32

# ethtool -x ens2f0
RX flow hash indirection table for ens2f0 with 32 RX ring(s):
    0:      0     1     2     3     4     5     6     7
    8:      8     9    10    11    12    13    14    15
   16:      0     1     2     3     4     5     6     7
   24:      8     9    10    11    12    13    14    15
   32:      0     1     2     3     4     5     6     7
   40:      8     9    10    11    12    13    14    15
   48:      0     1     2     3     4     5     6     7
   56:      8     9    10    11    12    13    14    15
   64:      0     1     2     3     4     5     6     7
   72:      8     9    10    11    12    13    14    15
   80:      0     1     2     3     4     5     6     7
   88:      8     9    10    11    12    13    14    15
   96:      0     1     2     3     4     5     6     7
  104:      8     9    10    11    12    13    14    15
  112:      0     1     2     3     4     5     6     7
  120:      8     9    10    11    12    13    14    15
RSS hash key:
d7:81:b1:8c:68:05:a9:eb:f4:24:86:f6:28:14:7e:f5:49:4e:29:ce:c7:2e:47:a0:08:f1:e9:31:b3:e5:45:a6:c1:30:52:37:e9:98:2d:c1
RSS hash function:
    toeplitz: on
    xor: off
    crc32: off

# uname -a
Linux test-2 5.8.0-44-generic #50-Ubuntu SMP Tue Feb 9 06:29:41 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Редактировать 2: я также попробовал MoonGen в качестве генератора пакетов и заполнил машину 2 10Mpps и 100 различными вариантами пакетов (потоками). Теперь трафик лучше распределяется между ядрами при отбрасывании всех этих пакетов с минимальной нагрузкой на процессор. Но XDP_TX по-прежнему не справляется и загружает одно ядро ​​на 100% при обработке ~3Mpps.


person Marcus Wichelmann    schedule 18.03.2021    source источник
comment
Какую пропускную способность вы получаете с xdp_redirect_map? Вы случайно не передаете -S сценарию скрытой копии?   -  person pchaigno    schedule 19.03.2021
comment
То, что для XDP_TX используется одно ядро, кажется немного странным. Возможно, стоит проверить, что там происходит (конфигурация очереди на сетевой карте, привязки IRQ).   -  person pchaigno    schedule 19.03.2021
comment
Спасибо за ваш комментарий. Отбрасывание всех пакетов происходит так же быстро, как и перенаправление всех пакетов с xdp_redirect_map: ~11Mpps. Только XDP_TX намного медленнее. Нет, я не включал режим SKB, на самом деле, я даже могу воспроизвести проблему, загрузив минимальную программу XDP всего одной строкой: return XDP_TX;, которая по-прежнему дает ~4Mpps (пропускную способность можно увидеть в bmon).   -  person Marcus Wichelmann    schedule 19.03.2021
comment
@pchaigno Теперь я расширил вопрос, добавив больше информации о сетевой карте. Если вы знаете еще места, которые могут быть интересны, дайте мне знать, и я добавлю их.   -  person Marcus Wichelmann    schedule 19.03.2021


Ответы (1)


Теперь я обновил ядро ​​Machine 2 до 5.12.0-rc3, и проблема исчезла. Похоже, это была проблема с ядром.

Если кто-то знает больше об этом или имеет журнал изменений по этому поводу, пожалуйста, дайте мне знать.

person Marcus Wichelmann    schedule 19.03.2021