2

Solaris で dtrace を使用すると、次のスクリプトを使用して、start から control-C までの間隔で、特定のプロセス (または execname) のオン 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);
}

(累積された時間には、ナノ/マイクロ秒の累積を可能にする細粒度があります。)

同じ時間枠で、配列内のすべてまたは多くのプロセスを累積し、ブレーク (^C) で累積されたすべての CPU 時間を報告したいと考えています。

これを行う最善の方法は何ですか?

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 に答える