最近遇到了几次load异常的问题,用top命令查看后发现load很高,但是cpu的其他指标都十分正常,于是想好好了解下为什么会load高。
什么是cpu的loadCPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。
看到网上有个例子来说cpu的load。
把CPU比作电话亭,把任务比作排队打电话的人。有一堆人排队打电话,每个人只允许打1分钟的电话,如果时间到了还没有打完还是需要重新去排队。
在打电话的时候,肯定会遇到排队等待电话的人,也有打完电话走掉的人,也有新来排队的人,也有打完1分钟后没打完又重新排队的人。那这个人数的变化
就相当于任务的增减。为了统计平均负载状态,那么就开始统计每分钟统计一次人数,并且在第1,5,15分钟的时候对统计情况取平均值。
load低并不意味着CPU的利用率低,有的人(任务)拿起电话(CPU)一直打完1分钟,有的人(任务)拿起电话(CPU)一直犹豫是否要打,犹豫30
秒后才拨通了电话,然后只有后30秒是真正在打电话。所以就是说前一个任务的CPU利用率高,而后一个任务的CPU利用率就低。
请求大于当前的处理能力,那就产生等待,就会引起load升高。
负载高,CPU利用率低:说明等待执行的任务很多。很可能是进程僵死了。通过命令ps –axjf查看是否存在D状态的进程,该状态为不可中断的睡眠状
态。处于D状态的进程通常是在等待IO,通常是IO密集型任务,如果大量请求都集中于相同的IO设备,超出设备的响应能力,会造成任务在运行队列里堆积
等待,也就是D状态的进程堆积,那么此时Load Average就会飙高。
CPU利用率高,负载低:说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。这种场景,通
常是计算密集型任务,即大量生成耗时短的计算任务。
CPU使用率低,IO繁忙,负载低:这种场景,通常是低频大文件读写,由于请求数量不大,所以任务都处于R状态(表示正在运行,或者处于运行队列,
可以被调度运行),负载数值反映了当前运行的任务数,不会飙升,IO设备处于满负荷工作状态,导致系统响应能力降低。
load很高的原因
从编程语言层次上full gc次数的增大或死循环都有可能造成cpu load 增高。那么首先就要找到哪些线程在占用cpu,之后再通过线程的id值在堆栈文件中
查找具体的线程,看看出来什么问题。
通过top -c命令显示进程运行信息列表 (按键P按CPU占有资源排序)。
另一种就是处于D状态的进程。运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在
parked队列中停留很短的时间。但是如果内核因为某些原因不能提供相应服务的话。例如,进程要读某一个特定的磁盘块,但是磁盘控制器坏了,这时,除
非进程完成读磁盘,否则内核无法将该进程移出parked队列,此时该进程标志位就会被置为D。由于进程只有在运行的时候才能接受到signals,所以此时在
parked队列上的进程也就无法接收到信号了。解决这个问题的方法要么是给资源给该进程,要么是reboot。通俗一点说,产生D状态的原因出现
uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等。因为进程一直在运行队列(running queue)中,所以还会导致主机的
Load上升。
参考:https://www.cnblogs.com/yunxizhujing/p/9382396.html
https://blog.csdn.net/arkblue/article/details/46862751