Bagaimana cara melarang interupsi perangkat keras dengan IRQBALANCE_BANNED_CPUS di Ubuntu?

9

Saya ingin melarang interupsi dari CPU tertentu. Saya mendengar tentang opsi IRQBALANCE_BANNED_CPUS. Saya melihat irqbalance berjalan di latar belakang mesin saya. Di mana saya pergi untuk mengedit dan bagaimana cara mengkonfigurasi opsi itu? Misalnya, saya ingin mengecualikan CPU 2,3,4,5 dari interupsi. Deskriptor argumen adalah:

Menyediakan topeng cpus yang harus diabaikan oleh irqbalance dan tidak pernah memberikan interupsi

Apa yang dimaksud dengan topeng? Dan di mana saya mengkonfigurasi irqbalance dengan opsi itu?

EDIT1: Bagaimana cara mengetahui bahwa konfigurasi saya berlaku, dengan kata lain bahwa CPU saya menerima NO interupsi? Saya memeriksa / proc / menyela tetapi beberapa angka meningkat di sana.

EDIT2: Sekarang saya mem-boot mesin saya dengan IRQBALANCE_BANNED_CPUS = 3e jadi hanya CPU 0 yang TIDAK DILARANG dari gangguan. Jadi saya harus berharap untuk melihat CPU menerima banyak interupsi dan CPU lainnya tidak menerima interupsi, kan? Inilah saya / proc / interupsi. Garis dalam huruf tebal berubah untuk SEMUA CPU. Baris 22, 24, 35 dan LOC berubah.

            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       
   0:         26          0          0          0          0          0   IO-APIC-edge      timer
   1:          2          0          0          0          0          0   IO-APIC-edge      i8042
   6:          3          0          0          0          0          0   IO-APIC-edge      floppy
   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
  14:      13556          0          0          0          0          0   IO-APIC-edge      ata_piix
  15:          0          0          0          0          0          0   IO-APIC-edge      ata_piix
  18:          0          0          0          0          0          0   IO-APIC-fasteoi   ata_piix
  19:          2          0          0          0          0          0   IO-APIC-fasteoi   ohci1394
  20:          3          0          0          0          0          0   IO-APIC-fasteoi   ehci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb6
  21:        197        635         39          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb4, uhci_hcd:usb7, HDA Intel
  22:        344       3506          0        702          0          0   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb5, uhci_hcd:usb8
  24:        162         48          0          0          0          0   IO-APIC-fasteoi   nvidia
  35:        174          0         47          0          0          0   IO-APIC-fasteoi   nvidia
  53:       3517          0          0          0          0          0   PCI-MSI-edge      eth0
 NMI:          0          0          0          0          0          0   Non-maskable interrupts
 LOC:      11007       8840       6480       5652       4272       3046   Local timer interrupts
 SPU:          0          0          0          0          0          0   Spurious interrupts
 PMI:          0          0          0          0          0          0   Performance monitoring interrupts
 PND:          0          0          0          0          0          0   Performance pending work
 RES:        292        169        217        125        122        126   Rescheduling interrupts
 CAL:         86        280        254        292        293        291   Function call interrupts
 TLB:       1147       1031       1348        616        177        322   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:          2          2          2          2          2          2   Machine check polls
 ERR:          5
 MIS:          0

EDIT3: Sepertinya opsi IRQBALANCE_BANNED_CPUS sepenuhnya di-IGNORED di Ubuntu . Saya mencoba me-reboot mesin saya dengan 1, 3e dan mendapat gangguan di seluruh. Tepat ketika saya menonaktifkan irqbalance dengan menetapkan ENABLED = 0 sehingga saya mendapatkan clean / proc / interupsi hanya pada cpu0 dan tidak ada cpu lainnya.

TraderJoeChicago
sumber

Jawaban:

7

Anda menetapkan IRQBALANCE_BANNED_CPUS di / etc / default / irqbalance . Saya menemukan ini dengan mencari di /etc/init.d/irqbalance . Tetapi apa nilai yang valid untuk pengaturan itu? Dari halaman manual Red Hat:

Ini adalah hex mask tanpa awalan '0x', pada sistem dengan sejumlah besar prosesor, masing-masing kelompok yang terdiri dari delapan digit hex dipisahkan dengan koma ','. yaitu export IRQBALANCE_BANNED_CPUS=fc0akan mencegah irqbalance dari menetapkan irqs ke cpus 7-12 (cpu6-cpu11) atau export IRQBALANCE_BANNED_CPUS=ff000000,00000001akan mencegah irqbalance dari menetapkan irqs ke cpus 1 (cpu0) dan 57th-64th (cpu56-cpu63).

The Konsep topeng dijelaskan di wikipedia. Baca itu, lalu kembali. Mari kita hancurkan contoh pertama Red Hat. Angka yang dituliskan sebagai fc0 dalam heksadesimal ditulis sebagai 111111000000 dalam biner. Memindai dari kanan ke kiri (yaitu dari bit paling signifikan ke bit paling signifikan ), ada enam nol. Ini berarti CPU ke-1-ke-5 (cpu0-cpu5) dapat diberikan interupsi. Lalu, ada enam yang. Ini berarti bahwa CPU ke-7 hingga ke-12 (cpu6-cpu11) tidak akan diberikan interupsi.

Kedengarannya Anda ingin mengizinkan cpu0 dan cpu1 menerima interupsi tetapi mencegah cpu2, cpu3, ​​cpu4, dan cpu5 ditugaskan interupsi. Itu berarti Anda memerlukan dua nol dan empat, atau 111100. Ini adalah 3C dalam heksadesimal. Jadi, Anda akan membuat / etc / default / irqbalance dengan isinya

ENABLED="1"
ONESHOT="0"
IRQBALANCE_BANNED_CPUS="3f"

Untuk melihat apa yang sedang terjadi, coba

$ sudo service irqbalance stop
Stopping SMP IRQ Balancer: irqbalance.
$ source /etc/default/irqbalance 
$ sudo irqbalance --debug
sciurus
sumber
Terima kasih untuk penjelasannya. Kebingungan di sini adalah: Untuk BAN CPU 0 pada mesin 6-cpu. Apakah saya menggunakan: 000001 (1) atau 111110 (3e). Ini yang pertama, bukan?
TraderJoeChicago
Silakan periksa edit saya di pertanyaan awal. Saya perlu tahu cara membaca / proc / interupsi untuk memastikan konfigurasi saya berfungsi dan CPU saya diblokir dari interupsi. Terima kasih!
TraderJoeChicago
Lihat edit saya nomor 3: IRQBALANCE_BANNED_CPUS sedang disimpan di Ubuntu, kecuali jika kita mengacaukan topeng. Tetapi saya mencoba 1 dan 3e tanpa hasil. :(
TraderJoeChicago
Lihat hasil edit debug saya.
sciurus
2
NGGAK. Saya dapat mengonfirmasi itu TIDAK berfungsi di Ubuntu 10.04.1. Opsi konfigurasi ini IRQBALANCE_BANNED_CPUS = "1" diabaikan.
TraderJoeChicago
0

Anda harus menggunakan 3c sesuai di atas untuk membuatnya berfungsi. Versi yang lebih baru melakukan ini secara otomatis (setidaknya dengan v 1.9 pada debian / sid)

segera
sumber
0

Menambah saran di atas tentang pemecahan masalah masalah irqbalance - Perintah yang berguna untuk melihat afinitas interupsi yang dihasilkan dari proses irqbalance:

find /proc/irq/ -name smp_affinity | xargs cat | less
YitzikC
sumber