Load和CPU利用率

来源:互联网 发布:古诗欣赏的软件 编辑:程序博客网 时间:2024/06/07 19:23

首先,top命令是没有计算load的平均值的,top命令只不过是在不停的从/proc/loadavg文件来读取load的平均值.(strace显示top命令会打开/proc/loadavg并且会定期从中读取load的平均值信息).当使用man proc的时候,会有如下说明:

/proc/loadavg

该文件的前三个属性,分别表示在1分钟,5分钟和15分钟内,任务队列中进程的平均个数.

任务需保证:

  1. 进程状态是R
  2. 进程在等待磁盘IO,状态是D

这3个数字也可以通过一些其他的命令来获取,比如uptime等命令.而第四个属性包括两个数字,以/分开.第一个数字是当前内核调度实体的数量(进程,线程);这个数字会低于或者等于CPU的个数.而/后面的数字表示在当前系统中存在的内核调度实体个数.第5个属性则是操作系统最常创建进程的PID.

所以说,load average只是表示运行队列中运行任务的多少.并且,开发者从top中只能看到1分钟,5分钟和15分钟的平均值.如果开发者运行cat /proc/loadavg那么将会看到文件中的其它属性值.

前面描述的load average的描述是来自于man的,但是其实经过测试,貌似并非十分准确.我写了一个简单的java程序来创建256个线程,代码如下:

import java.lang.Thread;import java.lang.Runnable;public class test {    public static void main(String[] args) {        int n = 256;        for (int i = 0;i<n;i++) {            new Thread(new Runnable() {                @Override                public void run() {                    while(true){                    }                }            }).start();        }    }}

当实际执行的过程中,再执行了cat /proc/loadavg的时候,返回的结果如下:

71.41 18.25 6.28 264/928 26598

而这台服务器本身只是虚拟机,如下为cat /proc/cpuinfo的值:

processor   : 0vendor_id   : GenuineIntelcpu family  : 6model       : 45model name  : Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHzstepping    : 7cpu MHz     : 2199.885cache size  : 15360 KBphysical id : 0siblings    : 1core id     : 0cpu cores   : 1apicid      : 0initial apicid  : 0fpu     : yesfpu_exception   : yescpuid level : 13wp      : yesflags       : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat clflush mmx fxsr sse sse2 ht syscall nx lm up rep_good unfair_spinlock pni ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lmbogomips    : 4399.77clflush size    : 64cache_alignment : 64address sizes   : 46 bits physical, 48 bits virtual

本身只有单CPU,单核,而实际上,264这个数字很明显是高于这个值的.所以之前对于/proc/loadavg的第四个属性描述不是很正确.这个属于load average的一个描述错误.

在proc的manual page中,对于loadavg第四个属性的/左边的数值描述是错误的.该值表示的是当前的执行调度实体,所以就预测其值应该不高于当前CPU的个数.这和其实现并不相符,该值其实表示的是当前的runnable线程.

Q:现在来了个问题,当load平均值是7的时候,有4个超线程的CPU内核,是不是意味着CPU的利用率在7/8?

A:答案是否定的,load平均值为7只是表示在当前的执行队列中有7个运行进程.

Q:那么为什么其显示为50%id?这种情况怎么会出现一般时间的CPU空闲?

A:因为load average并不意味着CPU的占比.开发者的线程只是使用了50%的CPU,而另外50%的CPU在做其他事情罢了.

原创粉丝点击