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

Posted

技术标签:

【中文标题】如何使用 dtrace 显示每个进程消耗的微秒 cpu?【英文标题】:How can I display microseconds cpu consumed per process using dtrace? 【发布时间】:2013-02-11 06:14:38 【问题描述】:

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

最好的方法是什么?

【问题讨论】:

【参考方案1】:

好的,我已经解决了我的问题。

这是获取间隔内所有进程(但显示每个进程)的微秒数的方法。

#!/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);

【讨论】:

以上是关于如何使用 dtrace 显示每个进程消耗的微秒 cpu?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dtrace 确定进程的最大内存使用量

dtrace 将在将来运行的用户进程

1.linux平均负载

如何使用 dtrace 进行挂钟分析?或者,如何使用配置文件提供程序计算进程未运行的样本?

如何编写 dtrace 脚本来转储 Solaris 10 上崩溃进程的堆栈?

如何使用 Dtrace 计算任意 C 语句之间的时间