2013-03-12 89 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計數器有所重疊。