如何使用dtrace显示每个进程消耗的微秒cpu?

时间:2013-02-11 06:14:39

标签: process solaris cpu dtrace

在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)。

这样做的最佳方式是什么?

1 个答案:

答案 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);
}