记录一次上下文切换问题排查
事故原因
最近一个游戏服总是出现机器人无故掉线的问题,一直排查不到问题 一直说是服务器性能跟不上(技术大佬那边排查说是有cpu中断的情况出现 一看cpu确实是很垃圾 L5630自行体会)
但是问题应该不是这么简单,我这边查看负载 io 网络 均没有问题 然后问题又甩给了开发(嘿嘿~~),然后几天过去了 问题依旧没有解决。。。 甲方都有点在冒火了,然后一起加班排查。
具体排查步骤
1.再仔细查看了一次系统指标 (cpu 使用率,磁盘io,网络等) 并没有发现明显问题
2.开发那边怀疑是性能问题,非要叫把数据库迁移到另一台服务器(测试服 所以放在一起的)然而并无卵用
3.使用vmstat 观察细节`vmstat 3(每三秒刷新一次)`
输出:
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 0 5472748 189996 12666012 0 0 0 164 0 0 22 8 69 0 0
8 0 0 5540900 189996 12669716 0 0 0 1831 15900 22651 30 4 66 0 0
5 0 0 5525364 189996 12673844 0 0 0 1232 14200 19606 23 3 71 3 0
8 0 0 5530708 189996 12678892 0 0 0 1412 15749 24255 30 4 65 0 0
4 0 0 5479064 189996 12684240 0 0 0 2005 15660 24538 31 4 64 0 0
5 1 0 5447116 189996 12708348 0 0 0 8036 15246 23332 28 4 68 0 0
发现cpu 中断 上下文切换都挺高的(如果无法判断数值的高低 对比另外一台服务器就明显了)
4. 中间又绕了一个弯(最近刚好再看动态追踪,想这能不能用这个玩意儿找到问题),然后perf top / perf record/report / perf top -g -p {gamne_pid} 各种尝试,一顿下来 并没有啥收获
5.直接使用pidstat -wt 2 查看所有进程的上下文切换
部分输出:
Average: UID TGID TID cswch/s nvcswch/s Command
Average: 0 - 3336 0.93 0.00 |__tuned
Average: 997 3202 - 0.93 0.00 zabbix_agentd
Average: 997 - 3202 0.93 0.00 |__zabbix_agentd
Average: 997 3204 - 1.39 0.00 zabbix_agentd
Average: 997 - 3204 1.39 0.00 |__zabbix_agentd
Average: 997 3209 - 0.46 0.00 zabbix_agentd
Average: 997 - 3209 0.46 0.00 |__zabbix_agentd
Average: 997 3210 - 0.93 0.00 zabbix_agentd
Average: 997 - 3210 0.93 0.00 |__zabbix_agentd
Average: 0 3367 - 1.39 0.00 salt-minion
Average: 0 - 3367 1.39 0.00 |__salt-minion
Average: 0 - 3368 0.46 0.00 |__salt-minion
Average: 0 4433 - 2.78 0.00 node
Average: 0 - 4433 2.78 0.00 |__node
Average: 0 - 4437 0.46 0.00 |__node
Average: 0 4434 - 3.70 0.46 node
Average: 0 - 4434 3.70 0.46 |__node
Average: 0 - 4439 0.93 0.00 |__node
Average: 0 4445 - 4.63 0.00 node
Average: 0 - 4445 4.63 0.00 |__node
Average: 0 - 4448 0.93 0.00 |__node
Average: 0 8913 - 2363.43 28.24 redis-server
Average: 0 - 8913 2363.89 28.24 |__redis-server
Average: 0 - 8915 4.63 0.00 |__redis-server
Average: 0 9739 - 1.85 0.00 kworker/u48:2
Average: 0 - 9739 1.85 0.00 |__kworker/u48:2
Average: 0 11959 - 43.98 0.00 kworker/8:2
Average: 0 - 11959 43.98 0.00 |__kworker/8:2
Average: 27 - 12606 1.85 0.00 |__mysqld
发现redis 可能会有问题 (但是还是拿不准,我有在其他游戏服务器跑了一遍相同的操作 发现其他游戏服务器的值只有600)
6.检查两边游戏服务的redis 配置信息,版本是否一致(答案一致)
7.使用`redis-cli info`观察redis指标 对比两台redis 的性能指标

原因分析
已经提交给开发那边了,等待代码进一步确认..