Linux绑定硬件IRQ到指定CPU核

在现在的多核处理器里,Linux下默认是将硬件IRQ分配到所有的CPU核心上,会优先使用第0核(即CPU0),那么我们要如何手动指定到某个或某几个核心上呢?这涉及到SMP IRQ Affinity

首先,我们可以通过如下命令cat /proc/interrupts来获取当前IRQ对应CPU核心的情况,我的电脑有如下返回值:

CPU0      CPU1      CPU2      CPU3      CPU4      CPU5      CPU6      CPU7
0:        17          0          0          0          0          0          0          0  IR-IO-APIC-edge      timer
1:          2          0          0          0          0          0          0          0  IR-IO-APIC-edge      i8042
7:          0          0          0          0          0          0          0          0  IR-IO-APIC-edge      parport0
8:          0          0          0          0          0          1          0          0  IR-IO-APIC-edge      rtc0
9:          0          0          0          0          0          0          0          0  IR-IO-APIC-fasteoi  acpi
12:          3          0          0          0          0          0          1          0  IR-IO-APIC-edge      i8042
16:        32          0          0          0          1          0          0          0  IR-IO-APIC-fasteoi  ehci_hcd:usb1
19:    7272446        193        135        74      1130        157        106        278  IR-IO-APIC-fasteoi  ata_piix, ata_piix
23:        32          0          0          0          1          0          0          0  IR-IO-APIC-fasteoi  ehci_hcd:usb2
40:          0          0          0          0          0          0          0          0  DMAR_MSI-edge      dmar0
41:          0          0          0          0          0          0          0          0  DMAR_MSI-edge      dmar1
42:          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      xhci_hcd
43:        614          9          1          1  18283973        19        10        12  IR-PCI-MSI-edge      eth0
44:          3        127          0          0        18        154          2        51  IR-PCI-MSI-edge      snd_hda_intel
45:        42          1          0          0          0          0          0          0  IR-PCI-MSI-edge      i915

NMI:      1075        823        812        812        774        816        804        802  Non-maskable interrupts
LOC:  14225495  10987071  12518753  12499043    4462117    3599360    3668949    3712199  Local timer interrupts
SPU:          0          0          0          0          0          0          0          0  Spurious interrupts
PMI:      1075        823        812        812        774        816        804        802  Performance monitoring interrupts
IWI:    668959    243175    173864    217368    333949    236190    164444    203926  IRQ work interrupts
RTR:          0          0          0          0          0          0          0          0  APIC ICR read retries
RES:    4325328    5435860    4978567    5009075    4562785    4288325    4511659    4408518  Rescheduling interrupts
CAL:      1766      5366      1609        985        608        327        290        282  Function call interrupts
TLB:    615205    531403    532879    503306    486281    510158    501906    511339  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:      4841      4841      4841      4841      4841      4841      4841      4841  Machine check polls
ERR:          0
MIS:          0

假如我们想修改RTC对应的响应处理器核心,那么我们可以先通过命令cat /proc/irq/8/smp_affinity来获得如下返回值(其中8为RTC对应的中断号,在上面的返回值第一列可以看到):

ff

那么表示8个核心都会被用到,而其对应关系为:

                     Binary          Hex
CPU0                  0000 0001        1
CPU1                  0000 0010        2
CPU2                  0000 0100        4
CPU3                  0000 1000        8
CPU4                  0001 0000      10
CPU5                  0010 0000      20
CPU6                  0100 0000      40
CPU7                  1000 0000      80

看出来了吧,将上面的值相加,就是16进制FF。

那么我们要设置IRQ到指定的CPU上面,可以使用如下命令:

echo "2" > /proc/irq/8/smp_affinity

上述命令将RTC的中断指定到CPU1核心上处理,也可以指定多个核心,如下:

echo "6" > /proc/irq/8/smp_affinity

将RTC中断指定到CPU1CPU2这两个核心上处理。

相关推荐

  1. Linux硬件IRQ指定CPU

    2024-07-20 13:38:04       16 阅读
  2. Linux硬件中断(IRQ)的基础知识

    2024-07-20 13:38:04       17 阅读
  3. Apache指定地址与端口

    2024-07-20 13:38:04       48 阅读
  4. linux irq

    2024-07-20 13:38:04       25 阅读
  5. linux】如何查看CPU

    2024-07-20 13:38:04       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 13:38:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 13:38:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 13:38:04       45 阅读
  4. Python语言-面向对象

    2024-07-20 13:38:04       55 阅读

热门阅读

  1. 使用内网穿透工具 frp 发布内网 web 站点

    2024-07-20 13:38:04       21 阅读
  2. 【WebRTC】Duplex通信是什么意思?

    2024-07-20 13:38:04       21 阅读
  3. TCP Socket编程示例

    2024-07-20 13:38:04       18 阅读
  4. windows上安装Apache

    2024-07-20 13:38:04       17 阅读
  5. 信息查询_社工

    2024-07-20 13:38:04       16 阅读
  6. Clickhouse 物化视图-optimize无效

    2024-07-20 13:38:04       14 阅读
  7. 07.16_111期_linux_网络通信

    2024-07-20 13:38:04       15 阅读
  8. 我为什么要使用Vim编辑器?

    2024-07-20 13:38:04       15 阅读
  9. 微服务概念篇-服务提供者/服务消费者

    2024-07-20 13:38:04       12 阅读
  10. 后端配置了相关字段后的前端跨域处理

    2024-07-20 13:38:04       15 阅读