2013-02-11 52 views
2

在Solaris上使用DTrace,我能夠積聚在CPU的時間對於一個給定的過程(或execname)的時間間隔從開始到控制-C與下面的腳本:如何顯示使用dtrace每個進程消耗的微秒cpu?

!/usr/sbin/dtrace -qs 
dtrace:::BEGIN { 
     total = 0; 
} 
sched:::on-cpu 
/execname == $$1/ 
{ 
     self->start = vtimestamp; 
} 
sched:::off-cpu 
/self->start/ 
{ 
     this->time = vtimestamp - self->start; 
     total += this->time; 
     self->start = 0; 
} 
dtrace:::END { 
     printf("Total Time on CPU: %d us\n",total/1000); 
} 

(累計時間有細粒度允許納秒/微秒積累)。

在同一時間段內,我想積累一個數組中的全部或多個進程並報告所有累積的CPU時間(^ C)。

這樣做的最好方法是什麼?

回答

3

好的,多一點工作,我已經解決了我的問題。

以下是在整個時間間隔內爲所有進程獲得微秒(但顯示每個進程)的方法。

#!/usr/sbin/dtrace -qs 

dtrace:::BEGIN { 
     total = 0; 
     starttimestamp=timestamp; 
     printf("Starting...\n"); 
} 

sched:::on-cpu 
/pid!=0/ 
{ 
     self->start = vtimestamp; 
} 

sched:::off-cpu 
/self->start && pid!=0/ 
{ 
     this->time = vtimestamp - self->start; 
     total += this->time; 

     @proctime[pid,uid,execname,curpsinfo->pr_psargs] = sum(this->time/1000); 

     self->start = 0; 
} 
dtrace:::END { 
     printf("Elapsed time %d usec\n",(timestamp-starttimestamp)/1000); 
     printf("Total Time on CPU: %d us\n",total/1000); 
     printa(@proctime); 
}