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

Сетевые прерывания висят на нулевом ядре?

Имеется Debian Squeeze, ядра 2.6.38 и более новые, сетевые карты Intel с драйверами e1000e и igb.

По умолчанию все прерывания от всех карт висят на нулевом ядре процессора.

Даже если оно занято на 100%, а остальные свободны.

При запущенном irqbalance - то же самое.

 

/proc/irq/*/smp_affinity у всех установлено в 0f.

Если вручную установить 2,4,8,10,20 - нормально переходят на указанные ядра.

Вопрос: почему этого не происходит автоматически?

Share this post


Link to post
Share on other sites

попробуйте драйвер собрать с NAPI

# strings /lib/modules/`uname -r`/updates/igb.ko | grep -i napi

napi_complete

netif_napi_del

netif_napi_add

napi_gro_receive

__napi_schedule

#

 

Оно?

Share this post


Link to post
Share on other sites

/proc/irq/*/affinity_hint что содержит?

Все нули:

# cat /proc/irq/*/affinity_hint | egrep -vc '^000000$'

0

 

и еще cat /proc/interrupts неплохо бы

           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       
  0:       1082          0          0          0          0          0   IO-APIC-edge      timer
  1:          3          0          0          0          0          0   IO-APIC-edge      i8042
  8:          1          0          0          0          0          0   IO-APIC-edge      rtc0
  9:          0          0          0          0          0          0   IO-APIC-fasteoi   acpi
 12:          4          0          0          0          0          0   IO-APIC-edge      i8042
 16:          0          0          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb3
 18:          2          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb8
 19:          0          0          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb5, uhci_hcd:usb7
 21:        214          0          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb4
 23:          0          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb6
 66:          2          0          0          0          0          0   PCI-MSI-edge      eth0
 67:     459407          0          0          0          0        452   PCI-MSI-edge      eth0-rx-0
 68:     166245          0          0          0          0        169   PCI-MSI-edge      eth0-tx-0
 69:       7100          0          0     166805          0          0   PCI-MSI-edge      ahci
 70:          2          0          0          0          0          0   PCI-MSI-edge      eth1
 71:    2176077 2285622285          0          0          0          0   PCI-MSI-edge      eth1-TxRx-0
 72:          2          0          0          0          0          0   PCI-MSI-edge      eth2
 73:  392550914          0 2068633415          0          0          0   PCI-MSI-edge      eth2-TxRx-0
 74:          2          0          0          0          0          0   PCI-MSI-edge      eth3
 75:  391999686          0          0 2070126072          0          0   PCI-MSI-edge      eth3-TxRx-0
 76:          2          0          0          0          0          0   PCI-MSI-edge      eth4
 77:  392873260          0          0          0 1892277964          0   PCI-MSI-edge      eth4-TxRx-0
 78:          2          0          0          0          0          0   PCI-MSI-edge      eth5
 79:    2235475          0  411133195          0          0 1870334427   PCI-MSI-edge      eth5-TxRx-0
 80:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 81:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 82:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 83:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 84:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 85:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 86:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
 87:          3          0          0          0          0          0   PCI-MSI-edge      ioat-msix
NMI:      60659     279666     238715     205263     245361     246786   Non-maskable interrupts
LOC:  218953634  621549115  517827026  406179310  505235278  511636237   Local timer interrupts
SPU:          0          0          0          0          0          0   Spurious interrupts
PMI:      60659     279666     238715     205263     245361     246786   Performance monitoring interrupts
IWI:          0         11          8          8         11         11   IRQ work interrupts
RES:    1698531     960767     949416    1267093     976241     886675   Rescheduling interrupts
CAL:        397        671        804        735        753        763   Function call interrupts
TLB:     102069     292755     226909     152857     221705     224149   TLB shootdowns
TRM:          0          0          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0          0          0   Machine check exceptions
MCP:       1042       1042       1042       1042       1042       1042   Machine check polls
ERR:          0
MIS:          0

smp_affinity менялся для 71=2, 73=4, 75=8, 77=10, 79=20.

Share this post


Link to post
Share on other sites

Если вручную установить 2,4,8,10,20 - нормально переходят на указанные ядра.

Вопрос: почему этого не происходит автоматически?

ВопросЖ а почему должно происходить автоматически?

irqbalance рулит ядрами в зависимости от нагрузки на них. Причем - может рулить странно. Я корректной его работы как-то не наблюдал, хотя, если честно, и под завязку не были забиты брасы - ушел на ручную балансировку.

Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий); прошлое прерывание обрабатывалось на нем; ядро имеет общий кеш с ядром, на котором в прошлый раз исполнялось прерывание; ядро в NUMA системе имеет доступ к тем же банкам памяти, к которым имело доступ ядро, исполнявшее прерывание в прошлый раз. Где-то такой порядок критериев будет оптимальным с т.з. накладных расходов. От того - не стоит ждать, что прерывания будут сами по себе равномерно скакать по ядрам. Да и ИМХО лучше прибитые жестко/через irqbalance прерывания юзать...

Share this post


Link to post
Share on other sites

Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий);

Вот в этом и вопрос.

Ядро в полку, всё тормозит, но прерывания всё равно не уходят на свободные ядра.

Причем от наличия или отсутствия irqbalance это не зависит.

Share this post


Link to post
Share on other sites

Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий);

Вот в этом и вопрос.

Ядро в полку, всё тормозит, но прерывания всё равно не уходят на свободные ядра.

Причем от наличия или отсутствия irqbalance это не зависит.

 

irqbalance хз для чего писался. Я как то беседовал с девелоперами дров igb/e1000 под linux по почте, они очень удивлялись, зачем я вообще использую irqbalance. Ручками, только ручками. Только хардкор. :)

Share this post


Link to post
Share on other sites

Странно. affinity_hint должен содержать маску всех ядер процессора для сетевых плат, а содержит 0. Что-то в ядре отрабатывает не так, как положено. Проверил несколько брасов на CentOS'ах (6.2, 2.6.32-220.17.1.el6.atlac.43.x86_64) с разными сетевухами (e1000e, igb, bnx2) - везде affinity_hint соответствует маске ядер. irqbalance также работает, раз в минуту стабильно в зависимости от нагрузки раскидывает прерывания по ядрам без каких-либо серьезных нареканий.

 

Какие-нибудь кастомные патчи на ядре есть?

Ну и да - запустите irqbalance --debug руками - надо бы посмотреть, что будет писать в процессе работы (где-то раз в минуту должен отрабатывать).

Edited by Alex/AT

Share this post


Link to post
Share on other sites

irqbalance хз для чего писался. Я как то беседовал с девелоперами дров igb/e1000 под linux по почте, они очень удивлялись, зачем я вообще использую irqbalance. Ручками, только ручками. Только хардкор. :)

Ещё раз - без irqbalance то же самое.

С настройками по умолчанию все прерывания обрабатываются одним ядром, даже если оно занято в полку на 100%, всё тормозит, а остальные ядра простаивают.

 

Ясно, что это неправильно.

Осталось понять, на основании чего ядерный планировщик Линукса так себя ведёт.

 

Во FreeBSD, например, выбирается не первое разрешённое, а наименее загруженное ядро,

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

Share this post


Link to post
Share on other sites

У меня есть несколько NASов с ядром 2.6.32 - установка 0f в аффинити дает автоматическое раскидывание прерываний. При этом тестовый стенд с 3.2.хх такой финт делать разучился :)

Share this post


Link to post
Share on other sites

Домашний тазик с 3.5.1 ведром:

 

# cat /proc/interrupts
          CPU0       CPU1       CPU2       CPU3
 0:        127          0          0          0   IO-APIC-edge      timer
 1:          0          9        174      16791   IO-APIC-edge      i8042
 4:         85        189       6909     850366   IO-APIC-edge      serial
 6:          0          0          0          3   IO-APIC-edge      floppy
 7:          2          0          0          0   IO-APIC-edge      parport0
 8:          0          0          0         13   IO-APIC-edge      rtc0
 9:          0          0          0          0   IO-APIC-fasteoi   acpi
12:          2         10        545      43528   IO-APIC-edge      i8042
14:          4         15       1243     157290   IO-APIC-edge      pata_amd
15:          0          0          0          0   IO-APIC-edge      pata_amd
16:        881       2346     204794   27777175   IO-APIC-fasteoi   ioc0, ath9k, radeon@pci:0000:04:00.0
17:        387       1580     243797   36360335   IO-APIC-fasteoi   eth0
20:          0          0          0          0   IO-APIC-fasteoi   sata_nv
21:          8         10        161      19132   IO-APIC-fasteoi   sata_nv, snd_hda_intel
22:          0          0          1        224   IO-APIC-fasteoi   ehci_hcd:usb1
23:        731       1811     143661   31678903   IO-APIC-fasteoi   sata_nv, ohci_hcd:usb2
43:        135        310      24596    3233915   PCI-MSI-edge      eth1
NMI:        744        717        689       1114   Non-maskable interrupts
LOC:   16682029   19961514   18025946   20328496   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:        744        717        689       1114   Performance monitoring interrupts
IWI:          0          0          0          0   IRQ work interrupts
RTR:          0          0          0          0   APIC ICR read retries
RES:    9846250    6698123    5458286    4777379   Rescheduling interrupts
CAL:        453        458        439        425   Function call interrupts
TLB:     684756     696096     708198     671686   TLB shootdowns
THR:          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:        850        850        850        850   Machine check polls
ERR:          1
MIS:          0
# cat /proc/irq/17/smp_affinity
f
# cat /proc/irq/17/affinity_hint
0

Share this post


Link to post
Share on other sites

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.