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 で負荷をかける
yum
で stress
パッケージをインストールします。
$ sudo yum install -y stress
10秒間、4CPUに負荷をかけます。
$ time stress -t 10 -c 4
裏で htop コマンドで負荷を確認すると、user CPUが100%ではりついています。
実行結果
実際の結果はというと
$ 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 という結果が得られました。
2 thoughts on “real time/user CPU time/system CPU timeの違いをメモ”