如何使用 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 进行挂钟分析?或者,如何使用配置文件提供程序计算进程未运行的样本?