Настройка RPS (Receive Packet Steering)

Receive Packet Steering (RPS) — программная реализация RSS. Полезен например когда на сетевом интерфейсе меньше прерываний чем ядер у процессора.

Настоятельно рекомендую настраивать RSS как я описывал в статье:
Распределение прерываний сетевой платы по ядрам процессора

В крайнем случае можно настроить RPS, к примеру если трафик сетевого интерфейса попадает только в первое прерывание, а остальные не используются (пустые) или просто имеет только одно прерывание и соответственно нагружает только одно ядро CPU.
Например чтобы очередь обрабатывалась на любом из 8 ядер, можно указать ff (по умолчанию 0):

echo "ff" > /sys/class/net/ens1f0/queues/rx-0/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-1/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-2/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-3/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-4/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-5/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-6/rps_cpus
echo "ff" > /sys/class/net/ens1f0/queues/rx-7/rps_cpus
 
echo "ff" > /sys/class/net/ens1f1/queues/rx-0/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-1/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-2/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-3/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-4/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-5/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-6/rps_cpus
echo "ff" > /sys/class/net/ens1f1/queues/rx-7/rps_cpus

Проверим:

cat /sys/class/net/ens1f0/queues/*/rps_cpus
cat /sys/class/net/ens1f1/queues/*/rps_cpus

Чтобы на любом из 0-3 ядер укажем f, например:

echo "f" | tee /sys/class/net/eth0/queues/rx-[0-3]/rps_cpus

Еще пример, однажды мне попался сетевой адаптер HP 544+QSFP (764284-B21) Mellanox ConnectX-3 Pro EN, количество прерываний которого можно указать в степени двойки, то есть 1,2,4,8,16,32,64 и т.д., а ядер процессора в моем случае было 14, в этом случае можно указать 8 прерываний на сетевом интерфейсе и настроить RSS для них (с 0 по 7 ядро), а на остальные ядра настроить RPS (с 8 по 13 ядро), то есть число 00000000111111 переводим в шестнадцатиричное и получаем 3F00.

Например F — это шестнадцетиричное значение, которое равняется 1111. Если нужно распределить прерывания на ядра процессора не с 0 по 3, а с 1 по 3, то это будет 0111 в двоичном формате, а в шестандцатеричном 7.

Приведу вам еще несколько примеров для понимания:

2 cores (11) = 3
3 cores (111) = 7
4 cores (1111) = F
5 cores (11111) = 1F
6 cores (111111) = 3F
7 cores (1111111) = 7F
8 cores (11111111) = FF
9 cores (111111111) = 1FF
10 cores (1111111111) = 3FF
11 cores (11111111111) = 7FF
12 cores (111111111111) = FFF
13 cores (1111111111111) = 1FFF
14 cores (11111111111111) = 3FFF

15 cores (111111111111111) = 7FFF
16 cores (1111111111111111) = FFFF
17 cores (11111111111111111) = 1FFFF
...

Чтобы изменения не сбросились после перезапуска системы — добавим команды в /etc/rc.local

Для подсчета маски также можно воспользоваться онлайн конвертерами, например:
bitsum.com/tools/cpu-affinity-calculator/
rapidtables.com/convert/number/binary-to-hex.html

Смотрите также мои статьи:
Решение: Нет файла /etc/rc.local в Ubuntu 18
Как узнать на каких NUMA node сетевые интерфейсы
Настройка сети в Linux

Оставьте комментарий

Добавить комментарий