Solaris 動的トレースガイド

第 24 章 vminfo プロバイダ

vminfo プロバイダは、vm カーネル統計情報のプローブを使用できるようにします。これらの統計情報は、vmstat(1M) などのシステム監視ユーティリティーへの入力を提供するので、vminfo プロバイダは、観測された異常動作の迅速な検査を可能にします。

プローブ

vminfo プロバイダは、vm に分類されるカーネル統計情報内のフィールドに対応したプローブを使用できるようにします。vminfo から提供されたプローブは、対応する vm 値が増分される直前に起動します。vm に分類されるカーネル統計情報の名前と現在の値を両方表示するには、以下の例に示すように、kstat(1M) コマンドを使用します。


$ kstat -n vm
module: cpu                             instance: 0
name:   vm                              class:    misc
        anonfree                        13
        anonpgin                        2620
        anonpgout                       13
        as_fault                        12528831
        cow_fault                       2278711
        crtime                          202.10625712
        dfree                           1328740
        execfree                        0
        execpgin                        5541
        ...

Table 23–1 に、表 24–1 プローブを一覧します。

表 24–1 vminfo プローブ

anonfree

ページングの一環として、変更されていない匿名ページが解放されたときに起動するプローブ。匿名ページとは、ファイルに関連したページを持たないページのことです。こうしたページは、ヒープメモリーやスタックメモリーのほか、zero(7D) の明示的なマッピングによって取得したメモリー内に存在します。

anonpgin

スワップデバイスから匿名ページがページインされたときに起動するプローブ。 

anonpgout

変更された匿名ページがスワップデバイスへページアウトされたときに起動するプローブ。 

as_fault

ページ上で、保護フォルト、書き込み時コピーフォルト以外のフォルトが発生したときに起動するプローブ。 

cow_fault

ページ上で書き込み時コピーフォルトが発生したときに起動するプローブ。arg0 には、書き込み時コピーの結果作成されたページの数が格納されます。

dfree

ページングの結果ページが解放されたときに起動するプローブ。dfree が起動すると、anonfreeexecfreefsfree のいずれかが続いて起動します。

execfree

ページングの結果、変更されていない実行可能ページが解放されたときに起動するプローブ。 

execpgin

バッキングストアから実行可能ページがページインされたときに起動するプローブ。 

execpgout

変更された実行可能ページがバッキングストアへページアウトされたときに起動するプローブ。ほとんどの場合、実行可能ページのページングは execfree によって行われます。execpgout は、メモリー内で実行可能ページに変更が加えられたときだけ起動します。ただし、このような状況はめったに起こりません。

fsfree

ページングの一環として、変更されていないファイルシステムデータページが解放されたときに起動するプローブ。 

fspgin

バッキングストアからファイルシステムページがページインされたときに起動するプローブ。 

fspgout

変更されたファイルシステムページがバッキングストアへページアウトされたときに起動するプローブ。 

kernel_asflt

ページ上でカーネルによるページフォルトが発生したとき、固有のアドレス空間で起動するプローブ。kernel_asflt の起動直前には必ず as_fault プローブが起動しているはずです。

maj_fault

ページフォルトの結果としてバッキングストアやスワップデバイスからの入出力が行われたときに起動するプローブ。maj_fault の起動直前には必ず pgin プローブが起動しているはずです。

pgfrec

解放されたページのリストからページが再生されたときに起動するプローブ。 

pgin

バッキングストアまたはスワップデバイスからページがページインされたときに起動するプローブ。このプローブは、maj_fault とは別のものです。maj_fault は、ページフォルトの結果としてページインが行われた場合にしか起動しません。これに対して、pgin は、理由はどうあれ、ページインが行われるたびに起動します。

pgout

バッキングストアまたはスワップデバイスへページがページアウトされたときに起動するプローブ。 

pgpgin

バッキングストアまたはスワップデバイスからページがページインされたときに起動するプローブ。pgpginpgin の唯一の違いは、pgpgin では arg0 にページインされたページ数が格納される点です。pgin では arg0 に必ず 1 が格納されます。

pgpgout

バッキングストアまたはスワップデバイスへページがページアウトされたときに起動するプローブ。pgpgoutpgout の唯一の違いは、pgpgout では arg0 にページアウトされたページ数が格納される点です。pgout では arg0 に必ず 1 が格納されます。

pgrec

ページが再生されたときに起動するプローブ。 

pgrrun

ページャがスケジュールされたときに起動するプローブ。 

pgswapin

スワップアウトされたプロセスからページがスワップインされたときに起動するプローブ。スワップインされたページの数は、arg0 に格納されます。

pgswapout

プロセスのスワップアウトの一環としてページがスワップアウトされたときに起動するプローブ。スワップアウトされたページの数は、arg0 に格納されます。

prot_fault

保護違反によってページフォルトが発生したときに起動するプローブ。 

rev

ページデーモンが全ページの巡回を新たに開始したときに起動するプローブ。 

scan

ページデーモンがページを検査するときに起動するプローブ。 

softlock

ページにソフトウェアロックを設定する作業でページフォルトが発生したときに起動するプローブ。 

swapin

スワップアウトされたプロセスが再度スワップインされたときに起動するプローブ。 

swapout

プロセスがスワップアウトされたときに起動するプローブ。 

zfod

要求に応じてゼロに初期化されたページが作成されたときに起動するプローブ。 

引数

arg0

統計情報の増分値。ほとんどのプローブでは、この引数の値は常に 1 です。ただし、表 24–1 に示すように、その他の値をとるプローブもあります。

arg1

増分対象の統計情報の、現在値のポインタ。arg0 の値に従って増分される量を 64 ビット値で表します。このポインタを間接参照することにより、コンシューマ側で、プローブの統計情報の現在のカウントを特定できます。

以下は、vmstat(1M) の出力例です。


kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr cd s0 — —   in   sy   cs us sy id
 0 1 0 1341844 836720 26 311 1644 0 0 0  0 216 0  0  0  797  817  697  9 10 81
 0 1 0 1341344 835300 238 934 1576 0 0 0 0 194 0  0  0  750 2795  791  7 14 79
 0 1 0 1340764 833668 24 165 1149 0 0 0  0 133 0  0  0  637  813  547  5  4 91
 0 1 0 1340420 833024 24 394 1002 0 0 0  0 130 0  0  0  621 2284  653 14  7 79
 0 1 0 1340068 831520 14 202 380 0 0  0  0 59  0  0  0  482 5688 1434 25  7 68

pi 列には、ページインされたページ数が出力されています。vminfo プロバイダを使用すると、これらのページインのソースの詳細情報を得ることができます。次の例を参照してください。


dtrace -n pgin'{@[execname] = count()}'
dtrace: description 'pgin' matched 1 probe
^C
  xterm                                                             1
  ksh                                                               1
  ls                                                                2
  lpstat                                                            7
  sh                                                               17
  soffice                                                          39
  javaldx                                                         103
  soffice.bin                                                    3065

この出力からわかるように、ほとんどのページインは、StarSuiteTM ソフトウェア (soffice.bin) 関連の単一のプロセスによって行われています。soffice.bin の仮想メモリーの動作の様子を詳しく調べたいときは、すべての vminfo プローブを有効にします。以下は、StarSuite ソフトウェアの起動中に dtrace(1M) を実行する例です。


dtrace -P vminfo'/execname == "soffice.bin"/{@[probename] = count()}'
dtrace: description 'vminfo' matched 42 probes
^C

  kernel_asflt                                                      1
  fspgin                                                           10
  pgout                                                            16
  execfree                                                         16
  execpgout                                                        16
  fsfree                                                           16
  fspgout                                                          16
  anonfree                                                         16
  anonpgout                                                        16
  pgpgout                                                          16
  dfree                                                            16
  execpgin                                                         80
  prot_fault                                                       85
  maj_fault                                                        88
  pgin                                                             90
  pgpgin                                                           90
  cow_fault                                                       859
  zfod                                                           1619
  pgfrec                                                         8811
  pgrec                                                          8827
  as_fault                                                       9495

以下のスクリプト例では、StarSuite ソフトウェア 起動時の仮想メモリーの動作を詳しく調べることができます。

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin" && start == 0/
{
	/*
	 * This is the first time that a vminfo probe has been hit; record
	 * our initial timestamp.
	 */
	start = timestamp;
}

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin"/
{
	/*
	 * Aggregate on the probename, and lquantize() the number of seconds
	 * since our initial timestamp.  (There are 1,000,000,000 nanoseconds
	 * in a second.)  We assume that the script will be terminated before
	 * 60 seconds elapses.
	 */
	@[probename] =
	    lquantize((timestamp - start) / 1000000000, 0, 60);
}

今回も、StarSuite ソフトウェアの起動中にスクリプトを実行します。次に、新しい図形描画と新しいプレゼンテーションを作成し、すべてのファイルを閉じてアプリケーションを終了します。D スクリプトを実行しているシェルウィンドウ内で、Control-C キーを押します。結果として、時間の経過とともに変化する仮想メモリーの様子が出力されます。


# dtrace -s ./soffice.d
dtrace: script './soffice.d' matched 10 probes
^C

 maj_fault                                         
           value  ------------- Distribution ------------- count    
               7 |                                         0        
               8 |@@@@@@@@@                                88       
               9 |@@@@@@@@@@@@@@@@@@@@                     194      
              10 |@                                        18       
              11 |                                         0        
              12 |                                         0        
              13 |                                         2        
              14 |                                         0        
              15 |                                         1        
              16 |@@@@@@@@                                 82       
              17 |                                         0        
              18 |                                         0        
              19 |                                         2        
              20 |                                         0        

  zfod                                              
           value  ------------- Distribution ------------- count    
             < 0 |                                         0        
               0 |@@@@@@@                                  525      
               1 |@@@@@@@@                                 605      
               2 |@@                                       208      
               3 |@@@                                      280      
               4 |                                         4        
               5 |                                         0        
               6 |                                         0        
               7 |                                         0        
               8 |                                         44       
               9 |@@                                       161      
              10 |                                         2        
              11 |                                         0        
              12 |                                         0        
              13 |                                         4        
              14 |                                         0        
              15 |                                         29       
              16 |@@@@@@@@@@@@@@                           1048     
              17 |                                         24       
              18 |                                         0        
              19 |                                         0        
              20 |                                         1        
              21 |                                         0        
              22 |                                         3        
              23 |                                         0        

  as_fault                                          
           value  ------------- Distribution ------------- count    
             < 0 |                                         0        
               0 |@@@@@@@@@@@@@                            4139     
               1 |@@@@@@@                                  2249     
               2 |@@@@@@@                                  2402     
               3 |@                                        594      
               4 |                                         56       
               5 |                                         0        
               6 |                                         0        
               7 |                                         0        
               8 |                                         189      
               9 |@@                                       929      
              10 |                                         39       
              11 |                                         0        
              12 |                                         0        
              13 |                                         6        
              14 |                                         0        
              15 |                                         297      
              16 |@@@@                                     1349     
              17 |                                         24       
              18 |                                         0        
              19 |                                         21       
              20 |                                         1        
              21 |                                         0        
              22 |                                         92       
              23 |                                         0

仮想メモリーシステム関連の StarSuite の動作が出力されています。たとえば、maj_fault プローブは、アプリケーションを新しく起動するまで起動していません。期待したとおり、StarSuite のウォームスタートを行なっても、重大なフォルトは発生していません。as_fault の出力からは、アクティビティの最初のバーストから最後のバーストまでの様子がわかります。最初のバーストのあと、ユーザーがメニューを使って新しい図面を作成するまで遅延が発生します。その後、アイドル状態を経て、ユーザーが新しいプレゼンテーションをクリックした時点で最後のバーストが起こります。zfod の出力からは、新しいプレゼンテーションの作成により、わずかな時間ですが、ゼロで初期化されたページにかなりの負荷がかかっていることがわかります。

以降の DTrace の調査は、調べる内容に応じて異なります。ゼロで初期化されたページの要求元について知りたい場合は、zfod の有効化の際に ustack() を集積できます。ゼロで初期化されたページのしきい値を設定し、しきい値を超えた場合に、stop() 破壊アクションを使って、悪影響を及ぼすプロセスを終了することもできます。この方法では、truss(1)mdb(1) のような従来のデバッグツールも使用できます。vminfo プロバイダでは、vmstat(1M) などの従来のツールで出力された統計情報と、システム全体に影響を及ぼすような動作を引き起こすアプリケーションを関連付けることができます。

安定性

以下の表に、vminfo プロバイダの安定性を DTrace の安定性機構に従って示します。安定性機構の詳細については、第 39 章安定性を参照してください。

要素 

名前の安定性 

データの安定性 

依存クラス 

プロバイダ 

発展中 

発展中 

ISA

モジュール 

非公開 

非公開 

不明 

機能 

非公開 

非公開 

不明 

名前 

発展中 

発展中 

ISA

引数 

非公開 

非公開 

ISA