如何设置SMP IRQ Affinity-myownstars-ITPUB博客

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设置SMP IRQ Affinity-myownstars-ITPUB博客相关的知识,希望对你有一定的参考价值。

参考技术A 设置SMP affinity
每个硬件设备的中断设置信息保存于/proc/irq,其中每个数字代表一个硬件的IRQ
[oracle@ irq]$ pwd
/proc/irq
[oracle@ irq]$ ls
0 10 12 14 17 20 23 4 5 62 67 69 70 72 74 76 78 8 81 83 85 87 89 90 default_smp_affinity
1 11 13 15 2 22 3 48 6 66 68 7 71 73 75 77 79 80 82 84 86 88 9 91
可通过/proc/interrupts查看每个CPU的中断处理情况
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
65: 20041 0 0 0 IR-PCI-MSI-edge eth0-tx-0
66: 20232 0 0 0 IR-PCI-MSI-edge eth0-tx-1
67: 20105 0 0 0 IR-PCI-MSI-edge eth0-tx-2
68: 20423 0 0 0 IR-PCI-MSI-edge eth0-tx-3
69: 21036 0 0 0 IR-PCI-MSI-edge eth0-rx-0
70: 20201 0 0 0 IR-PCI-MSI-edge eth0-rx-1
71: 20587 0 0 0 IR-PCI-MSI-edge eth0-rx-2
72: 20853 0 0 0 IR-PCI-MSI-edge eth0-rx-3

首先确认其当前设置
# cat /proc/irq/65/smp_affinity
00000001
-- 每位代表代表4个CPU,其和CPU映射方式如下
Binary Hex
CPU 0 0001 1
CPU 1 0010 2
CPU 2 0100 4
CPU 3 1000 8
-----------------------
all 1111 f

修改其smp_affinity
如果开启了irqbalance则需要先将其停止,可将一个设备绑定到多个CPU上
echo 000002 > /proc/irq/65/smp_affinity # eth0-tx-0
--将eth0绑定到CPU1
echo 000006 > /proc/irq/65/smp_affinity # eth0-tx-0
--将eth0绑定到CPU1/CPU2

查看IRQ性能
可通过/proc/interrupts查看每个CPU的中断信息;

Mpstat输出列包括%irq,而intr/s表示每秒处理的中断数
[oracle@ irq]$ mpstat -P ALL 10
Linux 2.6.32-100.26.2.el5 (.usuwb.astrazeneca.net) 01/31/2013
01:47:50 AM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
01:48:00 AM all 1.11 0.00 0.67 0.05 0.00 0.07 0.00 98.10 8696.01
01:48:00 AM 0 0.30 0.00 0.20 0.20 0.00 0.00 0.00 99.30 0.00
01:48:00 AM 1 1.79 0.00 0.99 0.10 0.00 0.00 0.00 97.12 0.10
01:48:00 AM 2 1.10 0.00 1.99 0.00 0.00 0.00 0.00 96.91 0.50
01:48:00 AM 3 1.30 0.00 0.70 0.00 0.00 0.10 0.00 97.90 0.00
01:48:00 AM 4 0.20 0.00 0.10 0.00 0.00 0.00 0.00 99.70 0.00

Vmstat中的in代表中断
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 140 2915476 341288 3951700 0 0 0 0 1057 523 19 81 0 0 0
4 0 140 2915724 341296 3951700 0 0 0 0 1048 546 19 81 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1044 514 18 82 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 24 1044 564 20 80 0 0 0
4 0 140 2915848 341296 3951700 0 0 0 0 1060 546 18 82 0 0 0
从上面的数据可以看出几点:
interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;
system time(sy)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU(不断请求资源);
run queue(r)刚好在4个。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
从上面的数据可以看出几点:
context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;
进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);
run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

以上是关于如何设置SMP IRQ Affinity-myownstars-ITPUB博客的主要内容,如果未能解决你的问题,请参考以下文章

linux 中断

网卡的中断号通过/proc/irq查不到

BIOS串口3F8跟2E8是啥? 如何设置正确?

如何更改 Erlang makefile 以启用 SMP 模式?

从 C/C++ 设置进程优先级和 irq 进程的亲和性

网卡中断负载篇~