Linux 2.6.26-2-amd64 #1 SMP Tue Mar 9 22:29:32 UTC 2010 x86_64 GNU/LinuxСервер с 2 процессорами:
Intel(R) Xeon(R) CPU E5530 @ 2.40GHzДвухпортовая сетевая на чипе 82575EB, 8 очередей на прием, 8 на передачу:
01:00.0 Ethernet controller: Intel Corporation Device 10c9 (rev 01)
01:00.1 Ethernet controller: Intel Corporation Device 10c9 (rev 01)
# ethtool -i eth0
driver: igb
version: 1.0.8-k2
firmware-version: 1.2-3
bus-info: 0000:01:00.0# ethtool -i eth1
driver: igb
version: 1.0.8-k2
firmware-version: 1.2-3
bus-info: 0000:01:00.1С какими параметрами драйвер грузится, не в курсе, но выглядит это так: (лишнее повырезал)
#cat /proc/interrupts
1263: PCI-MSI-edge ahci
1264: PCI-MSI-edge eth1
1265: PCI-MSI-edge eth1-rx3
1266: PCI-MSI-edge eth1-rx2
1267: PCI-MSI-edge eth1-rx1
1268: PCI-MSI-edge eth1-rx0
1269: PCI-MSI-edge eth1-tx0
1270: PCI-MSI-edge eth0
1271: PCI-MSI-edge eth0-rx3
1272: PCI-MSI-edge eth0-rx2
1273: PCI-MSI-edge eth0-rx1
1274: PCI-MSI-edge eth0-rx0
1275: PCI-MSI-edge eth0-tx0Задача - раскидать все очереди по ядрам процессоров c 4 по 15:
printf %d 0x8000 >/proc/irq/1270/smp_affinity # 1270: eth0
printf %d 0x4000 >/proc/irq/1271/smp_affinity # 1271: eth0-rx3
printf %d 0x2000 >/proc/irq/1272/smp_affinity # 1272: eth0-rx2
printf %d 0x1000 >/proc/irq/1273/smp_affinity # 1273: eth0-rx1
printf %d 0x0800 >/proc/irq/1274/smp_affinity # 1274: eth0-rx0
printf %d 0x0400 >/proc/irq/1275/smp_affinity # 1275: eth0-tx0
printf %d 0x0200 >/proc/irq/1264/smp_affinity # 1264: eth1
printf %d 0x0100 >/proc/irq/1265/smp_affinity # 1265: eth1-rx3
printf %d 0x0080 >/proc/irq/1266/smp_affinity # 1266: eth1-rx2
printf %d 0x0040 >/proc/irq/1267/smp_affinity # 1267: eth1-rx1
printf %d 0x0020 >/proc/irq/1268/smp_affinity # 1268: eth1-rx0
printf %d 0x0010 >/proc/irq/1269/smp_affinity # 1269: eth1-tx0Но не выходит каменный цветочек...
Крутятся они все только на первых чётырех ядрах. Т.е. например значение битовой маски (16dec / 10h) указывает на 5-й по счету процессор, счетчики interrupts бегают на 1-м. Но тем не менее при считывании этого же значения, выходит правильное значение - маска для 5-го процессора.Создается впечатление что больше чем по первым четырем ядрам раскидать не могу эти очереди.
Может там какие нюансы есть?
>Создается впечатление что больше чем по первым четырем ядрам раскидать не могу
>эти очереди.
>Может там какие нюансы есть?А сколько всего ядер? cat /proc/cpuinfo?
>А сколько всего ядер? cat /proc/cpuinfo?Всего в системе 16 ядер (там по 4 ядра на проц с гиперртредингом). Вывод /proc/cpuinfo не буду постить, ибо портянка огромная.
Короче маску надо использовать шестнадцатиричную, причем записывать её надо безо-всяких префиксов типа "0x" или суффикса "h", а прямо как десятичную. Например echo 10 > /proc/irq/1271/smp_affinity - где 10 это 10 HEX (5-е ядро)!
Вот скриптик:#!/bin/sh
#
# irq2smp -- distribute hardware interrupts from Ethernet devices by CPU cores.
#
# Should be called from /etc/rc.local.
#ncpus=`grep -ciw ^processor /proc/cpuinfo`
test "$ncpus" -gt 1 || exit 1n=0
for irq in `cat /proc/interrupts | grep eth | awk '{print $1}' | sed s/\://g`
do
f="/proc/irq/$irq/smp_affinity"
test -r "$f" || continue
cpu=$[$ncpus - ($n % $ncpus) - 1]
if [ $cpu -ge 0 ]
then
mask=`printf %x $[2 ** $cpu]`
echo "Assign SMP affinity: eth$n, irq $irq, cpu $cpu, mask 0x$mask"
echo "$mask" > "$f"
let n+=1
fi
done