MYSQL数据库网卡软中断不平衡问题及解决方案
但是在最近压测试的一个数据库中,mpstat发现其中一个核的CPU被软中断耗尽:
Mysql QPS 2W左右
――- ―-load-avg―- ―cpu-usage― ―swap― -QPS- -TPS- -Hit%-
time | 1m 5m 15m |usr sys idl iow| si so| ins upd del sel iud| lor hit|
13:43:46| 0.00 0.00 0.00| 67 27 3 3| 0 0| 0 0 0 0 0| 0 100.00|
13:43:47| 0.00 0.00 0.00| 30 10 60 0| 0 0| 0 0 0 19281 0| 326839 100.00|
13:43:48| 0.00 0.00 0.00| 28 10 63 0| 0 0| 0 0 0 19083 0| 323377 100.00|
13:43:49| 0.00 0.00 0.00| 28 10 63 0| 0 0| 0 0 0 19482 0| 330185 100.00|
13:43:50| 0.00 0.00 0.00| 26 9 65 0| 0 0| 0 0 0 19379 0| 328575 100.00|
13:43:51| 0.00 0.00 0.00| 27 9 64 0| 0 0| 0 0 0 19723 0| 334378 100.00|
mpstat -P ALL 1说:
针对这个问题,我们利用工具,特别是systemtap, 一步步来调查和解决问题。
首先我们来确认下网卡的设置:
$uname -r 2.6.32-131.21.1.tb399.el6.x86_64 $ lspci -vvvv 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) Subsystem: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-SERR- 01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) Subsystem: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- $cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: em1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: em1 MII Status: up Link Failure Count: 0 Permanent HW addr: 78:2b:cb:1f:eb:c9 Slave queue ID: 0 Slave Interface: em2 MII Status: up Link Failure Count: 0 Permanent HW addr: 78:2b:cb:1f:eb:ca Slave queue ID: 0
从上面的信息我们可以确认二块 Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20)网卡在做bonding。
我们的系统内核组维护的是RHEL 6.1, 很容易可以从/proc/interrupts和/proc/softirqs得到中断和软中断的信息的信息。
我们特别留意下softirq, 由于CPU太多,信息太乱,我只列出7个核心的情况:
$cat /proc/softirqs|tr -s \' \' \'\\t\'|cut -f 1-8 CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 HI: 0 0 0 0 0 0 TIMER: 401626149 366513734 274660062 286091775 252287943 258932438 NET_TX: 136905 10428 17269 25080 16613 17876 NET_RX: 1898437808 2857018450 580117978 26443 11820 15545 BLOCK: 716495491 805780859 113853932 132589667 106297189 104629321 BLOCK_IOPOLL: 0 0 0 0 0 0 0 TASKLET: 190643874 775861235 0 0 1 0 SCHED: 61726009 66994763 102590355 83277433 144588168 154635009 HRTIMER: 1883420 1837160 2316722 2369920 1721755 1666867 RCU: 391610041 365150626 275741153 287074106 253401636 260389306
从上面我们粗粗可以看出网卡的软中断接收和发送都不平衡。
单单这些信息还不够,我们用用stap来double check下:
$cat i.stp global hard, soft, wq probe irq_handler.entry { hard[irq, dev_name]++; } probe timer.s(1) { println("==irq number:dev_name") foreach( [irq, dev_name] in hard- limit 5) { printf("%d,%s->%d\\n", irq, kernel_string(dev_name), hard[irq, dev_name]); } println("==softirq cpu:h:vec:action") foreach( 1 in soft- limit 5) { printf("%d:%x:%x:%s->%d\\n", c, h, vec, symdata(action), soft1); } println("==workqueue wq_thread:work_func") foreach( [wq_thread,work_func] in wq- limit 5) { printf("%x:%x->%d\\n", wq_thread, work_func, wq[wq_thread, work_func]); } println("\\n") delete hard delete soft delete wq } probe softirq.entry { soft[cpu(), h,vec,action]++; } probe workqueue.execute { wq[wq_thread, work_func]++ } probe begin { println("~") } $sudo stap i.stp $==irq number:dev_name 73,em1-6->7150 50,iodrive-fct0->7015 71,em1-4->6985 74,em1-7->6680 69,em1-2->6557 ==softirq cpu:h:vec:action 1:ffffffff81a23098:ffffffff81a23080:0xffffffff81411110->36627 1:ffffffff81a230b0:ffffffff81a23080:0xffffffff8106f950->2169 1:ffffffff81a230a0:ffffffff81a23080:0xffffffff81237100->1736 0:ffffffff81a230a0:ffffffff81a23080:0xffffffff81237100->1308 1:ffffffff81a23088:ffffffff81a23080:0xffffffff81079ee0->941 ==workqueue wq_thread:work_func ffff880c14268a80:ffffffffa026b390->51 ffff880c1422e0c0:ffffffffa026b390->30 ffff880c1425f580:ffffffffa026b390->25 ffff880c1422f540:ffffffffa026b390->24 ffff880c14268040:ffffffffa026b390->23 #上面软中断的action的符号信息: $addr2line -e /usr/lib/debug/lib/modules/2.6.32-131.21.1.tb411.el6.x86_64/vmlinux ffffffff81411110 /home/ads/build22_6u0_x64/workspace/kernel-el6/origin/taobao-kernel-build/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.x86_64/net/core/ethtool.c:653 $addr2line -e /usr/lib/debug/lib/modules/2.6.32-131.21.1.tb411.el6.x86_64/vmlinux ffffffff810dc3a0 /home/ads/build22_6u0_x64/workspace/kernel-el6/origin/taobao-kernel-build/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.x86_64/kernel/relay.c:466 $addr2line -e /usr/lib/debug/lib/modules/2.6.32-131.21.1.tb411.el6.x86_64/vmlinux ffffffff81079ee0 /home/ads/build22_6u0_x64/workspace/kernel-el6/origin/taobao-kernel-build/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.x86_64/include/trace/events/timer.h:118 $addr2line -e /usr/lib/debug/lib/modules/2.6.32-131.21.1.tb411.el6.x86_64/vmlinux ffffffff8105d120 /home/ads/build22_6u0_x64/workspace/kernel-el6/origin/taobao-kernel-build/kernel-2.6.32-131.21.1.el6/linux-2.6.32-131.21.1.el6.x86_64/kernel/sched.c:2460
这次我们可以轻松的定位到硬中断基本上是平衡的,软中断都基本压在了1号核心上,再根据符号查找确认是网卡的问题。
好了,现在定位到了,问题解决起来就容易了:
1. 采用多队列网卡。
2. 用google的RPS patch来解决软中断平衡的问题, 把软中断分散到不同的核心去,参见这里.
我们还是用穷人的方案,写了个shell脚本来做这个事情:
$cat em.sh #! /bin/bash for i in `seq 0 7` do echo f|sudo tee /sys/class/net/em1/queues/rx-$i/rps_cpus >/dev/null echo f|sudo tee /sys/class/net/em2/queues/rx-$i/rps_cpus >/dev/null done $sudo ./em.sh $mpstat -P ALL 1
就可以看到我们的成果:
网卡的软中断成功分到二个核心上了,不再把一个核心拖死。
小结:多观察系统是好事。
祝玩得开心!
建议继续学习:
- 记录一个软中断问题 (阅读:16036)
- 如何查看Linux 硬件配置信息 (阅读:5863)
- 如何设置双网卡路由 (阅读:4442)
- php获取网卡MAC地址类 (阅读:3571)
- linux双网卡双网关,不同IP段的设置 (阅读:3230)
- linux中为何没有网卡设备文件 (阅读:3087)
- Intel 10-GbE 网卡性能优化[翻译] (阅读:2920)
- 修改Linux网卡连接速度 (阅读:2903)
- Linux 上双网卡单网关设置方法 (阅读:2092)
- Centos(RHEL) 6 添加网卡的方法 (阅读:1867)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Yu Feng 来源: Erlang非业余研究
- 标签: 网卡 软中断
- 发布时间:2012-01-24 13:44:55
- [54] IOS安全–浅谈关于IOS加固的几种方法
- [52] android 开发入门
- [52] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [49] Oracle MTS模式下 进程地址与会话信
- [49] Go Reflect 性能
- [47] 【社会化设计】自我(self)部分――欢迎区
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [37] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑