首先,top
命令是没有计算load的平均值的,top
命令只不过是在不停的从/proc/loadavg
文件来读取load的平均值.(strace
显示top
命令会打开/proc/loadavg
并且会定期从中读取load的平均值信息).当使用man proc
的时候,会有如下说明:
/proc/loadavg
该文件的前三个属性,分别表示在1分钟,5分钟和15分钟内,任务队列中进程的平均个数.
任务需保证:
- 进程状态是R
- 进程在等待磁盘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;