2014-02-07 88 views
28

好吧,我自己是一個Windows用戶,所以我對Linux-y類型的知識有點受限。瞭解負載平均值與CPU使用率的關係

然而,我的一般理解是,「平均負載」表示在任何給定時間,平均在最後一分鐘,五分鐘和......十五分鐘內處理了多少處理數據?

無論如何,我一直在監視我的服務器,因爲我們有一個很大的開放和很多人!

See?

我一直在看top並發現了一些似乎違背了什麼,我想我知道。

如果負載平均值爲7,並且有4個超線程處理器,那麼這是否意味着CPU正在工作到大約7/8的容量?

爲什麼當時顯示50.0%的ID?一半時間閒置怎麼樣?

我沒有收到吧XD

+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。 –

回答

87

首先,top不算load average本身。它只是從/proc/loadavg文件中讀取load averagestrace顯示top打開/proc/loadavg,然後定期從中讀取)。 man proc說,這對於/proc/loadavg

的/ proc/loadavg

在該文件中的前三個字段是負載給予 的作業數量在運行隊列中(狀態R)或等待磁盤I平均數字/ D (狀態D)平均在1,5和15分鐘。它們與運行時間(1)和其他程序給出的平均負載數相同。 第四個字段由用斜槓(/)分隔的兩個數字組成。其中第一個是當前正在執行的內核調度實體(進程,線程)的數量;這將小於或等於 個CPU數量。斜線後面的值是系統上當前存在的內核 調度實體的數量。第五個 字段是最近在系統上創建的過程的PID。

因此load average顯示了運行隊列中的作業數量。你會看到從/proc/loadavgtop的前三個值。如果您運行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; 
} 
+0

對不起,遲到回覆你 - 我必須錯過我的電源堆棧溢出這個問題的通知!但+1和接受一個非常徹底的答案。謝謝! –

+0

即使skwllsp已經給出了詳細的答案,但很難通過平均負載vs不。正在運行的進程。所以要了解它有一個簡單的公式,即對於單個CPU機器,平均負載1表示100%cpu利用率...而論壇4 CPU機器平均負載4表示100%cpu利用率,所以平均負載1用於4 CPU機器裝置25%的CPU利用率.. –