码迷,mamicode.com
首页 > 其他好文 > 详细

Load Average和CPU使用率的区别

时间:2015-11-29 06:48:03      阅读:415      评论:0      收藏:0      [点我收藏+]

标签:负载.cpu   使用率   

Load Average

    是指在运行队列里面的任务数,假如只有1个进程在运行队列里面1分钟,那1分钟的load average就是1;只有1个进程在运行队列里面半分钟,那1分钟的load average就是0.5,意思是在过去1分钟内,运行队列有50%的时间是没有任务的。

    处在运行队列里面的进程的状态是R,在Linux中,除了R状态的进程会被计算进load average外,D状态的进程也会被计算进去,D状态的进程就是处于uninterruptable sleep(不可被打断)状态的进程,这些进程可能在等待磁盘IO,网络IO,或者一个系统调用等待内核空间的返回。

    还有一点重要的是,进程的线程数是会被当作不同的进程来计算的,假如一个进程产生1000个线程同时运行,那运行队列的长度就是1000,Load Average就是1000。


CPU使用率

    是指CPU用于执行任务占用的时间与总的时间的比率,一般看到的指标有:%us,  %sy,  %ni, %id,  %wa,  %hi,  %si,  %st,其中CPU的使用率= (%us + %sy + %ni) = (100% - ) ,这里看到的就是CPU工作的比率了。



为什么load很高,CPU使用率却很低?


    那极有可能D状态的进程非常多,我们使用以下命令去看一下处于R状态和D状态的进程(或线程)个数,发现R状态的进程(或线程)只有几个,而D状态的进程(或线程)却有一大堆,而这些都是apache的线程;由于linux计算load average的时候会把D状态的任务也计算进去,所以算出来的负载会很高;但实际上,CPU使用率并不高,因为真正占用CPU的任务没几个。

[root@abc ~]
# ps -emo user,pid,stat,command | awk ‘{print $3}‘ | grep -E "^D|^R"

Apache和Keepalive

    使用 ps -eLf  | grep httpd | wc -l 统计一下apache的线程数,发现有3000多个,为什么apache会开启这么多的线程?

    查看apache的配置,用的是worker的模式,这个模式下会启动多个子进程,子进程又会启动多个子线程,配置里面配置了最大启动64个进程,每个进程64个线程,最大可以启动4096个线程。

<IfModule mpm_worker_module>
ServerLimit                 128
StartServers                64
MaxClients                  4096
MinSpareThreads             64
MaxSpareThreads             128
ThreadsPerChild             64
MaxRequestsPerChild         10000
</IfModule>

    需要注意的是,这些线程绑定是的连接,而不是请求,这就意味着,一个连接会占用一个线程,直到这个连接关闭。而这时发现apache的keepalive是默认开启的,超时5秒,也就是说,假如一台主机的qps是600,假如这些请求都是不同用户的请求,那就是每秒有600个新连接,而且每个连接keepalive 5秒,也就是每秒同时有3000个连接hold住在那里,而apache是一个线程对应一个连接的,那就是说apache要开启3000个线程在那里。

    在一些情景中,会开启keepalive优化,比如一个html请求,连带着后续的js/css/图片请求,这时候开启keepalive,可以重用连接,节省建立tcp连接的消耗及rtt;而对于一些特殊的情景,场景可能非常简单,用户请求一下服务端,获取数据,然后就没有然后了,可能几小时后或者隔天再来请求,所以请求的几乎都是不同的用户不同的连接,在并发量大的时候,开启keepalive会导致大量的连接在处理完请求后就hold在那里等待超时,什么事都不干!

    于是把线上的keepalive配置关闭,在httpd.conf加上以下配置:

KeepAlive Off


D状态进程

    关了keepalive之后,负载明显降下来了,再也不会突然飙到100多,但是负载还是有异常,从下面的图表可以看到,有时候负载还是会有突然飙升的情况,从个位数飙升到2位数。

    按照上面的排查方法,发现还是D状态的apache线程引起的负载,关闭keepalive只是让这些线程减少了,但还没有根本解决。为什么apache的线程会变成D状态呢?

    我们知道,D状态的进程大部分情况下其实是在等待磁盘I/O,apache与磁盘I/O相关的也就是写日志了,于是使用排除法对各个日志输出配置进行关闭,最终定位到是一个编译成apache模块的组件的问题,里面的轮替逻辑在大并发下容易导致apache的线程出现等待磁盘I/O的情况,而且在keepalive情况下尤其严重,通过排查最后定位到该配置,将配置关闭从而解决问题。

<RLog>
Path=/home/abc/app/apache2/logs/patcher_log
Size=100000000
Num=5
Level=20000
</RLog>



本文出自 “冥思苦想之旅” 博客,请务必保留此出处http://shen445122.blog.51cto.com/6716303/1717780

Load Average和CPU使用率的区别

标签:负载.cpu   使用率   

原文地址:http://shen445122.blog.51cto.com/6716303/1717780

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!