Jump to content
Калькуляторы

Не получается раскидать очереди сетевухи по ядрам.

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-го процессора.

 

Создается впечатление что больше чем по первым четырем ядрам раскидать не могу эти очереди.

Может там какие нюансы есть?

Share this post


Link to post
Share on other sites
Кажется, про это писали здесь:

http://forum.nag.ru/forum/index.php?showto...mp;#entry460834

Тред совсем не о том.

 

Проблема в том что делаю, например направляю прерывание на 5-й по счету процессор: echo 16> /proc/irq/1271/smp_affinity, после этого делаю cat /proc/irq/1271/smp_affinity получаю 16, а счетчики начинают бегать на 1-м ядре!

Думаю что может проблема с драйвером сетевой, он достаточно старой версии.

 

Еще вопрос в тему - откомпилировал свежий драйвер, хочу его подоткнуть, но хочу сперва знать с какими значениями загружается старый - как это узнать? ethtool подробностей не выдает. lsmod молчит, загружен говорит и всё, а с какими параметрами он мог быть загружен в версии driver: igb, version: 1.0.8-k2, firmware-version: 1.2-3 ?

Share this post


Link to post
Share on other sites

ThreeDHead

CPU маска шестнадцатеричная, а не десятичная.

Share this post


Link to post
Share on other sites
ThreeDHead

CPU маска шестнадцатеричная, а не десятичная.

Да нормально всё: 16 DEC = 10 HEX = 10000 BIN = 5 ядро, а крутится на первом, типа перекрутился...
Edited by ThreeDHead

Share this post


Link to post
Share on other sites
ThreeDHead

CPU маска шестнадцатеричная, а не десятичная.

Во блин! Спасибо! Прям шестнадцатиричное и надо запихивать, как будто десятичное.

 

Короче эхать надо прям 10h, типа echo 10 > /proc/irq/1271/smp_affinity

Edited by ThreeDHead

Share this post


Link to post
Share on other sites

Ну вот точно, если не изменяя ничего попросить вывести значение, он же выводит "ffffffff".

Всега считал её десятичной и в примерах везде десятичная.

Share this post


Link to post
Share on other sites

Короче вот скриптик со ссылки Ilya Evseev, помодифицировал его чуть, работает нормально:

#!/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 1

n=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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this