2010-07-13 71 views
1
過程

如何檢查多久的過程花費在Linux中等待CPU?CPU爭(等待時間),在Linux中

例如,在加載的系統我想檢查SQL*Loader(SQLLDR)過程中等待的時間。

,如果有一個命令行工具來做到這一點這將是有益的。

回答

1

我很快就把這一起打了一遍。它打印出任務切換中最小和最大的「干擾」...

#include <sys/time.h> 
#include <stdio.h> 

double seconds() 
{ 
    timeval t; 
    gettimeofday(&t, NULL); 
    return t.tv_sec + t.tv_usec/1000000.0; 
} 

int main() 
{ 
    double min = 999999999, max = 0; 
    while (true) 
    { 
     double c = -(seconds() - seconds()); 
     if (c < min) 
     { 
      min = c; 
      printf("%f\n", c); 
      fflush(stdout); 
     } 
     if (c > max) 
     { 
      max = c; 
      printf("%f\n", c); 
      fflush(stdout); 
     } 
    } 

    return 0; 
} 
+1

你測量的是調度延遲,而不是爭用延遲。 – 2010-07-14 11:00:37

+0

我錯過了「我想檢查一下sqlldr進程等待的時間」部分。 我的測試顯示了它沒有花費在CPU上的最長時間。 ps -elF顯示花費的CPU總時間。 我想知道更準確的是/ proc/ /。 可以拍攝快照,運行長查詢並再次檢查。 未花費在CPU上的數量是時間流逝減去與CPU一起花費的時間,類似的東西。 – Mike 2010-07-15 01:10:58

1

下面介紹如何進行測量。有多個進程,大於你的processors * cores * threading capability等待(阻止)事件的數量,這些事件會同時喚醒它們。一個這樣的事件是多播網絡分組。使用類似PAPI(或更符合您的需求的儀器庫)來測量您的流程之間實際和虛擬「喚醒」時間的差異。從實驗的幾次迭代中,您可以估算出您的過程的CPU爭用時間。很明顯,對於多核處理器來說,這並不準確,但它可能會對你有所幫助。

乾杯。

1

我有一段時間回到這個問題。我結束了使用getrusage: 您可以得到詳細的幫助: http://www.opengroup.org/onlinepubs/009695399/functions/getrusage.html

getrusage填充rusage結構。


測量等待時間用的getrusage

你可以在你的代碼的開頭調用的getrusage,然後再在最後調用它,或者在執行過程中的一些合適的點。你有initial_rusage和final_rusage。您的進程花費的用戶時間用rusage-> ru_utime.tv_sec表示,進程花費的系統時間用rusage-> ru_stime.tv_sec表示。

因此,通過該過程花費的總的用戶的時間將是: user_time = final_rusage.ru_utime.tv_sec - initial_rusage.ru_utime.tv_sec

由過程所花費的總系統時間將是: SYSTEM_TIME = final_rusage.ru_stime.tv_sec - initial_rusage.ru_stime.tv_sec

如果TOTAL_TIME是的getrusage的兩個電話之間經過,則等待時間會 WAIT_TIME = TOTAL_TIME時間 - (user_time + SYSTEM_TIME)

希望這會他lps