taskstats统计数据没有加起来

时间:2013-03-12 04:57:47

标签: linux linux-kernel process-accounting

我试图找出taskstats结构中的统计信息是如何累加的。我写了一个简单的C程序,运行一段时间做IO和退出。我使用taskstats结构监视此程序的统计信息,我从taskstats netlink多播组获取该结构。当我对cpu_delay_totalblkio_delay_totalswapin_delay_totalfreepages_delay_totalac_utimeac_stime的值求和时,得到的值约为0.5秒大于经过时间的值(ac_etime

以下是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。

1 个答案:

答案 0 :(得分: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和stime的总和。

(2)为什么求和cpu_delay_total,blkio_delay_total,swapin_delay_total,freepages_delay_total,ac_utime和ac_stime的值,该值是否大于ac_etime的值?

我还没弄清楚原因。但是我猜测:stime可能与各种* _delay_total计数器有些重叠。