在Solaris上使用dtrace,我可以使用以下脚本为从开始到control-C的时间间隔累积给定进程(或execname)的on-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)。
这样做的最佳方式是什么?
答案 0 :(得分: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);
}