Go to main content
マニュアルページ セク ション 1: ユー ザーコマンド

印刷ビューの終了

更新: 2016年12月6日
 
 

cputrack(1)

名前

cputrack - 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 オプションが指定されている場合、cputrackinterval 秒間隔でアクティビティーをサンプリングする処理を永久に繰り返します。–N オプションに count が指定されている場合は、追跡されるプロセスごとに統計が count 回繰り返されます。どちらも指定されていない場合、間隔は 1 秒になります。command およびオプションの args が指定されている場合、cputrack は指定された CPU パフォーマンスイベントの監視中に設定された引数を使用してコマンドを実行します。あるいは、–p オプションを使用すると、既存のプロセスのプロセス ID を指定できます。

cputrack は非特権プログラムであるため、truss(1) に適用されるのと同じ制限に従います。たとえば、setuid(2) 実行可能ファイルは追跡できません。

オプション

サポートしているオプションは、次のとおりです。

–c eventspec

監視する CPU パフォーマンスカウンタ用のイベントセットを指定します。これらのイベント指示子の構文を次に示します。


[picn=]eventn[,attr[n][=val]][,[picn=]eventn
     [,attr[n][=val]],...,]

–h オプションを使用すると、使用可能なイベントと属性の一覧を取得できます。これにより、使用法に関するメッセージが表示されます。明示的なカウンタの割り当ては省略できます。その場合、cpustat は有効なカウンタの選択を自動的に試みます。

属性値は、strtoll(3C) に適した形式 (16 進数、8 進数、または 10 進数) で表現できます。イベント指示子の属性に明示的な値が指定されていない場合、デフォルト値の 1 が使用されます。対応するカウンタ番号のない属性は、指示子内のすべてのカウンタに適用されます。

これらのイベント指示子のセマンティクスを確認するには、CPU の製造元のドキュメントでイベントに関する記述を参照してください。

–c オプションは複数指定できます。その場合、cputrack はサンプルごとに異なるイベント設定に切り替えます。

–D

デバッグモードを有効にします。

–e

すべての exec(2)、または execve(2) システムコールを追跡します。

–f

fork(2)fork1(2)、または vfork(2) システムコールによって作成されたすべての子を追跡します。

–h

ユーティリティーの使用方法、プロセッサに依存するカウンタのプログラミング方法、および詳細情報の参照先に関する拡張ヘルプメッセージを出力します。

–n

すべてのヘッダー出力を省略します (cputrack がパイプラインの先頭である場合)。

–N count

終了前に取得する CPU パフォーマンスカウンタのサンプルの最大数を指定します。

–o outfile

cputrack の出力に使用するファイルを指定します。

–p pid

引数を、プロセスカウンタのコンテキストを追加して監視しなければならない既存プロセスのプロセス ID として解釈します。

–t

出力にプロセッサのサイクル数の列を追加します (現在のアーキテクチャーで可能な場合)。

–T interval

CPU パフォーマンスカウンタのサンプリング間隔を秒単位で指定します。間隔が短すぎると、一部のサンプリングがスキップされることがあります。「警告」を参照してください。

–v

詳細情報の出力を有効にします。

使用法

オペレーティングシステムは、プロセスの追跡に一定の制限を課します。具体的には、ユーザーは、自身が読み取りできないオブジェクトファイルを持つコマンドを追跡することはできません。setuid と setgid を持つコマンドは、特権ユーザー以外は追跡できません。特権ユーザーによって実行されないかぎり、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 を埋め込むことによってパフォーマンスツールを構成できます。あるいは、libcpc(3LIB)libpctx(3LIB) の機能を使用すると、cputrack が構築されているのと同じ API を使用してツールを直接構築できます。cpc(3CPC) を参照してください。

cputrack はパフォーマンスカウンタのコンテキストを使用して LWP ごとに個別のパフォーマンスカウンタを管理しますが、カウント可能なイベントの一部は、特に (キャッシュ失敗率) のようにプロセス間で共有されるリソースが限定されている場合、システムで発生するほかのアクティビティーの影響を必ず受けます。このようなイベントでは、cpustat(1M) を使用してシステムの動作全体を監視してみるのもよいでしょう。

–T interval オプションでは、interval をゼロに指定すると定期的なサンプリングは実行されません。パフォーマンスカウンタがサンプリングされるのは、プロセスが LWP を作成または破棄したり、fork(2)exec(2)、または exit(2) を呼び出したりする場合だけです。

SPARC

使用例 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 

x86

使用例 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) を参照してください。

属性タイプ
属性値
使用条件
diagnostic/cpu-counters
インタフェースの安定性
確実

関連項目

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)