Linux系统负载相关知识汇总

来源:互联网 发布:模特 李荣浩 知乎 编辑:程序博客网 时间:2024/06/07 15:17

前段时间正好对系统负载这个概念感兴趣。 就做了一些小的研究。 比较详细的了解这个概念。 这里是我对Linux负载相关的知识的一些整理,记载在博客里, 方便以后查看, 也希望对其他人有用。 


本文的内容结构如下:

一: 什么是系统平均负载

二: 怎么查看系统负载

三: 怎么判断系统负载是否过重

四: 系统负载是怎么计算出来的



一: 什么是系统平均负载


以下内容是针对Linux下进行讨论的。 Linux Load average , 即系统平均负载。 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数。 


有几个基本概念:(以下内容引用自: http://www.cnblogs.com/amsun/p/3155246.html)

  • Load 指的是运行队列(run-queue)的长度:L = 等待进程的数目 + 运行进程的数目
  • Load Average指的是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。
  • Load Average反映了CPU的使用情况和申请情况.

虽然系统负载反应了cpu的使用情况和申请情况,但是cpu利用率和系统负载又是有区别的。 

  • Load Average所包含的信息不是CPU的使用率状况
  • 多任务环境下,系统分配时间片以后,是否使用完全使用时间片取决于进程,因此完全可能出现低CPU利用率而高Load Average的情况

二: 怎么查看系统负载


目前Linux上有三个命令(top, w, uptime),可以查看系统负载。 


load average: 0.00, 0.01, 0.05 


这三个数字,分别表示1分钟, 5分钟, 15分钟内的系统的平均负荷。


额外补充一种查看系统负载的方法: cat  /proc/loadavg  



三: 怎么判断系统负载是否过重


在阮一峰老师的博客里有比较好的介绍,他分别针对单CPU, 多CPU,  CPU多核三种情况来做讨论。 他做了一个类别, 把cpu比做大桥, 单cpu就是单车道, 类似的多CPU或者CPU有多个核,就是多车道。 下面直接引用他的描述

(http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html):

那么,我们不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过。(很显然,这座桥只能单向通行。)

系统负荷为0,意味着大桥上一辆车也没有。

系统负荷为0.5,意味着大桥一半的路段有车。

系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。

系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆一样多;系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。

CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。

如果CPU每分钟最多处理100个进程,那么系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;系统负荷1.0,意味着CPU在这1分钟里正好处理100个进程;系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。

为了电脑顺畅运行,系统负荷最好不要超过1.0,这样就没有进程需要等待了,所有进程都能第一时间得到处理。很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,你要动手干预了。


通常情况下, 对于单CPU的情况,

如果load average 大于 0.7 ,就要开始引起系统管理员注意, 查找问题所在;

大于1.0, 就要寻找解决方法;

大于5.0,表明系统的问题已经很严重了, 可能会死机。 

对于多CPU或者多核的情况, 请乘以对应的倍数来判断。 


另外,由于在Linux中,会返回三个时间的观察值,那么就存在一个问题,就是我要以哪个时长的观察值为准了。 在阮一峰老师的博文中也给出了建议:

如果只有1分钟的系统负荷大于1.0,其他两个时间段都小于1.0,这表明只是暂时现象,问题不大。

如果15分钟内,平均系统负荷大于1.0(调整CPU核心数之后),表明问题持续存在,不是暂时现象。所以,你应该主要观察"15分钟系统负荷",将它作为电脑正常运行的指标。



四: 系统负载是怎么计算出来的


为了搞清楚系统负载是怎么算出来的, 我又在网上找到了一些资料。 计算公式涉及了高等数学的运算,如果对此不感兴趣,可以直接跳过。 


通过查看Linux源码, 可以得到, Linux计算系统平均负载的公式为:


load(t) = load(t-1) e^(-5/60) + n (1 - e^(-5/60))


其中,exp(x)为e的x次幂,

n为当前运行队列的长度。


Linux内核认为进程的生存时间服从参数为1的指数分布,


指数分布的概率密度为:以内核计算负载load1为例,设相邻两个计算时刻之间系统活动的进程集合为S0。


从1分钟前到当前计算时刻这段时间里面活动的load1个进程,设他们的集合是 S1,内核认为的概率密度是:λe-λx,


而在当前时刻活动的n个进程,设他们的集合是Sn内核认为的概率密度是1-λe-λx。


其中x = 5 / 60,因为相邻两个计算时刻之间进程所耗的CPU时间为5秒,而考虑的时间段是1分钟(60秒)。


那么可以求出最近1分钟系统运行队列的长度:



load1 = |S1| -* λe-λx + |Sn| * (1-λe-λx) = load1 * λe-λx + n * (1-λe-λx)



其中λ = 1, x = 5 / 60, |S1|和|Sn|是集合元素的个数,这就是Linux内核源文件shed.c的函数calc_load()计算负载的数学依据。



【参考文献】

1.    http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages 

2.    http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html

3.    http://www.penglixun.com/tech/system/how_to_calc_load_cpu.html

4.    http://www.cnblogs.com/amsun/p/3155246.html

5.    http://www.ccvita.com/354.html



<<<<<<<<< 全文完  >>>>>>>>>

 

文章首发于我的个人网站 : www.hackstoic.com  












0 0
原创粉丝点击