linux系统负载问题排查
前言
最近在维护线上服务器的时候,有一台机器出现了丢包严重的问题。于是开展排查和问题解决
排查流程
一,看系统发生什么
首先SSH上去服务器的时候,明显发现操作有点卡顿,那第一感觉是系统负载的问题。
于是使用 top命令查看,发现CPU和Memory的使用率都不高,但load avg的三个值都比较高。确认是系统负载的原因。
还可以top后按1查看每一个CPU的使用情况,针对每一个细节
CPU的wa值越高,说明该CPU的等待任务队列越长。可能是僵死任务或者是系统调度的问题
针对僵死任务,可以使用 ps -axjf 来查看 D状态的任务,举个例子的打印指令:
ps -axjf | gawk '$7 ~ /D/{print $0}' | awk '{print $2}'
拓展一下:其他指令也可以经常用到的,指令集合图为
vmstat 查看CPU用户态和内核态情况下的memory使用,系统中断情况,中断上下文等,系统级别的
mpstat 统计的是每个CPU的使用情况
pidstat 查看具体某个进程对CPU占用和上下文切换的状态
iostat 查看系统IO负载情况,是由块设备管理的接口报告的
sar 查看网络IO情况
上述四个工具是利用内核的计数器在系统软硬件的环境中检查系统级别的活动
ps,top,pmap将进程的内存段和使用统计一起列出
上述的工具是面向进程级别的,从/proc文件系统里面读取内核的统计信息
针对CPU和Memory不高但负载高的情况,经验地看有没发现D状态的进程
二,看什么导致
针对该现象,需要看看是什么导致了系统负载的飙高。
查看等待队列的进程的指令
ps -eTo stat,pid,tid,ppid,comm --no-header | sed -e 's/^ \*//' | perl -nE 'chomp;say if (m!^\S*[RD]+\S*!)'
从打印出来的发现是一些僵死的进程,由于某个硬件造成的。摘除该硬件,然后杀掉对应的进程即可。
拓展一下:
进程任务的状态有五大状态
运行态R:在运行队列上或者是在运行中,并不意味着程序是在
可中断睡眠S:一般进程在等待事件中,进程在等待事件中完成
不可中断睡眠D:一般在IO中,进程通常在等待IO结束才退出该状态。
僵死态Z:被父进程抛弃了的
三,原因分析和流程总结
这次因为负载飙高的原因导致的网络丢包问题,其实是系统负载过久异常而没有被关注引发,触发到网络IO出现问题,网络丢包,最后触发下载业务的失效。
其实应该做的是针对每一台物理机做一个简单的监控,把最基本的CPU,Memory,IO等指标做一个上报,当超过警报阈值则触发报警提醒相关的人员前往查看。
接下来有空则需要搞下这个性能监控模块