2

在 Solaris 上使用 dtrace,我可以使用以下脚本在从 start 到 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)。

做这个的最好方式是什么?

4

1 回答 1

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);
}
于 2013-02-12T05:49:01.493 回答