2017-08-02 50 views
3

在我的Debian 8系統上,當我運行命令watch -n0.1 --no-title cat /proc/interrupts時,我得到下面的輸出。是否可以更改發生哪些內核定時器中斷?

  CPU0  CPU1  CPU2  CPU3  CPU4  CPU5  CPU6  CPU7                                              [0/1808] 
    0:   46   0   0  10215   0   0   0   0 IO-APIC-edge  timer 
    1:   1   0   0   2   0   0   0   0 IO-APIC-edge  i8042 
    8:   0   0   0   1   0   0   0   0 IO-APIC-edge  rtc0 
    9:   0   0   0   0   0   0   0   0 IO-APIC-fasteoi acpi 
12:   0   0   0   4   0   0   0   0 IO-APIC-edge  i8042 
18:   0   0   0   0   8   0   0   0 IO-APIC-fasteoi i801_smbus 
19:  7337   0   0   0   0   0   0   0 IO-APIC-fasteoi ata_piix, ata_piix 
21:   0   66   0   0   0   0   0   0 IO-APIC-fasteoi ehci_hcd:usb1 
23:   0   0   35   0   0   0   0   0 IO-APIC-fasteoi ehci_hcd:usb2 
40:  208677   0   0   0   0   0   0   0 HPET_MSI-edge  hpet2 
41:   0  4501   0   0   0   0   0   0 HPET_MSI-edge  hpet3 
42:   0   0  2883   0   0   0   0   0 HPET_MSI-edge  hpet4 
43:   0   0   0  1224   0   0   0   0 HPET_MSI-edge  hpet5 
44:   0   0   0   0  1029   0   0   0 HPET_MSI-edge  hpet6 
45:   0   0   0   0   0   0   0   0 PCI-MSI-edge  aerdrv, PCIe PME 
46:   0   0   0   0   0   0   0   0 PCI-MSI-edge  PCIe PME 
47:   0   0   0   0   0   0   0   0 PCI-MSI-edge  PCIe PME 
48:   0   0   0   0   0   0   0   0 PCI-MSI-edge  PCIe PME 
49:   0   0   0   0   0  8570   0   0 PCI-MSI-edge  eth0-rx-0 
50:   0   0   0   0   0   0  1684   0 PCI-MSI-edge  eth0-tx-0 
51:   0   0   0   0   0   0   0   2 PCI-MSI-edge  eth0 
NMI:   8   2   2   2   1   2   1   49 Non-maskable interrupts 
LOC:   36   31   29   26   21  7611  886  1390 Local timer interrupts 
SPU:   0   0   0   0   0   0   0   0 Spurious interrupts 
PMI:   8   2   2   2   1   2   1   49 Performance monitoring interrupts 
IWI:   0   0   0   1   1   0   1   0 IRQ work interrupts 
RTR:   7   0   0   0   0   0   0   0 APIC ICR read retries 
RES:  473  1027  1530  739  1532  3567  1529  1811 Rescheduling interrupts 
CAL:  846  1012  1122  1047  984  1008  1064  1145 Function call interrupts 
TLB:   2   7   5   3   12   15   10   6 TLB shootdowns 
TRM:   0   0   0   0   0   0   0   0 Thermal event interrupts 
THR:   0   0   0   0   0   0   0   0 Threshold APIC interrupts 
MCE:   0   0   0   0   0   0   0   0 Machine check exceptions 
MCP:   4   4   4   4   4   4   4   4 Machine check polls 
THR:   0   0   0   0   0   0   0   0 Hypervisor callback interrupts 
ERR:   0 
MIS:   0 

觀察到定時器中斷主要在CPU3上觸發。

是否可以將定時器中斷移到CPU0?

+0

爲什麼你想要這樣做? – tangrs

+0

減少對核心3的干擾。 – merlin2011

+0

這聽起來像是[X-Y問題](http://xyproblem.info/)。你真的想達到什麼目的? – tangrs

回答

4

概念的名稱是IRQ SMP affinity

有可能通過設置/proc/irq/<IRQ_NUMBER>/smp_affinity親和力掩碼或/proc/irq/<IRQ_NUMBER>/smp_affinity_list密切關係列表中設置的IRQ的smp_affinity
親和掩碼是一個位字段,其中每個位代表一個核心,允許IRQ在對應於設置的位的核心上服務。

作爲根應該銷執行IRQ0到CPU0命令

echo 1 > /proc/irq/0/smp_affinity 


條件是強制性的,因爲設置IRQ的親緣性受制於一系列先決條件,該列表包括:支持重定向表的中斷控制器(如IO-APIC),親和性掩碼必須至少包含一個活動CPU, IRQ親和力must not be managed by the kernel和該功能必須啓用。

在我的虛擬化Debian 8系統中,我無法設置IRQ0的關聯性,因爲出現錯誤而導致失敗。
我也無法追查確切的原因。
如果你願意潛入Linux源代碼,你可以從write_irq_affinity in proc.c

相關問題