我试图弄清楚taskstats结构中的统计数据是如何相加的。我写了一个简单的C程序,运行一段时间做IO和退出。我使用taskstats结构监控这个程序的状态,这是从taskstats netlink多播组获得的。当我对cpu_delay_totalblkio_delay_totalswapin_delay_totalfreepages_delay_totalac_utimeac_stime的值求和时,得到的值比经过时间(ac_etime)的值大0.5秒左右。
以下是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
尽管taskstats.h中的注释明确指出这是一个挂钟时间,但cpu_run_real_total字段是否给出了CPU时间?为什么这些字段的总和大于经过的时间?
我的内核版本是3.2.0-38。

最佳答案

(1)CPU_run_real_total=AC_utime+AC_stime,我检查./kernel/delayacct.c中的代码,函数u 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运行的实际总数是utime和stime的总和。
(2)为什么CPU延迟总计、BLKIO延迟总计、Swapin延迟总计、FreePages延迟总计、AC Utime和AC Utime的值之和大于AC Utime的值?
我还不知道为什么。但我猜:这个时间可能与各种延迟计数器有些重叠。

关于linux - taskstats统计未加起来,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15353624/

10-12 17:17