软中断过高问题如何解决
来源:互联网 发布:淘宝联盟购物车 编辑:程序博客网 时间:2024/06/10 12:59
原文:http://os.51cto.com/art/201310/414482.htm
前些天发现XEN虚拟机上的Nginx服务器存在一个问题:软中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。
在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分软中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿:
shell> topCpu0: 11.3%us, 4.7%sy, 0.0%ni, 82.5%id, ... 0.8%si, 0.8%stCpu1: 21.3%us, 7.4%sy, 0.0%ni, 51.5%id, ... 17.8%si, 2.0%stCpu2: 16.6%us, 4.5%sy, 0.0%ni, 77.7%id, ... 0.8%si, 0.4%stCpu3: 15.9%us, 3.6%sy, 0.0%ni, 79.3%id, ... 0.8%si, 0.4%stCpu4: 17.7%us, 4.9%sy, 0.0%ni, 75.3%id, ... 1.2%si, 0.8%stCpu5: 23.6%us, 6.6%sy, 0.0%ni, 68.1%id, ... 0.9%si, 0.9%stCpu6: 18.1%us, 4.9%sy, 0.0%ni, 75.7%id, ... 0.4%si, 0.8%stCpu7: 21.1%us, 5.8%sy, 0.0%ni, 71.4%id, ... 1.2%si, 0.4%st
查询一下软中断相关数据,发现主要集中在 NET_RX 上,猜测是网卡问题:
shell> watch -d -n 1 'cat /proc/softirqs' CPU0 CPU1 CPU2 ... CPU7 HI: 0 0 0 ... 0 TIMER: 3692566284 3692960089 3692546970 ... 3693032995 NET_TX: 130800410 652649368 154773818 ... 308945843 NET_RX: 443627492 3802219918 792341500 ... 2546517156 BLOCK: 0 0 0 ... 0BLOCK_IOPOLL: 0 0 0 ... 0 TASKLET: 0 0 0 ... 0 SCHED: 1518716295 335629521 1520873304 ... 1444792018 HRTIMER: 160 1351 131 ... 196 RCU: 4201292019 3982761151 4184401659 ... 4039269755
补充:有一个查看中断(Interrupt)的top风格小工具 itop ,推荐试试。
确认一下宿主机上的网卡信息,发现其运行在单队列模式下:
shell> grep -A 10 -i network /var/log/dmesgInitalizing network drop monitor serviceIntel(R) Gigabit Ethernet Network Driver - version 3.0.19igb 0000:05:00.0: Intel(R) Gigabit Ethernet Network Connectionigb 0000:05:00.0: eth0: (PCIe:2.5GT/s:Width x4) 00:1b:21:bf:b3:2cigb 0000:05:00.0: eth0: PBA No: G18758-002igb 0000:05:00.0: Using MSI-X ... 1 rx queue(s), 1 tx queue(s)igb 0000:05:00.1: Intel(R) Gigabit Ethernet Network Connectionigb 0000:05:00.1: eth1: (PCIe:2.5GT/s:Width x4) 00:1b:21:bf:b3:2digb 0000:05:00.1: eth1: PBA No: G18758-002igb 0000:05:00.1: Using MSI-X ... 1 rx queue(s), 1 tx queue(s)
接着确认一下网卡的中断号,因为是单队列,所以只有一个中断号 45:
shell> grep eth /proc/interrupts | awk '{print $1, $NF}'45: eth0
知道了网卡的中断号,就可以查询其中断亲缘性配置「smp_affinity」:
shell> cat /proc/irq/45/smp_affinity02
这里的 02 实际上是十六进制,表示 1 号CPU,计算方法如下(参考资料):
Binary Hex CPU 0 0001 1 CPU 1 0010 2 CPU 2 0100 4+ CPU 3 1000 8 ----------------------- both 1111 f
说明:如果 4 个CPU都参与中断处理,那么设为 f;同理 8 个CPU的就设置成 ff:
shell> echo ff > /proc/irq/45/smp_affinity
此外还有一个类似的配置「smp_affinity_list」:
shell> cat /proc/irq/45/smp_affinity_list1
两个配置是相通的,修改了一个,另一个会跟着变。不过「smp_affinity_list」使用的是十进制,相比较「smp_affinity」的十六进制,可读性更好些。
了解了这些基本知识,我们可以尝试换一个CPU试试看会发生什么:
echo 0 > /proc/irq/45/smp_affinity_list
再通过「top」命令观察,会发现处理软中断的CPU变成了 0 号CPU。
说明:如果希望多个CPU参与中断处理的话,可以使用类似下面的语法:
echo 3,5 > /proc/irq/45/smp_affinity_listecho 0-7 > /proc/irq/45/smp_affinity_list
坏消息是对单队列网卡而言,「smp_affinity」和「smp_affinity_list」配置多CPU无效。
好消息是Linux支持RPS,通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能。
首先看看如何配置RPS,如果CPU个数是 8 个的话,可以设置成 ff:
shell> echo ff > /sys/class/net/eth0/queues/rx-0/rps_cpus
接着配置内核参数rps_sock_flow_entries(官方文档推荐设置: 32768):
shell> sysctl net.core.rps_sock_flow_entries=32768
最后配置rps_flow_cnt,单队列网卡的话设置成rps_sock_flow_entries即可:
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
说明:如果是多队列网卡,那么就按照队列数量设置成 rps_sock_flow_entries / N 。
做了如上的优化后,我们再运行「top」命令可以看到软中断已经分散到了两个CPU:
shell> topCpu0: 24.8%us, 9.7%sy, 0.0%ni, 52.2%id, ... 11.5%si, 1.8%stCpu1: 8.8%us, 5.1%sy, 0.0%ni, 76.5%id, ... 7.4%si, 2.2%stCpu2: 17.6%us, 5.1%sy, 0.0%ni, 75.7%id, ... 0.7%si, 0.7%stCpu3: 11.9%us, 7.0%sy, 0.0%ni, 80.4%id, ... 0.7%si, 0.0%stCpu4: 15.4%us, 6.6%sy, 0.0%ni, 75.7%id, ... 1.5%si, 0.7%stCpu5: 20.6%us, 6.9%sy, 0.0%ni, 70.2%id, ... 1.5%si, 0.8%stCpu6: 12.9%us, 5.7%sy, 0.0%ni, 80.0%id, ... 0.7%si, 0.7%stCpu7: 15.9%us, 5.1%sy, 0.0%ni, 77.5%id, ... 0.7%si, 0.7%st
疑问:理论上讲,我已经设置了RPS为ff,应该所有 8 个CPU一起分担软中断才对,可实际结果只有两个,有知道原因的请赐教,但是不管怎么说,两个总好过一个。
此外,因为这是一台Nginx服务器,所以通过「worker_cpu_affinity」指令可以配置Nginx使用哪些CPU,如此一来我们便可以绕开高负载的CPU,对性能会有一些帮助。
补充:如果服务器是NUMA架构的话,那么「numactl –cpubind」可能也会有用。
最后,推荐看看香草总结的一些关于软中断方面的资料和工具,很全面。
- 软中断过高问题如何解决
- Nginx服务器上软中断过高问题如何解决?
- 网卡软中断过高问题优化总结
- 如何解决CPU使用率过高问题
- 互联网创业公司如何解决人员流失率过高的问题
- 如何解决服务器CPU使用率过高的问题<一>
- 如何解决服务器CPU使用率过高的问题<二>
- 如何解决服务器CPU使用率过高的问题
- 互联网创业公司如何解决人员流失率过高的问题?
- 如何解决产品游记撰写门槛过高问题
- IBM服务器自动关机的问题, 好像是cpu温度过高的问题, 该如何解决?
- 解决CPU占用率过高的问题
- 解决cpu占用率过高的问题
- 解决CompMgmtLauncher.exe CPU占用过高问题
- cpu load过高问题分析和解决
- 解决安卓CPU使用率过高问题
- cpu load过高问题分析和解决
- java进程CPU过高问题如何排查?
- 信号量与条件变量的区别
- java判断字符串是否相等
- Apache POI 操作Excel文件
- 湘潭市赛 Josephus Problem 线段树
- win7系统64位安装打印机的方法
- 软中断过高问题如何解决
- 我开通了博客
- Java基础知识(数据类型、标识符、变量、运算符和流程控制语句)
- 刷清橙OJ--A1064.排名计算
- 图像坐标系中对象的平移旋转等运动为什么要放在齐次坐标下描述
- 学习互联网架构第五课(多线程通信---wait和notify)
- 第一章 Shiro简介——跟我学习springmvc shiro mybatis
- 手机检测,扫描动画
- java数据结构之ArrayList