实战排查由于系统负载引起的服务响应异常
Duang,风和日丽的某天上午,一连串的服务耗时异常报警,打破了宁静~ 万茜还有张雨绮~
服务为啥突然超时了
从大方面说基本上就是两类,一类是链路出了问题,包括网络抖动,链路环中的某一节点抖动等。另一类是服务本身的问题,包括服务器自身问题如磁盘老化等,还有代码 bug 造成的服务等待或服务器负载问题。
对第一类问题比较好发现,看监控,查异常超时日志,总会发现端倪,但是对第二类场景就不那么容易定位了,但基本上有一个排查的套路。
系统负载
WIKI: the system Load is a measure of the amount of work that a compute system is doing
啥意思,就是衡量计算机这个时候正在做多少事,是不是忙不过来了~
那么,怎么判断当前系统是否已经过载了呢对一般的系统来说,Load 平均值要小于 CPU 的数量;好在 linux 足够的强大,有强大的命令来支撑排查问题。
问题排查
「top」看整体表现
可以看出,系统负载确实出现了问题
load average : 77 78 65
对于我们的 32cpu 的机器来说,已经过载
Tasks 行 zombie=0,还好没假死进程;
Cpus 行,wa=73.3 居然这么高,IO 的问题要重点看
Swap 行,交换区使用了一半多,也不低
有的同学说,是 swap 的原因,内存不够,导致物理内存与 swap 分区发生置换引起的过载,那么到底是不是这个原因呢。
「vmstat 3」看性能指标
每 3 秒捕捉一次性能指标,重点看 si 和 so 的数值,「si 是由内存进入内存交换区的数量;so 是由内存交换区进入内存的数量」。如果两个值长时间都是 0,即使 swap 的值很大,其实系统也是可以认为是正常的。
观察发现,其实 swap 的指标还算正常,那 swap 还不是最终的原因。
「iostat -x 1 5」看 IO
我的天,都不用看读写的指标,直接看最后一个 util,居然每次都达到了 100 往上,IO 满负荷运行啊。
系统运行队列基本都被 IO 占领,肯定会过载了。那就重点排查在这个时间点附近有过上线的代码,果然,由于代码原因导致正排倒排域全部暴涨,写索引的也随之暴涨。回滚代码,恢复正常。
福利环节,恢复了就完了么?
顺便把负载相关的命令和指标理一遍不好么
「top」命令:
在 top 命令下按 1 ,可以看到分 cpu 的指标展示。
在 top 命令下,按 shift + "c",则将进程按照 CPU 使用率从大到小排序。
在 top 命令下,按 shift+"p",则将进程按照内存使用率从大到小排序,可以定位出哪些服务占用了较高的 CPU 和内存。
「vmstat 1 」命令
版权声明: 本文为 InfoQ 作者【Coder的技术之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/4aae42cf5adc7a7affb3d49d6】。文章转载请联系作者。
评论