我试图找出taskstats结构中的统计信息是如何累加的。我写了一个简单的C程序,运行一段时间做IO和退出。我使用taskstats结构监视此程序的统计信息,我从taskstats netlink多播组获取该结构。当我对cpu_delay_total
,blkio_delay_total
,swapin_delay_total
,freepages_delay_total
,ac_utime
和ac_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。
答案 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计数器有些重叠。