Jump to content

Recommended Posts

Posted

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

 

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

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

Posted
Кажется, про это писали здесь:

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 ?

Posted (edited)
ThreeDHead

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

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

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

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

 

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

Edited by ThreeDHead
Posted

Короче вот скриптик со ссылки 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.