2010-07-13 96 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