[linux]プロセスの消費リソース表示 その1

2015年9月28日月曜日

bash linux unix

Linuxでプロセスの実行時間を計測するのによく使われるのはtimeコマンドだろう。
例えば、以下のようにすれば実際にコマンド実行に10秒かかり、sleepなのでプロセッサ時間をほとんど消費していないことがわかる。

$ time sleep 10

real    0m10.003s
user    0m0.002s
sys     0m0.001s

伝統的なUnixのtimeコマンドは秒までしか表示しないけど、秒以下が小数点3桁まで表示されているのはtimeがBashの組み込みコマンドでPOSIXよりも機能が拡張されているからだ。
試しにtypeでtimeを調べてみると以下のように表示される。

$ type time
time はシェルの予約語です

一方、whichでtimeコマンドを探すと以下となる。

$ which time
/usr/bin/time
※実際はLinuxのディストリビューションによってパスは違う可能性がある。

こっちのtimeはなんだろうか。

$ /usr/bin/time sort -r foo.txt
0.00user 0.00system 0:10.00elapsed 100%CPU (0avgtext+0avgdata 1028maxresident)k
0inputs+0outputs (0major+316minor)pagefaults 0swaps

こちらはGNU版のtimeコマンドでより詳細な情報を表示してくれる。
そのままだと表示が見やすいとは言えないが、-vオプションを付けるとさらに詳細な項目を並べて表示してくれる。

$ /usr/bin/time -v sort -r foo.txt

        Command being timed: "sort -r foo.txt"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: 60%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 1024
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 317
        Voluntary context switches: 1
        Involuntary context switches: 105
        Swaps: 0
        File system inputs: 8
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

これでページフォールトの回数やIOの様子もお手軽に見ることができる。

※ちなみに1回めの-vなしのIO回数が0になっているのは-v付きを先にやってしまったためにfoo.txtがキャッシュに読み込まれてしまったからだと思う。。。
別のファイルで試したら、ちゃんと8inputsとかになった。