Распределение прерываний

по сравнению с
Текущая Шевнин Игнат
на мар 01, 2017 17:41.

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (2)

просмотр истории страницы
Многие сетевые карты имеют несколько очередей для входящих пакетов. Каждая очередь висит на ядре/списке ядер. На многих железках из коробки, несмотря на то, что в 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}