首先,top
不算load average
本身。它只是從/proc/loadavg
文件中讀取load average
(strace
顯示top
打開/proc/loadavg
,然後定期從中讀取)。 man proc
說,這對於/proc/loadavg
:
的/ proc/loadavg
在該文件中的前三個字段是負載給予 的作業數量在運行隊列中(狀態R)或等待磁盤I平均數字/ D (狀態D)平均在1,5和15分鐘。它們與運行時間(1)和其他程序給出的平均負載數相同。 第四個字段由用斜槓(/)分隔的兩個數字組成。其中第一個是當前正在執行的內核調度實體(進程,線程)的數量;這將小於或等於 個CPU數量。斜線後面的值是系統上當前存在的內核 調度實體的數量。第五個 字段是最近在系統上創建的過程的PID。
因此load average
顯示了運行隊列中的作業數量。你會看到從/proc/loadavg
到top
的前三個值。如果您運行cat /proc/loadavg
,您將看到文件中的所有值。
順便說一下,在第四個字段的描述中似乎有錯誤。我用C++編寫了一個簡單的測試程序,它從輸入中讀取整數N,然後創建N個線程,每個線程都運行一個不定式循環。當我運行我的程序並要求它創建256個線程時。我只有8個HT處理器。但我在文件中看到:
>cat /proc/loadavg
74.44 21.04 10.59 259/931 17293
很明顯,259比我的機器上的CPU數大。這篇文章http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average談論相同 - 在load average
的說明中有錯誤。這是報價:
值得注意的是,在PROC當前的解釋(5)手冊 (作爲人的頁面版本3.21,2009年3月)是錯誤的。它報告 第四個字段的第一個數字作爲當前正在執行的 調度實體的數量,因此預測它不能大於 個CPU數量。這並不符合實際實施中,在此 值報告運行的線程的當前數量
所以,回答你的問題:
如果平均負載是在7,4超支這不應該意味着CPU正在工作到大約7/8的容量嗎?
不,它只是表示您在作業隊列中平均有7個正在運行的進程。
爲什麼當時顯示50.0%id?一半時間閒置怎麼樣?
因爲load average
並不意味着「CPU容量的百分比」。你的線程僅僅使用50%的CPU和50%的時間做其他事情。
最後。以下是我的簡單測試。建立使用g++ -pthread my_test.cpp -o my_test
。運行./my_test 8
,看看你的空閒時間,當線程運行不斷,並沒有花時間等待任何東西。或運行./my_test 128
以查看負載平均值可能比CPU的數量大得多。
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
static void* __attribute__ ((noinline))
my_thread_func(void * arg)
{
printf("Thread %lld:\n", (long long)pthread_self());
volatile long long i = 0;
while (1) {
++i;
}
return 0;
}
int
main(int argc, char *argv[])
{
int num_threads;
pthread_t *my_threads;
num_threads = atoi(argv[1]);
my_threads = new pthread_t[num_threads];
for (int tnum = 0; tnum < num_threads; tnum++) {
pthread_create(&my_threads[tnum], NULL, &my_thread_func, NULL);
}
sleep (600);
return 0;
}
也許這些會提供一些幫助:http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages,http://en.wikipedia.org/wiki/Load_ %28computing%29和http://www.linuxjournal.com/article/9001。 –