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 が起動すると、anonfree、execfree、fsfree のいずれかが続いて起動します。 |
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 |
バッキングストアまたはスワップデバイスからページがページインされたときに起動するプローブ。pgpgin と pgin の唯一の違いは、pgpgin では arg0 にページインされたページ数が格納される点です。pgin では arg0 に必ず 1 が格納されます。 |
pgpgout |
バッキングストアまたはスワップデバイスへページがページアウトされたときに起動するプローブ。pgpgout と pgout の唯一の違いは、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 |