次のようなパラメータでプログラムをプロファイリングしたい場合があります:
- ユーザーモードでのプログラムの所要時間
- カーネル モードでのプログラムの所要時間
- プログラムによる平均メモリ使用量
- など
Linux には、この目的のために特別に設計されたユーティリティ「time」があります。ユーティリティ「time」は、プログラム名を入力として受け取り、プログラムが使用するリソースに関する情報を表示します。また、コマンドがゼロ以外のステータスで存在する場合、このユーティリティは警告メッセージと終了ステータスを表示します。
「時間」の構文は次のとおりです:
/usr/bin/time [options] program [arguments]
上記の構文では、「オプション」は、特定の機能を設定または設定解除するために「時間」ユーティリティに渡すことができるオプションのフラグ/値のセットを指します。利用可能な時間コマンド オプションは次のとおりです:
- -v, –verbose :このオプションは、出力の詳細な説明が必要な場合に渡されます。
- –quite :このオプションは、「time」ユーティリティがプログラムのステータスを報告するのを防ぎます。
- -f, –format :このオプションを使用すると、ユーザーは「時間」ユーティリティの出力形式を制御できます。
- -p, –portability :このオプションは、次の出力形式を設定して、出力を POSIX に準拠させます
real %e user %U sys %S
「time」コマンドを実行すると、次のような出力が得られます:
# /usr/bin/time ls anaconda-ks.cfg bin install.log install.log.syslog mbox 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3888maxresident)k 0inputs+0outputs (0major+304minor)pagefaults 0swaps
上記のように、コマンドの実行とは別に、出力の最後の 2 行は「time」コマンドが出力するリソース情報です。
注:上記の例では、コマンド「time」がオプションなしで実行されました。したがって、これは「time」コマンドによって生成されるデフォルトの出力であり、適切にフォーマットされていません。
出力からわかるように、生成される出力のデフォルト形式は次のとおりです:
%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps
フォーマット オプション
このオプションにより、ユーザーは「time」コマンドによって生成される出力を決定できます。前のセクションでは、出力で使用されるデフォルトの形式について説明しました。このセクションでは、カスタマイズされたフォーマットを指定する方法を学びます。
フォーマット文字列は通常、プレーンテキストが散在する「リソース指定子」で構成されます。フォーマット文字列にパーセント記号 (`%') があると、次の文字がリソース指定子として解釈されます。
バックスラッシュ (`\') は、出力時に単一の印刷文字に変換される「バックスラッシュ エスケープ」を導入します。 `\t' はタブ文字を出力し、`\n' は改行を出力し、`\\' はバックスラッシュを出力します。バックスラッシュの後に他の文字が続くと、疑問符 (`?') とバックスラッシュが出力され、無効なバックスラッシュ エスケープが指定されたことを示します。
フォーマット文字列のその他のテキストはそのまま出力にコピーされます。 time は常にリソース使用情報を出力した後に改行を出力するため、通常、フォーマット文字列は改行文字 (または `0) で終了しません。
例:
$ /usr/bin/time -f "\t%U user,\t%S system,\t%x status" date Sun Jan 22 17:46:58 IST 2012 0.00 user, 0.00 system, 0 status
上記の例では、別の出力形式を使用して出力形式を変更しようとしたことがわかります。
リソース
「時間」ユーティリティはプログラムによるリソースの使用状況に関する情報を表示することを上で説明したので、このセクションでは、このユーティリティで追跡できるリソースと対応する指定子をリストします。
マニュアルページから:
- C – 時間を計るコマンドの名前とコマンド ライン引数。
- D – プロセスの非共有データ領域の平均サイズ (キロバイト単位)。
- E – プロセスで使用された実際の経過時間 (ウォール クロック) ([時間:]分:秒)。
- F – プロセスの実行中に発生した主要な、または I/O が必要なページ フォールトの数。これらは、ページが実際にプライマリ メモリから移動した場合のエラーです。
- I – プロセスによるファイル システム入力の数
- K – プロセスの平均合計 (データ + スタック + テキスト) メモリ使用量 (キロバイト単位)。
- M – 存続期間中のプロセスの常駐セットの最大サイズ (キロバイト単位)。
- O – プロセスによるファイル システム出力の数
- P – このジョブが取得した CPU の割合。これは、ユーザー + システム時間を総実行時間で割ったものです。パーセント記号も表示されます。
- R – マイナーまたは回復可能なページ フォールトの数。これらは、有効ではない (したがってエラーになる) ページですが、他の仮想ページによってまだ要求されていません。したがって、ページ内のデータは引き続き有効ですが、システム テーブルを更新する必要があります。
- S – プロセスに代わってシステムが (カーネル モードで) 使用した合計 CPU 秒数 (秒単位)。
- U – プロセスが (ユーザー モードで) 直接使用した CPU 秒の合計数 (秒単位)。
- W – プロセスがメイン メモリからスワップアウトされた回数
- X – プロセスで共有されたテキストの平均量 (キロバイト単位)。
- Z – システムのページ サイズ (バイト単位)。これはシステムごとの定数ですが、システムによって異なります。
- c – プロセスが無意識にコンテキスト切り替えされた回数 (タイム スライスの期限が切れたため)。
- e – プロセスによって使用された実際の経過時間 (ウォール クロック) (秒単位)。
- k – プロセスに配信されたシグナルの数
- p – プロセスの非共有スタックの平均サイズ (キロバイト単位)。
- r – プロセスが受信したソケット メッセージの数
- s – プロセスによって送信されたソケット メッセージの数
- t – プロセスの常駐セットの平均サイズ (キロバイト単位)。
- w – I/O 操作が完了するのを待っている間など、プログラムが自発的にコンテキスト切り替えされた回数。
- x – コマンドの終了ステータス。
したがって、「時間」ユーティリティで使用状況を追跡できるリソースの長いリストがあることがわかります。
なぜ/usr/bin/time? (ただの時間ではなく)
/usr/bin/time を使用せず、代わりに「time」を使用しましょう。
$ time -f "\t%U user,\t%S system,\t%x status" date -f: command not found real 0m0.255s user 0m0.230s sys 0m0.030s
上記の出力からわかるように、「time」コマンドを完全なパス (/usr/bin/time) なしで使用すると、「-f」フラグに関するエラーが発生します。また、出力の形式は、コマンドで指定した形式でも、前述のデフォルト形式でもありません。これにより、この出力がどのように生成されたかについて混乱が生じました。
完全なパス(/usr/bin/time)なしで「time」コマンドを実行すると、bash シェルの組み込みの「time」コマンドが実行されます。
- 「man time」を使用して、/usr/bin/time の man ページを表示します
- 組み込みの bash time に関する情報を表示するには、「ヘルプ タイム」を使用してください。