linux性能 --》load average解读

什么是load

load代表cup的运行队列,每个CPU都会维持一个运行队列,理想情况下,调度器会不断让队列中的进程运行。进程不是处在sleep状态就是runable状态。一种情况是CPU过载,就会出现调度器跟不上系统的要求,导致可运行的进程会填满队列。队列愈大,程序执行时间就愈长;还有一种情况是进程再等待其他资源如磁盘io、网络io等,这时候就会出现运行队列很大,但是cpu负载却不高。

在linux中load average这一指标代表了cup的load;

网上很多讲解load average的文章都是在片面的讲cpu密集型应用的load状况,这会给大家带来误导;load average指标需要结合系统cpu的核数、cpu占有率,io等资源的情况来分析系统的负载,单看load average是没有意义的;

如何查看load

a. 通过top命令

top -  11:37:48 up 7 days, 17:42,  9 users,  load average: 0.00, 0.00, 0.00

top命令的第一行,最后一个指标load average的三个值分别代表了当前cpu任务队列 1分钟、5分钟、15分钟的平均值;

b. uptime命令

[root@report bin] # uptime
11:39:08 up 7 days, 17:43, 9 users, load average: 0.00, 0.00, 0.00

c. w 命令

[root@report bin ] #  w
 11:41:08 up 7 days, 17:45,  9 users,  load average: 0.00, 0.00, 0.00

如何分析

根据 CPU 数量去判断,系统负载情况;

平均每个cpu的负载 = load /cpu数量

这个值过高代表需要运行的队列累积过多了。
但队列中的任务实际可能是耗 CPU的,也可能是耗 I/O 乃至其它因素的。

这个值判断有两种情况:

  1. 如果这个值持续大于等于1,并且cup占用率非常高,说明任务队列里的任务大部分或全部都是cpu计算型的任务,这时候cpu已经满载,如果这个值大于3说明cpu负载已经很高;

  2. 如果这个值很大,但是cpu占用率却不高,说明有很多线程处于其它资源的等待状态,这个时候通过top -H 命令,展示线程,然后按shift + o ,进入排序页面,再按 w,对进程状态排序;

观察线程的状态,线程有以下5中状态:
D 表示不中断休眠
R 表示正在运行
S 表示休眠
T 表示被跟踪或被停止
Z 表示出于僵死状态

如果状态为D的线程很多,说明这些线程在等待资源调度,如磁盘io、网络io或其它资源;
所以这个时候要检查其它资源是否存在瓶颈或故障;

总结

所以load过高的原因有两个,处于Running状态和D状态的线程太多导致的;

如果处于running状态的线程太多,会导致cpu占用率很高,如果处于D状态的线程太多,那么就要查看是否系统其他资源到了瓶颈

关于进程状态D

线程等待资源而去睡眠,就会进入D状态( 即Disk sleep,深度睡眠 ),进入D状态的线程是不能够被打断的,他们会一直睡眠直到等待的资源被释放时主动去唤醒他们。

Linux 进程有两种睡眠状态:

interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的;
uninterruptible sleep,处在这种状态的进程不接受外来的任何信号,因为此时这个进程正运行在内核态,CRTL+C是给进程发signal的方式通知进程,而进程只有在从内核态返回用户态的时候才会去检查有没有信号,所以如果它处在内核态的话显然是无法被杀死的,这也是为什么用 kill 杀掉这些处于 D 状态的进程,无论是 kill, kill -9 还是 kill -15。

D 状态就是 uninterruptible sleep
进程为什么会被置于 uninterruptible sleep 状态呢?处于 uninterruptible sleep 状态的进程通常是在等待 IO,比如磁盘 IO,网络 IO,其他外设 IO,如果进程正在等待的 IO 在较长的时间内都没有响应,也就意味着很有可能有 IO 出了问题,可能是外设本身出了故障,比如挂载的远程文件系统已经不可访问了;正是因为得不到 IO 的响应,进程才进入了 uninterruptible sleep 状态,所以要想使进程从 uninterruptible sleep 状态恢复,就得使进程等待的 IO 恢复,比如如果是因为从远程挂载的 NFS 卷不可访问导致进程进入 uninterruptible sleep 状态的,那么可以通过恢复该 NFS 卷的连接来使进程的 IO 请求得到满足;

进入该状态的进程,会一直等待,不接受任何信号,当然也就无法被杀死(kill/fuser -k)。因为进程一直在运行队列(running queue)中,所以还会导致主机的Load上升(虽然主机并不繁忙)。如果由于这个原因被卡住的进程很多的话,主机的Load可能会看起来非常高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值