2

我试图弄清楚 taskstats 结构中的统计数据是如何相加的。我写了一个简单的 C 程序,它运行了一段时间做 IO 并退出。我使用从 taskstats netlink 多播组获得的 taskstats 结构来监视该程序的统计信息。当我对cpu_delay_totalblkio_delay_totalswapin_delay_total、和的值求和时freepages_delay_total,我得到一个比经过时间 ( )的值大约 0.5 秒的值ac_utimeac_stimeac_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尽管 taskstats.h 中的注释明确指出这是挂钟时间,但该字段是否给出了 cpu 时间?这些字段的总和大于经过时间的原因可能是什么?

我的内核版本是 3.2.0-38。

4

1 回答 1

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的值大?

我还没弄清楚为什么。但我猜想:时间可能与各种 *_delay_total 计数器有些重叠。

于 2013-03-12T06:24:46.977 回答