第 2 章 调优 IRQ 平衡
在多核主机上,您可以通过确保 Red Hat Enterprise Linux 平衡中断队列(IRQ)来在 CPU 核之间分发中断来提高性能。
2.1. 中断和中断处理程序
当网络接口控制器(NIC)接收传入数据时,它会使用直接内存访问(DMA)将数据复制到内核缓冲区中。然后,NIC 通过触发一个硬中断来向内核通知此数据。这些中断是由中断处理程序处理的,这些处理程序只做最少的工作,因为它们已中断了另一个任务,处理程序不能中断自己。硬中断在 CPU 使用率方面可能代价高昂,特别是在使用内核锁时。
然后,硬中断处理器将大多数接收的数据包留给软件中断请求(SoftIRQ)进程。内核可以更公平地调度这些进程。
例 2.1. 显示硬件中断
内核将中断计数存储在 /proc/interrupts
文件中。要显示特定 NIC 的计数,如 enp1s0
,请输入:
grep -E "CPU|enp1s0" /proc/interrupts
# grep -E "CPU|enp1s0" /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5
105: 141606 0 0 0 0 0 IR-PCI-MSI-edge enp1s0-rx-0
106: 0 141091 0 0 0 0 IR-PCI-MSI-edge enp1s0-rx-1
107: 2 0 163785 0 0 0 IR-PCI-MSI-edge enp1s0-rx-2
108: 3 0 0 194370 0 0 IR-PCI-MSI-edge enp1s0-rx-3
109: 0 0 0 0 0 0 IR-PCI-MSI-edge enp1s0-tx
每个队列在分配给它的第一列中有一个中断向量。当系统引导时,或者用户载入 NIC 驱动程序模块时,内核会初始化这些向量。会给每个接收(RX
)和传输(TX
)队列分配一个唯一的向量,其告知中断处理程序中断来自哪个 NIC 或队列。列代表每个 CPU 核的传入中断数。