2

taskstats 構造体の統計がどのように加算されているかを把握しようとしています。私は、IO と終了を実行してしばらく実行する単純な C プログラムを作成しました。taskstats ネットリンク マルチキャスト グループから取得した taskstats 構造体を使用して、このプログラムの統計情報を監視します。cpu_delay_totalblkio_delay_totalswapin_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 で割ってマイクロ秒に変換します)、whileetime3536036!

興味深いことに、壁時計の時間は実質的に utime+stime:cpu_run_real_total: 3204000129に等しい値を示します。ac_utime + ac_stime: 3204000

cpu_run_real_totaltaskstats.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 の値よりも大きいのはなぜですか?

理由はわかりません。しかし、私は推測しています: stime は、さまざまな *_delay_total カウンターと多少オーバーラップする可能性があります。

于 2013-03-12T06:24:46.977 に答える