Просмотр Исходного

Многие сетевые карты имеют несколько очередей для входящих пакетов. Каждая очередь висит на ядре/списке ядер. На многих железках из коробки, несмотря на то, что в smp_affinity_list указан список 0-$cpucount все прерывания находятся на первом ядре процессора. Обойти это можно раскидав с помощью echo все прерывания на разные ядра.

Для систем с одним физическим процессором и сетевыми картами, использующими драйвера igb, ixgbe, vmxnet3 можно использовать утилиту:

{code}
/usr/local/Reductor/bin/tune_interrupts.sh eth1
{code}

В остальных случаях она сделает хуже и требуется ручная настройка, рекомендации по ней:

По возможности используйте разные реальные ядра, допустим, дано:

- 1 процессор с гипертредингом
- 4 реальных ядра
- 8 виртуальных ядер
- 4 очереди сетевой карты, которые составляют 95% работы сервера

Раскинуть их на 0, 1, 2 и 3 ядра будет не так эффективно, как на 0, 2, 4 и 6.

Пример кода (не универсальный), который раскидывает 8 очередей на 8 ядер (довольно простой случай).
Строка "-TxRx" - по ней можно идентифицировать очереди сетевой карты принимающей зеркало трафика, может отличаться в зависимости от модели сетевой карты и драйвера, посмотреть как она выглядит можно в файле cat /proc/interrupts

Создаем сам файл-хук:

{panel}
/usr/local/Reductor/userinfo/hooks/start.sh
{panel}
В него добавляем следующее содержимое:

{code}
#!/bin/bash

tune_nic() {
echo "- Настраиваем прерывания $1"
local nic="$1$2"
local cpucount=$(grep -c 'model name' /proc/cpuinfo)
grep $nic /proc/interrupts | while read irq $(eval echo cpu{1..$cpucount}) _ queue _; do
irq=${irq//:}
proc_entry=/proc/irq/$irq/smp_affinity_list
evaled="${queue##*rx-}"
echo $evaled > $proc_entry
done
}

client_post_start_hook() {
tune_nic "eth1" "-rx"
tune_nic "eth2" "-TxRx"
}
{code}