ThreeDHead Posted May 5, 2010 Posted May 5, 2010 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-го процессора. Создается впечатление что больше чем по первым четырем ядрам раскидать не могу эти очереди. Может там какие нюансы есть? Вставить ник Quote
Ilya Evseev Posted May 5, 2010 Posted May 5, 2010 Кажется, про это писали здесь: http://forum.nag.ru/forum/index.php?showto...mp;#entry460834 Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 Кажется, про это писали здесь: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 ? Вставить ник Quote
vitalyb Posted May 6, 2010 Posted May 6, 2010 ThreeDHead CPU маска шестнадцатеричная, а не десятичная. Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 (edited) ThreeDHead CPU маска шестнадцатеричная, а не десятичная. Да нормально всё: 16 DEC = 10 HEX = 10000 BIN = 5 ядро, а крутится на первом, типа перекрутился... Edited May 6, 2010 by ThreeDHead Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 (edited) ThreeDHead CPU маска шестнадцатеричная, а не десятичная. Во блин! Спасибо! Прям шестнадцатиричное и надо запихивать, как будто десятичное. Короче эхать надо прям 10h, типа echo 10 > /proc/irq/1271/smp_affinity Edited May 6, 2010 by ThreeDHead Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 Ну вот точно, если не изменяя ничего попросить вывести значение, он же выводит "ffffffff". Всега считал её десятичной и в примерах везде десятичная. Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 Короче вот скриптик со ссылки 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 Вставить ник Quote
Умник Posted May 6, 2010 Posted May 6, 2010 Даже специальная прога есть для этих целей: http://laas.mine.nu/jens/eth-affinity-1.2.3.tar.gz Сам правда не пробовал. Вставить ник Quote
ThreeDHead Posted May 6, 2010 Author Posted May 6, 2010 Даже специальная прога есть для этих целей: http://laas.mine.nu/jens/eth-affinity-1.2.3.tar.gz Делает то-же самое, только написана на Си? Много бытсрее работает наверное :) Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.