2013-03-12 90 views
2

我想弄清楚taskstats结构中的统计信息如何加起来。我写了一个简单的C程序,它运行一段时间并执行IO并退出。我使用taskstats结构来监视这个程序的统计信息,我从taskstats netlink多播组中获得这个结构。当我总结的cpu_delay_totalblkio_delay_totalswapin_delay_totalfreepages_delay_totalac_utimeac_stime的值,得到了一个值,该值比所经过的时间的值大约0.5秒(ac_etimetaskstats stats not add up

这里有一个3.5秒的统计信息运行:

ac_etime: 3536036 ac_utime: 172000 ac_stime: 3032000 cpu_delay_total: 792528445 blkio_delay_total: 46320128 swapin_delay_total: 0 freepages_delay_total: 0

总结值延迟,UTIME和STIME产量4042848.573(除以1000的延迟转换到微秒),而etime只有3536036

有趣的是,挂钟时间给出了实际上等于UTIME + STIME值:cpu_run_real_total: 3204000129,而ac_utime + ac_stime: 3204000

是否cpu_run_real_total领域给予的CPU时间,尽管在taskstats.h评论明确指出,这是一个挂钟时间?这些字段的总和大于经过时间的原因是什么?

我的内核版本是3.2.0-38。

回答

0

(1)cpu_run_real_total = ac_utime + ac_stime,我检查./kernel/delayacct.c代码,功能__delayacct_add_tsk():

tmp = (s64)d->cpu_run_real_total; 
cputime_to_timespec(tsk->utime + tsk->stime, &ts); 
tmp += timespec_to_ns(&ts); 
d->cpu_run_real_total = (tmp < (s64)d->cpu_run_real_total) ? 0 : tmp; 

从上面的代码中,我们知道cpu_run_real_total是总和UTIME并冷静起来。 (2)为什么总和cpu_delay_total,blkio_delay_total,swapin_delay_total,freepages_delay_total,ac_utime和ac_stime的值,该值大于ac_etime的值?

我还没弄明白为什么。但我猜测:stime可能会与各种* _delay_total计数器有所重叠。