Ilya Evseev Posted October 12, 2012 Имеется Debian Squeeze, ядра 2.6.38 и более новые, сетевые карты Intel с драйверами e1000e и igb. По умолчанию все прерывания от всех карт висят на нулевом ядре процессора. Даже если оно занято на 100%, а остальные свободны. При запущенном irqbalance - то же самое. /proc/irq/*/smp_affinity у всех установлено в 0f. Если вручную установить 2,4,8,10,20 - нормально переходят на указанные ядра. Вопрос: почему этого не происходит автоматически? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roma33rus Posted October 12, 2012 попробуйте драйвер собрать с NAPI Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Alex/AT Posted October 12, 2012 /proc/irq/*/affinity_hint что содержит? и еще cat /proc/interrupts неплохо бы Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ilya Evseev Posted October 12, 2012 попробуйте драйвер собрать с 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 # Оно? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ilya Evseev Posted October 12, 2012 /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. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted October 12, 2012 Если вручную установить 2,4,8,10,20 - нормально переходят на указанные ядра. Вопрос: почему этого не происходит автоматически? ВопросЖ а почему должно происходить автоматически? irqbalance рулит ядрами в зависимости от нагрузки на них. Причем - может рулить странно. Я корректной его работы как-то не наблюдал, хотя, если честно, и под завязку не были забиты брасы - ушел на ручную балансировку. Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий); прошлое прерывание обрабатывалось на нем; ядро имеет общий кеш с ядром, на котором в прошлый раз исполнялось прерывание; ядро в NUMA системе имеет доступ к тем же банкам памяти, к которым имело доступ ядро, исполнявшее прерывание в прошлый раз. Где-то такой порядок критериев будет оптимальным с т.з. накладных расходов. От того - не стоит ждать, что прерывания будут сами по себе равномерно скакать по ядрам. Да и ИМХО лучше прибитые жестко/через irqbalance прерывания юзать... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ilya Evseev Posted October 12, 2012 Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий); Вот в этом и вопрос. Ядро в полку, всё тормозит, но прерывания всё равно не уходят на свободные ядра. Причем от наличия или отсутствия irqbalance это не зависит. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
tartila Posted October 12, 2012 Сам же линукс скорее всего направляет прерывание на выбранное планировщиком заданий ядро, по критериям: свободно (нет большой очереди заданий); Вот в этом и вопрос. Ядро в полку, всё тормозит, но прерывания всё равно не уходят на свободные ядра. Причем от наличия или отсутствия irqbalance это не зависит. irqbalance хз для чего писался. Я как то беседовал с девелоперами дров igb/e1000 под linux по почте, они очень удивлялись, зачем я вообще использую irqbalance. Ручками, только ручками. Только хардкор. :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Alex/AT Posted October 12, 2012 (edited) Странно. 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 October 12, 2012 by Alex/AT Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ilya Evseev Posted October 12, 2012 irqbalance хз для чего писался. Я как то беседовал с девелоперами дров igb/e1000 под linux по почте, они очень удивлялись, зачем я вообще использую irqbalance. Ручками, только ручками. Только хардкор. :) Ещё раз - без irqbalance то же самое. С настройками по умолчанию все прерывания обрабатываются одним ядром, даже если оно занято в полку на 100%, всё тормозит, а остальные ядра простаивают. Ясно, что это неправильно. Осталось понять, на основании чего ядерный планировщик Линукса так себя ведёт. Во FreeBSD, например, выбирается не первое разрешённое, а наименее загруженное ядро, поэтому в большинстве случаев нагрузка между ядрами распределяется более-менее равномерно. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
kayot Posted October 12, 2012 У меня есть несколько NASов с ядром 2.6.32 - установка 0f в аффинити дает автоматическое раскидывание прерываний. При этом тестовый стенд с 3.2.хх такой финт делать разучился :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted October 12, 2012 Домашний тазик с 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 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...