ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
マニュアルページセクション 1: ユーザーコマンド Oracle Solaris 11 Information Library (日本語) |
- CPU パフォーマンスカウンタによるプロセスと LWP 動作の監視
cputrack -c eventspec [-c eventspec]... [-efntvD] [-N count] [-o pathname] [-T interval] command [args]
cputrack -c eventspec [-c eventspec]... -p pid [-efntvD] [-N count] [-o pathname] [-T interval]
cputrack -h
cputrack ユーティリティーを使用すると、システムで実行中のプロセスまたはプロセスファミリの動作を CPU パフォーマンスカウンタで監視できます。interval に -T オプションが指定されている場合、cputrack は interval 秒間隔でアクティビティーをサンプリングする処理を永久に繰り返します。count に -N オプションが指定されている場合、追跡するプロセスごとに、統計が count 回繰り返されます。どちらも指定されていない場合、間隔は 1 秒になります。command およびオプションの args が指定されている場合、cputrack は指定された CPU パフォーマンスイベントの監視中に設定された引数を使用してコマンドを実行します。あるいは、-p オプションを使用すると、既存のプロセスのプロセス ID を指定できます。
cputrack は非特権プログラムであるため、truss(1) と同様の制限に従います。たとえば、setuid(2) 実行可能ファイルは追跡できません。
次のオプションがサポートされています。
監視する CPU パフォーマンスカウンタ用のイベントセットを指定します。これらのイベント指示子の構文を次に示します。
[picn=]eventn[,attr[n][=val]][,[picn=]eventn [,attr[n][=val]],...,]
-h オプションを使用すると、使用可能なイベントと属性の一覧を取得できます。これにより、使用法に関するメッセージが表示されます。明示的なカウンタの割り当ては省略できます。その場合、cpustat は有効なカウンタの選択を自動的に試みます。
属性値は、strtoll(3C) に適した形式 (16 進数、8 進数、または 10 進数) で表記できます。イベント指示子の属性に明示的な値が指定されていない場合、デフォルト値の 1 が使用されます。対応するカウンタ番号のない属性は、指示子内のすべてのカウンタに適用されます。
これらのイベント指示子のセマンティクスを確認するには、CPU の製造元のドキュメントでイベントに関する記述を参照してください。
-c オプションは複数指定できます。その場合、cputrack はサンプルごとに異なるイベント設定に切り替えます。
デバッグモードを有効にします。
ユーティリティーの使用方法、プロセッサに依存するカウンタのプログラミング方法、および詳細情報の参照先に関する拡張ヘルプメッセージを出力します。
すべてのヘッダー出力を省略します (cputrack がパイプラインの先頭である場合)。
終了前に取得する CPU パフォーマンスカウンタのサンプルの最大数を指定します。
cputrack の出力に使用するファイルを指定します。
引数を、プロセスカウンタのコンテキストを追加して監視しなければならない既存プロセスのプロセス ID として解釈します。
出力にプロセッサのサイクル数の列を追加します (現在のアーキテクチャーで可能な場合)。
CPU パフォーマンスカウンタのサンプリング間隔を秒単位で指定します。間隔が短すぎると、一部のサンプリングがスキップされることがあります。「警告」を参照してください。
詳細情報の出力を有効にします。
オペレーティングシステムは、プロセスの追跡に一定の制限を課します。具体的には、ユーザーは、自身が読み取りできないオブジェクトファイルを持つコマンドを追跡することはできません。set-uid と set-gid を持つコマンドは、特権ユーザー以外は追跡できません。特権ユーザーが実行する場合を除き、cputrack は set-id または読み取り不可能なオブジェクトファイルの exec() を実行するプロセスを制御できません。このようなプロセスは、 cputrack からは独立して、exec() ポイントで通常どおり処理を継続します。
-f オプションを使用した場合、システムがユーザーごとのプロセススロットを使い果たしてしまう場合があります。これは、cputrack が、追跡するプロセスごとに 1 つの制御プロセスを実行するためです。
cputrack が出力する時間は、ハードウェアカウンタが実際にサンプリングされた時間に対応します。この時間は、gethrtime(3C) と同じタイムベースから決定されます。
cputrack ユーティリティーは、パフォーマンスカウンタのコンテキストを検査対象の各プロセスに追加します。このコンテキストが存在する場合、パフォーマンスカウンタをシステム上のさまざまなプロセス間で多重化できます。ただし、cpustat(1M) ユーティリティーと同時には使用できません。
cpustat ユーティリティーのインスタンスが実行されると、cpustat のインスタンスをすべて終了しないかぎり、cputrack をさらに実行しようとしても失敗します。
場合によっては、cputrack の柔軟性が非常に高く、多くの統計情報が出力されるために、監視コードが必要以上にアプリケーションに追加されることがあります。ただし、より厳密な制御をした方が望ましい場合があります。アプリケーション自体、および cputrack によりアプリケーション内に注入されるエージェント LWP が同じパフォーマンスカウンタのコンテキストを使用するため、アプリケーションでカウンタコンテキストを対話的に処理して、興味深い機能を実現できます。cpc_enable(3CPC) を参照してください。
-t オプションで有効されたプロセッサのサイクル数は、パフォーマンスカウンタのレジスタに適用された設定に関係なく、常にユーザーモードとシステムモードの両方に適用されます。
cputrack の出力は nawk(1) や perl(1) を使用すると簡単に解析できるように設計されているため、cputrack をスクリプトに埋め込むことによってパフォーマンスツールを作成できます。あるいは、cputrack が構築された同じ API (libcpc(3LIB) や libpctx(3LIB) の機能) を使用すると、ツールを直接構築できます。cpc(3CPC) を参照してください。
cputrack はパフォーマンスカウンタのコンテキストを使用して LWP ごとに個別のパフォーマンスカウンタを管理しますが、カウント可能なイベントの一部は、特に (キャッシュ失敗率) のようにプロセス間で共有されるリソースが限定されている場合、システムで発生するほかのアクティビティーの影響を必ず受けます。このようなイベントでは、cpustat(1M) を使用してシステムの動作全体を監視してみるのもよいでしょう。
-T interval オプションでは、interval をゼロに指定すると定期的なサンプリングは実行されません。パフォーマンスカウンタがサンプリングされるのは、プロセスが LWP を作成または破棄したり、fork(2)、exec(2)、または exit(2) を呼び出したりする場合だけです。
例 1 パフォーマンスカウンタを使用してクロックサイクルをカウントする
この例では、UltraSPARC-III+ プロセッサを搭載したマシンでユーティリティーを使用しています。カウンタは、sleep(1) コマンドの実行中に、プロセッサのクロックサイクルおよびユーザーモードで送信された命令をカウントするように設定されています。
example% cputrack –c pic0=Cycle_cnt,pic1=Instr_cnt sleep 10 time lwp event pic0 pic1 1.007 1 tick 765308 219233 2.007 1 tick 0 0 4.017 1 tick 0 0 6.007 1 tick 0 0 8.007 1 tick 0 0 10.007 1 tick 0 0 10.017 1 exit 844703 228058
例 2 外部キャッシュの参照と失敗をカウントする
この例では、UltraSPARC マシンで単純なシェルスクリプトの fork() および exec() を追跡しながら、より詳細な情報を出力します。カウンタは、外部キャッシュの参照と失敗の数を測定します。pic0 および pic1 の名前は、混同される可能性がなければ明示的に指定する必要はありません。
example% cputrack –fev –c EC_ref,EC_hit /bin/ulimit –c time pid lwp event pic0 pic1 0.007 101142 1 init_lwp 805286 20023 0.023 101142 1 fork # 101143 0.026 101143 1 init_lwp 1015382 24461 0.029 101143 1 fini_lwp 1025546 25074 0.029 101143 1 exec 1025546 25074 0.000 101143 1 exec \ # '/usr/bin/sh /usr/bin/basename\ /bin/ulimit' 0.039 101143 1 init_lwp 1025546 25074 0.050 101143 1 fini_lwp 1140482 27806 0.050 101143 1 exec 1140482 27806 0.000 101143 1 exec # '/usr/bin/expr \ //bin/ulimit : \(.*[^/]\)/*$ : .*/\(..*\) : \(.*\)$ | //bin/ulimi' 0.059 101143 1 init_lwp 1140482 27806 0.075 101143 1 fini_lwp 1237647 30207 0.075 101143 1 exit 1237647 30207 unlimited 0.081 101142 1 fini_lwp 953383 23814 0.081 101142 1 exit 953383 23814
例 3 命令をカウントする
この例では、Pentium III マシンで日付を出力するためにアプリケーションおよびカーネルで実行された命令の数を表示します。
example% cputrack –c inst_retired,inst_retired,nouser1,sys1 date time lwp event pic0 pic1 Fri Aug 20 20:03:08 PDT 1999 0.072 1 exit 246725 339666
例 4 TLB のヒット回数をカウントする
この例では、Pentium 4 マシンでプロセッサ固有の属性を使用して TLB のヒット回数をカウントする方法を示します。
example% cputrack -c ITLB_reference,emask=1 date time lwp event pic0 Fri Aug 20 20:03:08 PDT 1999 0.072 1 exit 246725
cpustat(1M) ユーティリティーのインスタンスを実行すると、既存のすべてのパフォーマンスカウンタのコンテキストがマシン全体で強制的に無効にされます。その結果、cputrack コマンドのすべての呼び出しが不特定なエラーで途中終了する可能性があります。
cpustat が、Solaris でサポートされていない CPU パフォーマンスカウンタの存在するシステムで呼び出されると、次のメッセージが表示されます。
cputrack: cannot access performance counters - Operation not applicable
このエラーメッセージは、cpc_open() が失敗したことを意味し、cpc_open(3CPC) に記述されています。この問題および実行可能な解決方法については、このドキュメントを参照してください。
短い間隔を要求した場合、cputrack が目的のサンプルレートに追従できないことがあります。この場合は、サンプルの一部が省略されることがあります。
属性についての詳細は、attributes(5) を参照してください。
|
nawk(1), perl(1), proc(1), truss(1), prstat(1M), cpustat(1M), exec(2), exit(2), fork(2), setuid(2), vfork(2), gethrtime(3C), strtoll(3C), cpc(3CPC), cpc_bind_pctx(3CPC), cpc_enable(3CPC), cpc_open(3CPC), libcpc(3LIB), libpctx(3LIB), proc(4), attributes(5)