Man 上的解释:

load average

System load averages is the average number of processes that are either in a runnable or uninterruptable state.  A process in a runnable state is either using the CPU or waiting to use the CPU.  A  process  in uninterruptable state is waiting for some I/O access, eg waiting for disk.  The averages are taken over the three time intervals.  Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.

单从这点上可以看出有些资料说load average可以理解为cpu运行队列中的进程数或者解释为CPU的工作负载量是不靠谱的,只有在早期Unix上定义仅处于Running状态的平均进程数代表load average,这样的话才算是队列中的包含正在被服务和等待被服务的进程数总和(排队论)

我们还是通过下面两点深入和准确的了解下什么是load average

1.为什么只统计进程状态是Running和Uninterruptible 

传统的OS进程有三种状态:Running、ready和block,而在Linux中把进程状态进行了细分扩展,ps man 上描述了如下状态及标记:

D    uninterruptible sleep (usually IO)

R    running or runnable (on run queue)

S    interruptible sleep (waiting for an event to complete)

T    stopped, either by a job control signal or because it is being traced.

W    paging (not valid since the 2.6.xx kernel)

X    dead (should never be seen)

Z    defunct ("zombie") process, terminated but not reaped by its parent.

R状态包括了传统划分的runnig跟ready两种状态,R状态的进程消耗CPU时间片,所以该状态的进程自然是系统的一种负载,那么D状态的Uninterruptible为什么也会被统计进来?

首先到底什么是interruptible和Uninterruptible进程,stackoverflow上有这样的解释:

  • TASK_INTERRUPTIBLE, the interruptible sleep. If a task is marked with this flag, it is sleeping, but can be woken by signals. This means the code which marked the task as sleeping is expecting a possible signal, and after it wakes up will check for it and return from the system call. After the signal is handled, the system call can potentially be automatically restarted (and I won't go into details on how that works).

  • TASK_UNINTERRUPTIBLE, the uninterruptible sleep. If a task is marked with this flag, it is not expecting to be woken up by anything other than whatever it is waiting for, either because it cannot easily be restarted, or because programs are expecting the system call to be atomic. This can also be used for sleeps known to be very short.

这两种状态的进程都是sleep状态的,区别在于可中断也就是S态的进程可以被其他系统信号中断唤醒,而不可中断D状态的进程不能被其他的任何信号中断唤醒除非等到它需要的资源被释放,或者说进程进行了一种被系统认为类似于原子操作的行为。

原子操作不可分割,所以进程处于D状态时不能被其他信号中断。例如进程在申请内存页,或者等待磁盘返回都是属于不可中断的状态。

也就是说D状态的进程通常都是申请使用系统中除CPU以外的资源,所以把D状态算进系统的load中也算是相当的合乎情理。所以说load average是针对CPU的负载情况体现是不正确,它代表的是系统中主要资源的整体负载情况。

2.load average的计算 

怎么来的?

$ cat /proc/loadavg 

0.14 0.05 0.06 1/122 13870

前面三个分别指的1/5/15分钟的load average,第四列数表示总共有多少线程以及当前运行着的线程数,最后一个是在该命令运行时最近或最后的线程ID

那么loadavg里面的数据又是怎么计算出来的呢?

wiki上说不同的系统load average计算有所不同,其中Linux上是这样计算的:

unsigned long avenrun[3]; 
 
static inline void calc_load(unsigned long ticks) 

   unsigned long active_tasks; /* fixed-point */ 
   static int count = LOAD_FREQ; 
 
   count -= ticks; 
   if (count < 0) { 
      count += LOAD_FREQ; 
      active_tasks = count_active_tasks(); 
      CALC_LOAD(avenrun[0], EXP_1, active_tasks); 
      CALC_LOAD(avenrun[1], EXP_5, active_tasks); 
      CALC_LOAD(avenrun[2], EXP_15, active_tasks); 
   } 
}

#define FSHIFT   11 /* nr of bits of precision */ 
#define FIXED_1  (1<<FSHIFT) /* 1.0 as fixed-point */ 
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */ 
#define EXP_1  1884 /* 1/exp(5sec/1min) as fixed-point */ 
#define EXP_5  2014 /* 1/exp(5sec/5min) */ 
#define EXP_15 2037 /* 1/exp(5sec/15min) */ 
 
#define CALC_LOAD(load,exp,n) \ 
   load *= exp; \ 
   load += n*(FIXED_1-exp); \ 
   load >>= FSHIFT;

这一系列的计算代表着在前n分钟处于Running和Uninterruptible进程总数的指数移动平均数。

好像有点难理解,其实主要目的就是解决数值大幅抖动造成的平均数计算误差,得到一个更平滑的接近最多真实情况的平均数值。

我们可以从业务角度这样理解:

For example, one can interpret a load average of "1.73 0.60 7.98" on a single-CPU system as:

  • during the last minute, the system was overloaded by 73% on average (1.73 runnable processes, so that 0.73 processes had to wait for a turn for a single CPU system on average).

  • during the last 5 minutes, the CPU was idling 40% of the time on average.

  • during the last 15 minutes, the system was overloaded 698% on average (7.98 runnable processes, so that 6.98 processes had to wait for a turn for a single CPU system on average).

This means that this system (CPU, disk, memory, etc.) could have handled all of the work scheduled for the last minute if it were 1.73 times as fast.

In a system with four CPUs, a load average of 3.73 would indicate that there were, on average, 3.73 processes ready to run, and each one could be scheduled into a CPU

下面使用高速公路收费排队的模型更能形象的解释load average的数值:

= load of 1.00

  = load of 0.50

Load average in Linux的精确含义的更多相关文章

  1. Linux系统中的load average

    1. load average 定义 linux系统中的Load对当前CPU工作量的度量.简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 L ...

  2. 理解Linux系统中的load average(图文版)转

    一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount ...

  3. 理解Linux系统中的load average(图文版)

    本文转自:http://heipark.iteye.com/blog/1340384 一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: ...

  4. 理解Linux系统中的load average

    理解Linux系统中的load average(图文版) 博客分类: Linux linux load nagios  一.什么是load average? linux系统中的Load对当前CPU工作 ...

  5. load average 定义(网易面试)

    1. load average 定义 linux系统中的Load对当前CPU工作量的度量.简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟.5分钟.15分钟) 内平均 L ...

  6. linux 平均负载 load average 的含义

      load average 的含义 平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. 以路况为例, 单核CPU.单车道 情况如下: 0.00-1. ...

  7. linux 平均负载 load average 的含义【转】

    文章来源: linux 平均负载 load average 的含义 load average 的含义 平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数 ...

  8. [转]理解Linux系统中的load average

    转自:http://heipark.iteye.com/blog/1340384 谢谢,写的非常好的文章. 一.什么是load average linux系统中的Load对当前CPU工作量的度量 (W ...

  9. linux load average

    性能分析_linux服务器CPU_Load Average 理解Linux系统中的load average(图文版) 理解Load Average做好压力测试 top命令的Load average 含 ...

随机推荐

  1. jQuery插件之ajaxFileUpload API文档

    ajaxFileUpload是一个异步上传文件的jQuery插件. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url  上传处理程序地址. 2,fil ...

  2. html5--6-41 CSS背景

    html5--6-41 CSS背景 实例 学习要点 掌握CSS背景属性的使用 元素的背景属性: background 简写属性,作用是将背景属性设置在一个声明中. background-attachm ...

  3. damon

    不管是否有-f参数,最终程序都会进入 fuse_loop_mt 循环中,在helper.c的fuse_main_common函数中. 1. 有-f参数.这种情况下fuse_setup_common函数 ...

  4. Oracle10G各版本下载以及补丁地址

    Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit ...

  5. I.MX6 NXP git 仓库

    /************************************************************************* * I.MX6 NXP git 仓库 * 说明: ...

  6. iOS bounds、frame之间的关系

    这几个都是在ios程序中,经常会注意到的一些小细节,能否真正了解这些,对写ios程序也有很大的好处. frame 是UIView中表示此view的一个矩形面积,包括了view在它的superview中 ...

  7. Android 开发:由模块化到组件化

    在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发 以下高能,请做好心理准备,看不懂请发私信来交流 ...

  8. VC链接hid.lib出错问题解决方案

    写一个HID的客户端小程序,调用了一些HID API,但是链接时出现了奇怪的现象. 尽管我已经把头文件和lib文件加入到了VC的Include和Lib目录中,但不管我用VC链接,还是在DDK环境下链接 ...

  9. hdoj5813【构造】

    2016 Multi-University Training Contest 7 05 真的真的好菜哇... 思路: 暴力. 我对那些到达目的地少的点做硬性规定就是去比他要到达目的地更少的点,这样一来 ...

  10. POJ1017 【据说是贪心...】

    题意: 有6种面积的格子,给出这些格子的数量,然后有6*6的格子去容纳这6种面基,问最少需要几个6*6格子,使得所有类型的小格子被容纳. 思路: 按照面积的从大到小放. 一开始还是太天真,还要用各种1 ...