将网卡中断分布到多个cpu上的方法

Linux下默认的一个网卡的中断操作只是有一个cpu来处理,目前多数主机都是多核cpu,在网络io操作比较多的服务器上,io操作往往成为瓶颈。

最直观的体现就是,当网络操作较多时,应用程序的cpu飙升到100%,但是再查看每个cpu的负载情况,会发现压力都被集中到了某个cpu上,其他的cpu都还是空的,例如:

将网卡中断分布到多个cpu上的方法_第1张图片

图1

出现上述情况时就应考虑是不是由于io太多的原因了,这里的Mosquitto是网络程序,所以基本就是网络io引起的;

此时再查看系统的中断情况,可以看到网卡产生了大量的中断,而且所有的中断都被分到一个cpu上,使用命令:

cat /proc/interrupts

例如:

将网卡中断分布到多个cpu上的方法_第2张图片

图2

这里的p2p1就是当前的网卡设备,如下图可以看出:

将网卡中断分布到多个cpu上的方法_第3张图片

图3

查看中断的cpu分配情况:

使用命令:cat /proc/irq/45/smp_affinity

这里的45就是图2中网卡设备p2p1对应的中断代号;其输出结果用二进制的位来表示当前的中断由那个cpu来处理,例如:如果0000 0001表示第0个cpu来处理,那么0000 0010就表示第1个cpu来处理。例如:

图4

这里的8就是0x0000 1000即第三个cpu来处理中断,因此也就是图2中大量的网络中断被分配到了第三个cpu;同样,0x 0000 0011就表示由第0个和第1个cpu来处理;

修改中断代号:

echo "f">/proc/irq/45/smp_affinity

如下图所示:

将网卡中断分布到多个cpu上的方法_第4张图片

 

 

你可能感兴趣的:(计算机网络,linux,c/c++,计算机网络)