real time/user CPU time/system CPU timeの違いをメモ

time(1) コマンドの出力内容

Linux で time(1) コマンドを実行すると、real time/user CPU time/system CPU timeが出力されます。

$ time prog

real    0m0.200s
user    0m0.098s
sys     0m0.004s

わかるような、わからないようなこの出力される時間の意味についてメモします。

各フィールドについて

Real time について

どの処理に時間がかかっているかはさておき、プログラムの開始から終了までを計測した時間

wall clock timeや wall time と呼ばれることもある。

User CPU time について

プログラムがユーザースペースで CPU が利用された時間

ライブラリコードの実行などがここに含まれます

System CPU timeについて

プログラムがカーネススペースで CPU が利用された時間

システムコール(例えば disk I/O で使う read/write)の実行などがここに含まれます。

User/System CPU time が増えないケース

ネットワークを介するプログラムは、通信の待ちが長いため、 CPU time を合算しても Real time よりはるかに少ない事が多いです。

sleep 処理も CPU は指定時間 idle 状態で busy ではないため、CPU time には加算されません。

Real time < User CPU time となるケース

マルチスレッドプログラムや fork しているプログラムで表示される CPU タイムは、マルチスレッドで言えば、スレッド全体、fork であれば親子の CPU time を合算したものが利用されます。

例えば、マルチコアなマシーンで、マルチスレッドプログラムを実行すると、 Real time < user CPU time となることもあります。

実際にこの動きを確認してみましょう。

検証

検証方法

N コアCPU なマシーンを用意し、負荷テストツール stress でコア数分の CPU に CPU 100% となる負荷を T 秒間かけます。

time でこの負荷を計測すると

  • Real timeは T 秒
  • user CPU time は T x N 秒

となれば期待通りです。

検証環境

4 コアな Linux マシーンがあったので、この上で実験します。

$ cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

stress で負荷をかける

yumstress パッケージをインストールします。

$ sudo yum install -y stress

10秒間、4CPUに負荷をかけます。

$ time stress -t 10 -c 4

裏で htop コマンドで負荷を確認すると、user CPUが100%ではりついています。

stress htop

実行結果

実際の結果はというと

$ time stress -t 10 -c 4
stress: info: [2712] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [2712] successful run completed in 10s

real    0m10.001s
user    0m39.924s
sys     0m0.000s

ということで想定通り user = real x 4 という結果が得られました。

References

2 thoughts on “real time/user CPU time/system CPU timeの違いをメモ

Leave a comment