12    メモリ性能の管理

メモリ・リソースを最適化することで,Tru64 UNIX の性能を改善できる場合があります。 通常は,ページングやスワッピングをなくすか減らすのが,性能を改善する最適な方法です。 そのためには,メモリ・リソースを追加します。

この章では,次の項目について説明します。

12.1    仮想メモリの動作

オペレーティング・システムは,ページと呼ばれる 8 KB 単位で物理メモリを割り当てます。 仮想メモリ・サブシステムはシステム内のすべての物理ページを維持管理し,ページを次の 3 つの領域に効率的に分配します。

どのチューニング・ガイドラインに従えば処理性能を改善できるかを判断するには,メモリの動作を理解していなければなりません。 以降の項では,仮想メモリ・サブシステムが下記の処理をどのように行うかを説明します。

12.1.1    物理ページの維持管理

仮想メモリ・サブシステムは,システム内のすべての物理メモリ・ページを維持管理します。 ページのリストを使用して,各ページの位置と古さが管理されます。 最も古いページが,最初に再生 (再利用) されます。 各物理ページはいつでも,次のリストのいずれかに置かれます。

ページ・リスト上にあるページの数を調べるには,vmstat コマンドを使用します。 アクティブ・リスト (vmstat の出力の act フィールド) 上のページには,非アクティブ・ページと UBC LRU ページも含まれます。

12.1.2    ファイル・システム・バッファ・キャッシュのメモリ割り当て

オペレーティング・システムは,ファイル・システムのユーザ・データとメタデータを格納するために,キャッシュを使用します。 キャッシュが後で再使用された場合は,ディスク入出力動作を行わなくてすむため,性能が向上します。 これは,ディスク入出力動作よりも,メモリからのデータ取り出しの方が高速なためです。

以降の項では,次のファイル・システムのキャッシュについて説明します。

12.1.2.1    メタデータ・バッファ・キャッシュのメモリ割り当て

カーネルはブート時に,固定メモリをメタデータ・バッファ・キャッシュに割り当てます。 このキャッシュは,最近アクセスされた UFS および CDFS メタデータ (ファイル・ヘッダ情報,スーパブロック,i ノード,間接ブロック,ディレクトリ・ブロック,およびシリンダ・グループの要約を含む) を保存することによって,オペレーティング・システムとディスクの間のレイヤとして動作します。 データが後で再使用され,ディスク動作が省かれると,性能が向上します。

メタデータ・バッファ・キャッシュでは,bcopy ルーチンを使用して,データがメモリから出し入れされます。 メタデータ・バッファ・キャッシュのメモリは,ページ再生の対象になりません。

メタデータ・バッファ・キャッシュのサイズは,vfs サブシステムの bufcache 属性で指定されます。 bufcache 属性のチューニングについては,11.1.4 項を参照してください。

12.1.2.2    ユニファイド・バッファ・キャッシュのメモリ割り当て

固定されていない物理メモリは,プロセスとユニファイド・バッファ・キャッシュ (UBC) から利用できます。 プロセスと UBC は,このメモリを取り合います。

UBC は,最近アクセスされたファイル・システム・データ (従来のファイル操作による読み込みおよび書き込み) を保存したり,マッピングされているファイル・セクションでのページ・フォールトを捕捉することによって,オペレーティング・システムとディスクの間のレイヤとして機能します。 UFS はユーザおよびアプリケーションのデータを UBC にキャッシュします。 AdvFS はユーザおよびアプリケーションのデータとメタデータを UBC にキャッシュします。 データとメタデータが再使用され,UBC の中にある場合に,ファイル・システムの性能が向上します。

図 12-1 に,メモリ・サブシステムが UBC およびプロセスに物理メモリを割り当てる方法を示します。

図 12-1:  UBC のメモリ割り当て

UBC およびプロセスに割り当てられているメモリの量は,ファイル・システムおよびプロセスからの要求に従って変化します。 たとえば,ファイル・システム動作の負荷が高く,プロセスからの要求が少ない場合は,大半のページが UBC に割り当てられます (図 12-2 を参照)。

図 12-2:  ファイル・システム動作の負荷が高く,ページング動作がない場合のメモリ割り当て

逆に,プロセス動作の負荷が高い場合 (たとえば,大規模な実行可能プログラムのワーキング・セットが大きく拡大した場合など) は,ubc_borrowpercent 属性の値以下になるまで,メモリ・サブシステムが UBC 借用ページを再生します (図 12-3 を参照)。

図 12-3:  ファイル・システム動作の負荷が低く,ページング動作の負荷が高い場合のメモリ割り当て

UBC のサイズは,vfs サブシステムの UBC 関連属性の値によって指定されます。 UBC 関連属性のチューニングについては,11.1.3 項 を参照してください。

12.1.3    プロセスのメモリ割り当て

固定されていない物理メモリは,プロセスおよび UBC で利用できます。 プロセスと UBC は,このメモリを取り合います。 仮想メモリ・サブシステムは要求に応じてプロセスと UBC にメモリ・リソースを割り当てます。 利用可能な空きページをこの要求で使い尽くした場合,仮想メモリ・サブシステムは最も古いページを再生します。

以降の項では,仮想メモリ・サブシステムがプロセスにメモリを割り当てる方法について説明します。

12.1.3.1    プロセスの仮想アドレス空間の割り当て

fork システム・コールは,新しいプロセスを作成します。 ユーザがプロセスを起動すると,fork システム・コールは次の処理を行います。

  1. カーネルがプロセスの維持管理に使用するデータ構造体セットと,リソース限界値のセットなどからなる,UNIX プロセス本体を作成します。 詳細は, fork(2) を参照してください。

  2. プロセス用に,連続したブロックの仮想アドレス空間を作成します。 仮想アドレス空間は,実際の物理メモリへマッピングするためにプロセスが使用する仮想ページの配列です。 仮想アドレス空間は,可変メモリ (プロセスの実行中に変更されるデータ要素や構造体を保持するメモリ) とファイル・バック・メモリ (プログラム・テキストやシェアード・ライブラリに使用されるメモリ) 用に使用されます。

    物理メモリの量は限られているため,プロセスの仮想アドレス空間全体を一度に物理メモリに置くことはできません。 ただし,仮想アドレス空間の一部 (プロセスのワーキング・セット) が物理メモリにマッピングされていれば,プロセスは実行できます。 可変メモリとファイル・バック・メモリのページは,必要なときだけメモリに読み込まれます (ページ・イン)。 メモリ要求が増えてページを再生しなければならない場合,可変メモリのページはページ・アウトされ,その内容はスワップ領域に移動されます。 一方,ファイル・バック・メモリのページは,単に解放されるだけです。

  3. スレッド (実行の流れ) を 1 つ以上作成します。 省略時は,1 プロセスにつき 1 スレッドです。 マルチプロセシング・システムでは,複数のプロセス・スレッドをサポートしています。

仮想メモリ・サブシステムは,各プロセスに大量の仮想アドレス空間を割り当てますが,プロセスはこの空間の一部しか使用しません。 ユーザ領域には,4 TB だけが割り当てられます。 ユーザ領域は一般的にプライベートで,非共用の物理ページにマッピングされます。 さらに 4 TB の仮想アドレス空間が,カーネル空間用に使用されます。 カーネル空間は通常,共用物理ページにマッピングされます。 残りの空間は,何の用途にも使用されません。

図 12-4 に,プロセスの仮想アドレス空間の用途を示します。

図 12-4:  プロセス仮想アドレス空間の用途

12.1.3.2    仮想アドレスから物理アドレスへの変換

仮想ページがアクセスされると,仮想メモリ・サブシステムは物理ページを見つけて,仮想アドレスを物理アドレスに変換しなければなりません。 各プロセスには,仮想アドレスから物理アドレスへの現在の変換エントリからなる配列である,ページ・テーブルがあります。 ページ・テーブルのエントリは,仮想アドレスに順番に対応しており (つまり,仮想アドレス 1 がページ・テーブル・エントリ 1 に対応する),物理ページへのポインタと保護情報を持っています。

図 12-5 に,仮想アドレスから物理アドレスへの変換を示します。

図 12-5:  仮想アドレスから物理アドレスへの変換

プロセスの常駐セットとは,物理アドレスにマッピングされたことのあるすべての仮想アドレス (つまり,プロセスの動作中にアクセスされたすべてのページ) のセットのことです。 常駐セットのページは,複数のプロセスで共用されている可能性があります。

プロセスのワーキング・セットとは,現在,物理アドレスにマッピングされている仮想アドレスのセットのことです。 ワーキング・セットは常駐セットのサブセットで,ある時点でのプロセスの常駐セットのスナップショットです。

12.1.3.3    ページ・フォールト

可変メモリ (ファイル・バック・メモリではない) の仮想アドレスが要求された場合,仮想メモリ・サブシステムは物理ページを見つけ,そのページをプロセスから使用できるようにしなければなりません。 この速度は,ページがメモリとディスクのどちらにあるかによって異なります (図 1-10 を参照)。

要求されたアドレスが現在使用中の場合 (つまり,そのアドレスがアクティブ・ページ・リストにある場合) は,ページ・テーブルにそのアドレスのエントリがあります。 この場合,PAL コードが物理アドレスを変換索引バッファ (TLB) にロードし,TLB から CPU にアドレスが渡されます。 この処理はメモリ動作なので高速です。

要求されたアドレスがページ・テーブル内でアクティブでない場合,PAL の検索コードはページ・フォールトを発行します。 ページ・フォールトにより,仮想メモリ・サブシステムはページを見つけ,ページ・テーブルで仮想アドレスから物理アドレスへの変換ができるようにします。

ページ・フォールトには,次の 4 種類があります。

  1. 要求された仮想アドレスが,初めてアクセスされるアドレスの場合は,ゼロフィル・オンデマンド・ページ・フォールトが発生します。 仮想メモリ・サブシステムは,次の処理を実行します。

    1. 使用可能な物理メモリ・ページを割り当てます。

    2. ページをゼロで埋めます。

    3. ページ・テーブルに,仮想アドレスから物理アドレスへの変換を設定します。

  2. 要求された仮想アドレスが,すでにアクセスされたことがあり,メモリ・サブシステムの内部データ構造体にある場合は,ショート・ページ・フォールトが発生します。 たとえば,物理アドレスがハッシュ・キュー・リストまたはページ・キュー・リストにある場合,仮想メモリ・サブシステムはそのアドレスを CPU に渡し,仮想アドレスから物理アドレスへの変換をページ・テーブルに設定します。 この処理はメモリ動作なので高速です。

  3. 要求された仮想アドレスがすでにアクセスされたことがあり,物理ページが再生されている場合,ページの内容は空きページ・リストまたはスワップ領域にあります。 ページが空きページ・リストにある場合は,ハッシュ・キューおよび空きリストから取り除かれ,再利用されます。 この動作は高速で,ディスク入出力を伴いません。

    ページがスワップ領域にある場合は,ページ・イン・ページ・フォールトが発生します。 仮想メモリ・サブシステムはページの内容をスワップ領域から物理メモリにコピーし,仮想アドレスから物理アドレスへの変換をページ・テーブルに設定します。 この処理にはディスク入出力動作が必要なため,メモリ動作よりも時間がかかります。

  4. プロセスが読み取り専用仮想ページを変更しようとした場合,コピー・オン・ライト・ページ・フォールトが発生します。 仮想メモリ・サブシステムは使用可能な物理メモリ・ページを割り当て,読み取り専用ページの内容を新しいページにコピーし,ページ・テーブルに変換を設定します。

仮想メモリ・サブシステムでは,プロセスの実行時間を改善し,ページ・フォールトの回数を減らすために,次の技法を使用します。

12.1.4    ページの再生

メモリ・リソースの量は限られているため,仮想メモリ・サブシステムは定期的にページを再生しなければなりません。 空きページ・リストには,プロセスおよび UBC から利用できるクリーン・ページが置かれています。 メモリに対する要求が増えると,このリストが使い尽くされてしまうことがあります。 ページ数が限界値 (チューニング可能) より少なくなると,仮想メモリ・サブシステムは,プロセスおよび UBC が使用している最も古いページを再生することによって,空きリストを補充します。

ページを再生するために,仮想メモリ・サブシステムは次の処理を実行します。

  1. メモリ不足を防止するために,変更されたページをスワップ領域に事前に書き出します。 詳細は,12.1.4.1 項を参照してください。

  2. メモリ要求を満たすことができなかった場合は,次の手順でページングを開始します。

    1. UBC が借用しているページを再生し,空きページ・リストにいれます。

    2. アクティブ・リスト内で最も古い非アクティブ・ページおよび UBC LRU ページを再生し,その変更されたページの内容をスワップ領域またはスワップ・ディスクに移動して,空きリストにクリーン・ページを置きます。

    3. 必要であれば,アクティブ・リスト内のページをもっと積極的に再生 (再利用) します。

    ページングによるメモリの再生についての詳細は,12.1.4.2 項を参照してください。

  3. メモリ要求を満たすことができなかった場合は,スワッピングを開始します。 仮想メモリ・サブシステムは,一時的にプロセスを中断し,常駐セット全体をスワップ領域に移動して,多数のページを解放します。 スワッピングについては,12.1.4.3 項を参照してください。

ページングおよびスワッピングの開始時期と停止時期は,いくつかの vm サブシステム属性によって決まります。 図 12-6 に,ページングおよびスワッピングを制御する属性の一部を示します。

図 12-6:  ページングおよびスワッピングの属性

この属性の詳細は,次のとおりです。

ページングおよびスワッピングの属性の変更方法については,12.5 節を参照してください。

以降の項では,ページ再生手順の詳細について説明します。

12.1.4.1    変更ページの事前書き出し

仮想メモリ・サブシステムは,変更された非アクティブ・ページおよび UBC LRU ページをディスクに事前に書き出し,メモリ不足を防止しようとします。 事前書き出しされているページを再生する場合,仮想メモリ・サブシステムはページが有効であることを確認するだけですみ,性能が向上します。 ページ・リストについては,12.1.1 項を参照してください。

仮想メモリ・サブシステムは,空きリスト上のページがもうすぐなくなると予測した場合,現在プロセスまたは UBC が使用している最も古い,変更 (ダーティ) ページを,ディスクに事前書き出しします。

vm サブシステムの vm_page_prewrite_target 属性は,サブシステムが事前書き出しを行いクリーンな状態にできる非アクティブ・ページの数を決定します。 省略時の値は,vm_page_free_target * 2 です。

vm_ubcdirtypercent 属性は,変更 UBC LRU ページのしきい値を指定します。 変更 UBC LRU ページの数がこの値よりも多い場合,仮想メモリ・サブシステムは最も古い,変更 UBC LRU ページをディスクに事前書き出します。 vm_ubcdirtypercent 属性の省略時の値は,UBC LRU ページの総計の 10 パーセントです。

また sync 関数は,システム・メタデータおよびすべての未書き出しのメモリ・バッファのデータを,定期的にフラッシュ (ディスクへの書き込み) します。 たとえば,UFS の場合,変更された i ノードや,遅延ブロック入出力などのデータがフラッシュされます。 shutdown コマンドなどのコマンドも,独自の sync 関数を呼び出します。 sync 関数による入出力の影響を最小限にするために,カーネルが 1 秒間に実行できるディスク書き込みの最大数を,vm サブシステムの ubc_maxdirtywrites 属性の値で指定します。 省略時の値は,1 秒間に 5 回の入出力動作です。

12.1.4.2    ページングによるメモリの再生

メモリ要求が多く,空きページ・リスト上のページの数が vm サブシステムの vm_page_free_target 属性の値未満になった場合,仮想メモリ・サブシステムはページングを使用して,空きページ・リストを補充します。 ページ・アウト・デーモンおよびタスク・スワッパ・デーモンはページ再生処理の延長であり,ページングおよびスワッピングを制御します。

ページング処理は,次の手順で実行されます。

  1. ページ再生処理が,ページ・スティーラ・デーモンを起動します。 このデーモンは,UBC のサイズが借用しきい値以下になるまで,UBC が仮想メモリ・サブシステムから借用しているクリーン・ページをまず再生します。 借用しきい値は ubc_borrowpercent 属性の値で指定され,省略時の値は 20 パーセントです。 UBC ページは変更されないことが多いため,UBC の借用ページを解放すると,素早くページを再生できます。 再生したページがダーティな (変更されている) 場合は,そのページの内容をディスクに書き出してから,ページを空きページ・リストに移動しなければなりません。

  2. クリーンな UBC 借用メモリを解放しても,空きリストの補充が十分でない場合は,ページ・アウトが発生します。 ページ・スティーラ・デーモンが,アクティブ・ページ・リスト内の最も古い非アクティブ・ページおよび UBC LRU ページを再生 (再利用) し,その変更ページの内容をディスクに移動して,クリーン・ページを空きリストに置きます。

  3. 空きページが減り続けると,ページングは一層活発になります。 空きページ・リスト上のページの数が vm サブシステムの vm_page_free_min 属性の値 (省略時の値は 20 ページ) 未満になった場合,リストからページを取り出すたびに,ページを再生しなければなりません。

図 12-7 に,ページング動作でのページの動きを示します。

図 12-7:  ページング動作

空きリスト上のページの数が vm サブシステムの vm_page_free_target 属性で指定される限界値まで増えると,ページングが停止します。 ただし,個々のページをページングしても,空きリストの補充が十分にできない場合は,スワッピングによって大量のメモリが解放されます (12.1.4.3 項を参照)。

12.1.4.3    スワッピングによるメモリの再生

メモリ要求が継続的に多い場合,仮想メモリ・サブシステムは,個々のページを再生するだけでは空きページ・リストを補充できないことがあります。 クリーン・ページを大量に増やすために,仮想メモリ・サブシステムはスワッピングを使用して,プロセスを中断させます。 これにより,物理メモリに対する要求が減ります。

タスク・スワッパは,プロセスを中断させて,その常駐セットをスワップ領域に書き出し,クリーン・ページを空きページ・リストに移動することによって,プロセスをスワップ・アウトします。 スワップ・アウトされたプロセスは実行できなくなるため,スワッピングはシステムの性能に大きな影響を与えます。 このため,VLM システムや,大規模なプログラムを稼働させるシステムでは,スワッピングを避けてください。

スワッピングの開始時期と終了時期は,次の vm サブシステム属性によって制御されます。

スワッピングの開始時期と停止時期を制御する属性を変更することによって,システムの性能が向上することがあります (12.5 節を参照)。 大規模メモリ・システムや,大規模なプログラムを実行するシステムでは,可能であればページングやスワッピングを避けてください。

スワッピング・レートを高くする (ページ再生でのスワッピング時期が早まる) と,スループットが向上する可能性があります。 スワップ・アウトされるプロセスが多いほど実際に実行しているプロセスが少なくなり,実行できる仕事量が多くなります。 スワッピング・レートを高くすると,長時間スリープしているスレッドがメモリから追い出され,メモリが解放されます。 ただし,スワップ・アウトされたプロセスが必要になった場合の待ち時間が長いため,対話処理の応答速度が低下することがあります。

スワッピング・レートを低くする (ページ再生でのスワッピング時期が遅くなる) と対話処理の応答速度が速くなる可能性がありますが,スループットは低下します。 スワッピング・レートの変更についての詳細は,12.5.2 項を参照してください。

メモリとディスク間のデータ移動を効率化するために,仮想メモリ・サブシステムは同期スワップ・バッファと非同期スワップ・バッファを使用します。 仮想メモリ・サブシステムは,これらの 2 種類のバッファを使用して,比較的処理が遅いページ・アウト要求の完了を待たずに,ページ・イン要求をすぐに処理します。

同期スワップ・バッファは,ページ・イン・ページ・フォールトと,スワップ・アウトに使用されます。 非同期スワップ・バッファは,非同期のページ・アウトと,変更ページの事前書き出しに使用されます。 スワップ・バッファのチューニングについては,12.5.7 項を参照してください。

12.2    性能の高いスワップ領域の構成

スワップ領域の表示や,システムのインストール後に追加のスワップ領域の構成を行うには,swapon コマンドを使用します。 このスワップ領域の追加を恒久化するには,vm サブシステムの swapdevice 属性を使用して,/etc/sysconfigtab ファイルにスワップ・デバイスを指定します。 例を次に示します。

vm:
       swapdevice=/dev/disk/dsk0b,/dev/disk/dsk0d

カーネル・サブシステムの属性の変更については,第 3 章を参照してください。

スワップ領域の割り当てモードおよびスワップ領域の要件については,4.4.1.8 項または12.1.3 項を参照してください。

次のリストで,性能の高いスワップ領域の構成方法について説明します。

スワップ・デバイスの追加についての詳細は,『システム管理ガイド』を参照してください。 性能および可用性を高めるための,ディスクの構成およびチューニングについての詳細は,第 9 章を参照してください。

12.3    メモリ統計情報のモニタリング

表 12-2 では,メモリ使用状況の表示に使用するツールについて説明します。

表 12-2:  仮想メモリおよび UBC を表示するためのツール

ツール 説明 参照先

vmstat

プロセスのスレッド,仮想メモリの使用状況 (ページ・リスト,ページ・フォールト,ページ・イン,およびページ・アウト),割り込み,および CPU の使用状況 (ユーザ時間,システム時間,およびアイドル時間の割合) の情報を表示する。

12.3.1 項

ps

実行中のプロセスについて,現在の統計情報を表示する。 情報には CPU の使用状況,プロセッサおよびプロセッサ・セット,スケジュールの優先順位などがある。

ps コマンドは,プロセスの仮想メモリの統計情報も表示する。 この情報にはページ・フォールト,ページ再生,ページ・インの回数,実メモリ (常駐セット) の使用率,常駐セットのサイズ,仮想アドレスのサイズなどがある。

12.3.2 項)

swapon

スワップ領域の利用状況に関する情報と,スワップ・デバイスごとに,割り当てられているスワップ領域の総量,使用中のスワップ領域,空きスワップ領域を表示する。 このコマンドを使用して追加のスワップ領域を割り当てることもできる。

12.3.3 項

(dbx) print ufs_getapage_stats

UBC 統計情報を報告し,ufs_getapage_stats データ構造体を調べて,UBC ページの使用状況を検査する。

12.3.4 項

sys_check

システム構成を分析し,統計情報を表示する。 必要に応じて警告やチューニングのガイドラインを示す。

2.3.3 項

uerf -r 300

システム・メモリの総計を表示する。

詳細は, uerf(8) を参照。

ipcs

現在アクティブなメッセージ・キュー,共用メモリ・セグメント,セマフォ,リモート・キュー,ローカル・キュー・ヘッダについて,プロセス間通信 (IPC) の統計情報を表示する。

ipcs -a コマンドで表示される情報のうち,QNUMCBYTESQBYTESSEGSZNSEMS の各フィールドに表示される情報は特に役立つ。

詳細は, ipcs(1) を参照。

以降の項では,vmstatpsswapon,および dbx ツールについて,詳細を説明します。

12.3.1    vmstat コマンドを使ってメモリを表示する

仮想メモリ,プロセス,CPU の統計情報を表示するには,次のように入力します。

# /usr/ucb/vmstat

次のような情報が表示されます。

Virtual Memory Statistics: (pagesize = 8192)
procs        memory            pages                       intr        cpu
r  w  u  act  free wire  fault cow zero react pin pout   in  sy  cs  us sy  id
2 66 25  6417 3497 1570  155K  38K  50K    0  46K    0    4 290 165   0  2  98
4 65 24  6421 3493 1570   120    9   81    0    8    0  585 865 335  37 16  48
2 66 25  6421 3493 1570    69    0   69    0    0    0  570 968 368   8 22  69
4 65 24  6421 3493 1570    69    0   69    0    0    0  554 768 370   2 14  84
4 65 24  6421 3493 1570    69    0   69    0    0    0  865  1K 404   4 20  76
|            |                 |                           |           |        
|            |                 |                           |           [5]
|            |                 |                           [4] 
|            |                 [3]
|            [2]
[1] 
 
 

vmstat の出力の最初の行には,リブート以降の全時間についてまとめたデータが表示され,それ以降の行には最新の時間間隔に対するデータが表示されます。

vmstat コマンドの情報には,CPU や仮想メモリの問題の診断に使用できる情報が含まれています。 次のフィールドを調べてください。

  1. プロセス情報 (procs):

    [例に戻る]

  2. 仮想メモリ情報 (memory):

    ページ・リストについての詳細は,12.1.1 項を参照してください。 [例に戻る]

  3. ページング情報 (pages):

    [例に戻る]

  4. 割り込みの情報 (intr):

    [例に戻る]

  5. CPU 使用状況 (cpu):

    vmstat コマンドによる CPU 使用状況モニタリングについては,12.3.1 項を参照してください。 [例に戻る]

vmstat コマンドを用いてメモリ性能の問題を診断するには,次の手順を実行します。

ページングが過度になると,2 次キャッシュのミス率が高くなります。 この状況は,次の出力で示されることがあります。

物理メモリの使用状況に関する統計情報を表示するには,次のように入力します。

# vmstat -P

次のような情報が表示されます。

Total Physical Memory =   512.00 M
                      =    65536 pages
Physical Memory Clusters:
 
 start_pfn     end_pfn        type  size_pages / size_bytes
         0         256         pal         256 /    2.00M
       256       65527          os       65271 /  509.93M
     65527       65536         pal           9 /   72.00k
 
Physical Memory Use:
 
 start_pfn     end_pfn        type  size_pages / size_bytes
       256         280   unixtable          24 /  192.00k
       280         287    scavenge           7 /   56.00k
       287         918        text         631 /    4.93M
       918        1046        data         128 /    1.00M
      1046        1209         bss         163 /    1.27M
      1210        1384      kdebug         174 /    1.36M
      1384        1390     cfgmgmt           6 /   48.00k
      1390        1392       locks           2 /   16.00k
      1392        1949   unixtable         557 /    4.35M
      1949        1962        pmap          13 /  104.00k
      1962        2972    vmtables        1010 /    7.89M
      2972       65527     managed       62555 /  488.71M
                             ============================
         Total Physical Memory Use:      65270 /  509.92M
 
Managed Pages Break Down:
 
       free pages = 1207
     active pages = 25817
   inactive pages = 20103
      wired pages = 15434
        ubc pages = 15992
        ==================
            Total = 78553
 
WIRED Pages Break Down:
 
   vm wired pages = 1448
  ubc wired pages = 4550
  meta data pages = 1958
     malloc pages = 5469
     contig pages = 159
    user ptepages = 1774
  kernel ptepages = 67
    free ptepages = 9
        ==================
            Total = 15434

このコマンドとオプションについての詳細は, vmstat(1) を参照してください。 メモリ・リソースの追加については,12.4 節を参照してください。

12.3.2    ps コマンドを使ってメモリを表示する

システム・プロセスの現在の情報とメモリの使用状況を表示するには,次のように入力します。

# /usr/ucb/ps aux

次のような情報が表示されます。

USER  PID  %CPU %MEM   VSZ   RSS  TTY S    STARTED      TIME  COMMAND
chen  2225  5.0  0.3  1.35M  256K p9  U    13:24:58  0:00.36  cp /vmunix /tmp
root  2236  3.0  0.5  1.59M  456K p9  R  + 13:33:21  0:00.08  ps aux
sorn  2226  1.0  0.6  2.75M  552K p9  S  + 13:25:01  0:00.05  vi met.ps
root   347  1.0  4.0  9.58M  3.72 ??  S      Nov 07 01:26:44  /usr/bin/X11/X -a
root  1905  1.0  1.1  6.10M  1.01 ??  R    16:55:16  0:24.79  /usr/bin/X11/dxpa
mat   2228  0.0  0.5  1.82M  504K p5  S  + 13:25:03  0:00.02  more
mat   2202  0.0  0.5  2.03M  456K p5  S    13:14:14  0:00.23  -csh (csh)
root     0  0.0 12.7   356M  11.9 ??  R <  Nov 07 3-17:26:13  [kernel idle]
            |   |      |              |                |      |
            |   |      |              |                |      [6]      
            |   |      |              |                [5]
            |   |      |              [4]
            |   |      [3]
            |   [2]
            [1]
 
 
 

ps コマンドは,ps コマンド自身を含め,CPU 使用量の降順に,システム・プロセスのスナップショットを表示します。 ps コマンドの実行時には,システム・プロセスの状態が変わっていることがあります。

ps コマンドの出力には,CPU や仮想メモリの問題の診断に使用できる,次の情報が含まれます。

  1. CPU 時間の使用量の割合 (%CPU)。 [例に戻る]

  2. 実メモリの使用量の割合 (%MEM)。 [例に戻る]

  3. プロセスの仮想アドレスのサイズ (VSZ) -- このプロセスに割り当てられている可変メモリの総量 (バイト)。 [例に戻る]

  4. プロセスの実メモリ (常駐セット) サイズ (RSS) -- 仮想ページにマッピングされている物理メモリの総量 (アプリケーションが物理的に使用したメモリの総量で,単位はバイト)。 共用メモリは,常駐セットのサイズに含まれます。 このため,このサイズの総計は,システムで利用可能な物理メモリの総量を超えることがあります。 [例に戻る]

  5. プロセスの状態 (S) -- プロセスが次のどの状態にあるかを示します。

    [例に戻る]

  6. 現在までに使用した CPU 時間 (TIME)。 フォーマットは,hh:mm:ss.ms です。 [例に戻る]

  7. 実行しているコマンド (COMMAND)。 [例に戻る]

ps コマンドの出力から,どのプロセスがシステムの CPU 時間およびメモリ・リソースを最も消費し,プロセスがスワップ・アウトされているかどうかを調べることができます。 実行中またはページング中のプロセスに的を絞ってください。 考慮すべき事項を,次に説明します。

このコマンドとオプションの詳細は, ps(1) を参照してください。

12.3.3    swapon コマンドを使ってスワップ領域の使用状況を表示する

スワップ・デバイスの構成 (割り当てられているスワップ領域の総量,使用中のスワップ領域の量,空きスワップ領域の量) を表示するには,次のように入力します。

# /usr/sbin/swapon -s 

各スワップ・パーティションの情報が次のように表示されます。

Swap partition /dev/disk/dsk1b (default swap):
    Allocated space:        16384 pages (128MB)
    In-use space:           10452 pages ( 63%)
    Free space:              5932 pages ( 36%)
 
Swap partition /dev/disk/dsk4c:
    Allocated space:        128178 pages (1001MB)
    In-use space:            10242 pages (  7%)
    Free space:             117936 pages ( 92%)
 
Total swap allocation:
 
    Allocated space:        144562 pages (1.10GB)
    Reserved space:          34253 pages ( 23%)
    In-use space:            20694 pages ( 14%)
    Available space:        110309 pages ( 76%)

スワップ領域は,オペレーティング・システムを最初にインストールするときに構成できますが,後日スワップ領域を追加することもできます。 次のようなアプリケーション・メッセージは,システムに構成されているスワップ領域が十分でないか,プロセスの限界値に達したことを示します。

"unable to obtain requested swap space"
"swap space below 10 percent free"

スワップ領域の要件については,4.4.1.8 項または12.1.3 項を参照してください。 スワップ領域の追加と,性能を高めるためにスワップ領域を分散させる方法については,12.2 節を参照してください。

このコマンドとオプションの詳細は, swapon(2) を参照してください。

12.3.4    dbx デバッガを使って UBC を表示する

先読みを無効にしていない場合は,dbx print コマンドを使用して ufs_getapage_stats データ構造体を調べることで,UBC を表示できます。 例を次に示します。

# /usr/ucb/dbx -k /vmunix /dev/mem  (dbx) print ufs_getapage_stats

次のような情報が表示されます。

struct {
    read_looks = 2059022
    read_hits = 2022488
    read_miss = 36506
    alloc_error = 0
    alloc_in_cache = 0
}
(dbx)

ヒット率を計算するには,read_hits フィールドの値を read_looks フィールドの値で割ります。 95 パーセントを超えていれば,ヒット率が良いと言えます。 上記の例の場合,ヒット率は約 98 パーセントです。

このコマンドとオプションの詳細は, dbx(1) を参照してください。

12.4    プロセス用のメモリを増やすためのチューニング

システムでページングやスワッピングが発生している場合,各種のカーネル・サブシステム属性をチューニングすることで,プロセスから利用できるメモリを増やすことができます。

表 12-3 に,プロセス用のメモリ・リソースを増やすためのガイドラインを示します。 また,性能上の利点と欠点をリストします。 プロセス用のメモリを増やすためのガイドラインによっては,UBC の動作や,ファイル・システムのキャッシュに影響がでることがあります。 ページングやスワッピングを止める最もよい方法は,システムの物理メモリを追加することです。

表 12-3:  メモリ・リソースのチューニング・ガイドライン

性能上の利点 ガイドライン 欠点
CPU の負荷が低くなり,メモリの要求が少なくなる。 同時に実行するプロセスの数を少なくする (12.4.1 項)。 システムが処理する仕事量が少なくなる。
メモリが解放される。 カーネルの静的サイズを小さくする (12.4.2 項)。 一部の機能が利用できなくなることがある。
負荷が重い場合に,ネットワークのスループットが向上する。 カーネルの malloc 割り当て用に予約するメモリの割合を大きくする (12.4.3 項)。 メモリを消費する。
メモりが少ない場合にシステムの応答時間が改善される。 キャッシュの大きさを小さくする (11.1 節)。 ファイル・システムの性能が低下するおそれがある。
メモリが解放される。 プロセスからのメモリ要求を少なくする (7.1.6 項)。 プログラムの実行効率が低下することがある。

以降の項では,これらのチューニング・ガイドラインを詳しく説明します。

12.4.1    同時に実行するプロセスの数を少なくする

同時に実行するアプリケーションを少なくすることで,性能を改善し,メモリの要求を減らすことができます。 アプリケーションをオフピークの時間帯に実行するには,at コマンドまたは batch コマンドを使用します。

詳細は, at(1) を参照してください。

12.4.2    カーネルの静的サイズを小さくする

不要なサブシステムを構成解除することで,カーネルの静的サイズを小さくできます。 構成されているサブシステムを表示し,サブシステムを削除するには,sysconfig コマンドを使用します。 使用中の環境に必要なサブシステムや機能は削除しないでください。

カーネル・サブシステム属性の変更については,第 3 章を参照してください。

12.4.3    カーネルの malloc 割り当て用に予約するメモリを増やす

大規模なインターネット・アプリケーションを動かしている場合は,カーネルの malloc サブシステム用に予約するメモリの量を増やさなければならないことがあります。 これにより,システムのネットワーク負荷が高いときにドロップするパケットの数が減るため,ネットワークのスループットが向上します。 ただし,この値を大きくすると消費されるメモリの量も増えます。

関連する属性

次に,カーネルの割り当て用に予約されるメモリに関連する generic サブシステム属性を説明します。

チューニングするかどうかの判断

ドロップしたパケットがあることが netstat -d -i コマンドの出力で示された場合や,ドロップしたパケットが vmstat -M コマンドの fail_nowait 見出しの下に出力された場合は,kmemreserve_percent 属性の値を大きくしてください。 このような状況は,ネットワークの負荷が高い場合に発生します。

カーネル・サブシステム属性の変更については,第 3 章を参照してください。

12.5    ページング動作およびスワッピング動作の変更

以降の項で示すように,ページング動作とスワッピング動作を変更することで,性能を改善できることがあります。

12.5.1    ページングしきい値を大きくする

ページングとは,プログラムの一部 (ページ) をメモリ内へ,またはメモリから外へ転送することです。 ページングは頻繁に発生しないようにしてください。 ページングが開始されない,空きリストの最小ページ数を指定できます。 ページングについての詳細は,12.1.4 項 を参照してください。

関連する属性

vm サブシステムの vm_page_free_target 属性は,ページングを開始する前の空きリストの最小ページ数を指定します。 vm_page_free_target 属性の省略時の値は,システムのメモリ量によって決まります。

次の表を使用して,システムの省略時の値を調べてください。

メモリ・サイズ vm_page_free_target の値
512 MB 以下 128
513 〜 1024 MB 256
1025 〜 2048 MB 512
2049 〜 4096 MB 768
4096 MB より大きい 1024

vm_page_free_target 属性は,システムをリブートすることなく変更できます。

チューニングするかどうかの判断

vm_page_free_target の値は小さくしないでください。

システムでページングが発生していない場合は,vm_page_free_target 属性の値を大きくしないでください。 十分なメモリ・リソースがあり,深刻なメモリ不足のために性能上の問題が発生している場合は,vm_page_free_target 属性の値を大きくしてください。 ただし,この値を大きくすると,メモリの少ないシステムではページング動作が多くなり,値が大きすぎるとメモリが無駄になります。 ページングおよびスワッピングの属性についての詳細は,12.1.4 項 を参照してください。

vm_page_free_target 属性の省略時の値を大きくする場合は,vm_page_free_min 属性の値も大きくすると良いでしょう。

カーネル・サブシステム属性の変更については,第 3 章を参照してください。

12.5.2    スワッピング・レートを管理する

空きページ・リストがスワッピングしきい値を下回ると,スワッピングが開始されます。 スワッピングが頻繁に発生しないようにしてください。 スワッピングを開始および終了するタイミングは,指定することができます。 スワッピングについての詳細は,12.1.4 項を参照してください。

関連する属性

変更ページの事前書き出しに関連する vm サブシステム属性を以下のリストに示します。

vm_page_free_optimalvm_page_free_minvm_page_free_target 属性の値は,システムをリブートすることなく変更できます。 カーネル・サブシステム属性の変更についての詳細は 第 3 章 を参照してください。

チューニングするかどうかの判断

システムでページングが発生していない場合は,vm_page_free_optimal の値を変更しないでください。

vm_page_free_optimal 属性の値を小さくすると,対話処理の応答速度が向上しますが,スループットは低下します。

vm_page_free_optimal 属性の値を大きくすると,長期間スリープしているスレッドがメモリ外に移動され,メモリが解放されて,スループットが向上します。 スワップ・アウトされるプロセスが多いほど,実際に実行しているプロセスが少なくなり,より多くの仕事を処理できるようになります。 ただし,スワップ・アウトされたプロセスが必要になった場合の待ち時間が長くなり,対話処理の応答速度が遅くなることがあります。

vm_page_free_optimal の値は,一度に 2 ページだけ大きくしてください。 vm サブシステムの vm_page_free_target 属性の値より大きくしないでください。

12.5.3    タスク・スワッピングを積極的に行うようにする

空きページ・リストがスワッピングしきい値 (vm サブシステムの vm_page_free_swap 属性で指定) より下回った場合,スワッピングが開始されます。 スワッピングが頻繁に発生しないようにしてください。 アイドル・タスクを積極的にスワップ・アウトするかどうかを,指定することができます。 スワッピングについての詳細は,12.1.4 項 を参照してください。

関連する属性

vm サブシステムの vm_aggressive_swap 属性は,タスク・スワッパがアイドル・タスクを積極的にスワップ・アウトするかどうかを指定します。

値: 1 または 0
省略時の値: 0 (無効)

チューニングするかどうかの判断

タスク・スワッピングを積極的に行うと,システムのスループットが向上します。 ただし,対話処理の応答性能が低下します。 通常は,タスク・スワッピングを積極的に行う必要はありません。

vm_aggressive_swap 属性の値は,リブートすることなく変更できます。 カーネル属性の変更についての詳細は,第 3 章 を参照してください。

12.5.4    スワッピングを避けるために常駐セットのサイズを制限する

Tru64 UNIX は,特に指定しないかぎりプロセスの常駐セットのサイズを制限しません。 アプリケーションでは,setrlimit() コールで RLIMIT_RSS リソース値を指定することにより,プロセスごとのメモリ常駐ページ数の限界値を設定できます。 ただし,アプリケーションでのプロセスの常駐セットのサイズの制限は必須ではなく,システム・ワイドの省略時の限界値はありません。 したがって,プロセスの常駐セットのサイズは,システムのメモリ制限によってのみ制限されます。 メモリの要求が空きページの数を上回ると,常駐セットのサイズが大きいプロセスがスワッピングの候補となります。 スワッピングについての詳細は,12.1.4 項 を参照してください。

常駐セットのサイズが大きいためにプロセスがスワッピングされるのを防ぐには,常駐セットのサイズに対して,プロセス固有の限界値とシステム・ワイドの限界値を指定します。

関連する属性

常駐セットのサイズ制限に関連する vm サブシステム属性を,以下のリストに示します。

チューニングするかどうかの判断

システムでページングが発生していない場合は,常駐セットのサイズを制限する必要はありません。

常駐セットのサイズを制限する場合,特定プロセスの場合とシステム・ワイドの場合のどちらでも,vm サブシステム属性 anon_rss_enforce を併用して,常駐セットのサイズのソフト限界値とハード限界値のどちらかを設定しなければなりません。

ハード限界値を有効にすると,タスクの常駐セットはこの限界値を超えることはできません。 タスクがハード限界値に達すると,タスクの可変メモリのページがスワップ領域に移動され,常駐セットのサイズが限界値以下に抑えられます。

ソフト限界値を有効にすると,可変メモリのページングが,次の条件で開始されます。

anon_rss_enforce 属性を変更したときには,システムのリブートが必要です。 vm_page_free_optimalvm_rss_maxpercentvm_rss_block_targetvm_rss_wakeup_target 属性は,システムをリブートすることなく変更できます。

12.5.5    変更ページの事前書き出しを管理する

vm サブシステムは,変更された (ダーティ) ページをディスクに事前書き出しすることによって,メモリ不足を防止しようとします。 事前書き出しされたページを再生する場合,仮想メモリ・サブシステムはページが有効であることを確認するだけですみ,性能が向上します。 仮想メモリ・サブシステムは,空きリスト上のページがもうすぐなくなると予測した場合,最も古い非アクティブ・ページおよび UBC LRU ページをディスクに事前書き出しします。 事前書き出しに関連する属性は,チューニングできます。 事前書き出しについての詳細は,12.1.4.1 項 を参照してください。

関連する属性

変更ページの事前書き出しに関連する vm サブシステムの属性を,以下のリストに示します。

vm_page_prewrite_target 属性と vm_ubcdirtypercent 属性は,システムをリブートすることなく変更できます。

チューニングするかどうかの判断

システムでページングが発生していない場合,vm_page_prewrite_target 属性の値を変更する必要はありません。

vm_page_prewrite_target 属性の値を小さくすると,ピーク時の処理性能が向上しますが,メモリ不足が発生したときには性能が大幅に低下します。

vm_page_prewrite_target 属性の値を大きくすると,次のようになります。

vm_page_prewrite_target 属性の値は,64 ページずつ大きくします。

UBC LRU ダーティ・ページの事前書き出しの頻度を高くするには,vm_ubcdirtypercent 属性の値を 1 (パーセント) ずつ小さくします。

カーネル属性の変更については,第 3 章を参照してください。

12.5.6    ページ・イン・クラスタおよびページ・アウト・クラスタのサイズを管理する

仮想メモリ・サブシステムは,必要となるページの数を予測して,スワップ・デバイスに対して追加ページの読み込みおよび書き出しを行います。 スワップ・デバイスへのアクセス時に追加するページの数を指定することができます。

関連する属性

ページの読み取りおよび書き込みに関連する vm サブシステム属性を,以下のリストに示します。

vm_max_rdpgio_kluster 属性および vm_max_wrpgio_kluster 属性を変更したときには,システムのリブートが必要です。 カーネル・サブシステム属性の変更についての詳細は,第 3 章 を参照してください。

チューニングするかどうかの判断

大規模メモリ・システムでプロセスのスワッピングを行う場合は,vm_max_rdpgio_kluster 属性の値を大きくしてください。 この値を大きくすると,メモリ内に読み込まれるページ数が多くなり,システムがページ・フォールトの処理に費やす時間が少なくなるため,ピーク時の処理性能が向上しますが,消費するメモリの量が多くなり,システムの性能が低下します。

プロセスのページングとスワッピングを行う場合は,vm_max_wrpgio_kluster 属性の値を大きくしてください。 この値を大きくすると,ピーク時の処理性能が向上し,メモリは確保されますが,ページ・インの回数が多くなり,システム全体での処理性能が低下します。

12.5.7    スワップ・パーティションでの入出力要求を管理する

空きページ・リストがスワッピングのしきい値を下回ると,スワッピングが開始されます。 スワッピングの頻度が高くなりすぎないようにしてください。 同時にスワップ・パーティションに対して発生させることのできる,処理待ちの同期および非同期入出力要求の数を指定することができます。 スワッピングについての詳細は,12.1.4 項を参照してください。

同期スワップ要求は,ページ・イン動作とタスクのスワッピングに使用されます。 非同期スワップ要求は,ページ・アウト動作と,変更ページの事前書き出しに使用されます。

関連する属性

スワップ・パーティションでの要求に関連する vm サブシステム属性のリストを,以下に示します。

チューニングするかどうかの判断

vm_syncswapbuffers 属性の値は,同時実行をシステムが容易にサポートできるプロセス数の概数と等しくなるようにします。 この値を大きくすると,システム全体のスループットが向上しますが,メモリを消費します。

vm_asyncswapbuffers 属性の値は,スワップ・デバイスが同時にサポートできる入出力転送数の概数と等しくなるようにします。 LSM を使用している場合は,vm_asyncswapbuffers 属性の値を大きくし,ページ・イン要求が非同期のページ・アウト要求より遅れるようにします。 この値を小さくするとメモリの消費量が多くなりますが,対話処理の応答速度は速くなります。

vm_syncswapbuffers 属性と vm_asyncswapbuffers 属性は,システムをリブートすることなく変更できます。 カーネル・サブシステム属性の変更についての詳細は,第 3 章 を参照してください。

12.6    共用メモリ用の物理メモリの予約

粒度ヒントにより,物理メモリの一部を,ブート時に共用メモリ用として予約できます。 この機能により,変換索引バッファ (TLB) で 1 ページ以上のメモリがマッピングでき,共用ページ・テーブル・エントリ機能が有効になります。 共用ページ・テーブル・エントリ機能により,キャッシュのヒット率が高くなる可能性があります。

データベース・サーバによっては,粒度ヒントを使用すると,実行時の性能が 2 〜 4 パーセント向上し,共用メモリのデタッチ時間が短くなります。 粒度ヒントを使用すべきかどうかは,データベース・アプリケーションのドキュメントを参照してください。

通常のアプリケーションでは,粒度ヒントの代わりに,セグメント化共用メモリ (SSM) 機能 (省略時の機能) を使用してください。

粒度ヒントを有効にするには,vm サブシステムの gh_chunks 属性に値を指定しなければなりません。 さらに,粒度ヒントをより効率的にするには,アプリケーションを変更して,共用メモリ・セグメントの開始アドレスとサイズを,8 MB 境界に合わせます。

粒度ヒントを有効にする方法については,12.6.1 項および12.6.2 項を参照してください。

12.6.1    粒度ヒントを使用するようにカーネルをチューニングする

粒度ヒントを使用するには,ブート時に共用メモリ用に予約する,4 MB の物理メモリ・チャンクの数を指定しなければなりません。 このメモリは,他の用途には使用できず,システムに返却したり再生 (再利用) することもできません。

共用メモリ用にメモリを予約するには,gh_chunks 属性にゼロ以外の値を指定します。 たとえば,4 GB のメモリを予約する場合は,gh_chunks の値として 1024 を指定します (1024 * 4 MB = 4 GB)。 512 を指定すると,2 GB のメモリが予約されます。

gh_chunks 属性に指定する値は,データベース・アプリケーションにより異なります。 プロセスと UBC から利用できるメモリが少なくなるため,メモリを過度に予約しないでください。

注意

粒度ヒントを有効にした場合は,ipc サブシステムの ssm_threshold 属性の値に 0 を設定して,セグメント化共用メモリを無効にしてください。

予約したメモリの量が適切かどうかを確認することができます。 たとえば,gh_chunks 属性の値にまず 512 を指定します。 その後,共用メモリを割り当てるアプリケーションが動作している間に,次の dbx コマンドを入力します。

# /usr/ucb/dbx -k /vmunix /dev/mem
 
(dbx) px &gh_free_counts
0xfffffc0000681748
(dbx) 0xfffffc0000681748/4X
fffffc0000681748:  0000000000000402 0000000000000004
fffffc0000681758:  0000000000000000 0000000000000002
(dbx)

上記の例は,次の情報を示しています。

メモリを節約するには,共用メモリを使用するアプリケーションが動作している間に空いている 512 ページ・チャンクが 1 〜 2 個だけになるまで,gh_chunks 属性の値を小さくします。

次の vm サブシステム属性も,粒度ヒントに影響します。

さらに,アタッチ要求のサイズおよびアドレスが境界に合っていないことを示すメッセージが,システム・コンソールに表示されます。 境界が合っていないアタッチのメッセージは,1 つの共用メモリ・セグメントに対して 1 回だけ表示されます。

カーネル・サブシステム属性の変更については,第 3 章を参照してください。

12.6.2    粒度ヒントを使用するようにアプリケーションを変更する

共用メモリ・セグメントの開始アドレスとサイズを 8 MB 境界に合わせると,粒度ヒントの効率を良くできます。

第 3 レベルのページ・テーブル・エントリを共用するには,共用メモリ・セグメントのアタッチ・アドレス (shmat 関数で指定) と共用メモリ・セグメントのサイズ (shmget 関数で指定) が,8 MB 境界に合っていなければなりません。 これは,アドレスとサイズの下位 23 ビットが 0 でなければならないということです。

アタッチ・アドレスと共用メモリ・セグメント・サイズは,アプリケーションが指定します。 また,System V の共用メモリでは,最大 2 GB - 1 までの共用メモリ・セグメント・サイズが使用できます。 2 GB より大きい共用メモリ・セグメントを必要とするアプリケーションでは,複数のセグメントを使用することでこのような領域を作成できます。 この場合,ユーザがアプリケーションに指定する共用メモリの合計サイズは,8 MB 境界に合っていなければなりません。 さらに,System V の共用メモリ・セグメントの最大サイズを指定する shm_max 属性の値は,8 MB 境界に合っていなければなりません。

アプリケーションに指定する共用メモリ・サイズの合計が 2 GB より大きい場合は,shm_max 属性の値に 2139095040 (0x7f800000) を指定できます。 この値は,shm_max 属性に指定できる最大値 (2 GB - 8MB) で,この値でもページ・テーブル・エントリは共有されます。

ページ・テーブル・エントリが共用されているか確認するには,次の一連の dbx コマンドを使用します。

# /usr/ucb/dbx -k /vmunix /dev/mem
 
(dbx) p *(vm_granhint_stats *)&gh_stats_store
	struct {
	    total_mappers = 21
	    shared_mappers = 21
	    unshared_mappers = 0
	    total_unmappers = 21
	    shared_unmappers = 21
	    unshared_unmappers = 0
	    unaligned_mappers = 0
	    access_violations = 0
	    unaligned_size_requests = 0
	    unaligned_attachers = 0
	    wired_bypass = 0
	    wired_returns = 0
	}
	(dbx)

最高の性能を得るには,shared_mappers カーネル変数が共用メモリ・セグメントの個数と同じで,unshared_mappersunaligned_attachers,および unaligned_size_requests 変数がゼロでなければなりません。

共用メモリがどのように共用メモリ・セグメントに分割されるかによって,共用されないセグメントが存在することもあります。 これは,8 MB 境界に合っているのが,開始アドレスとサイズのどちらかだけの場合に発生します。 この状況は,避けられない場合もあります。 多くの場合,total_unmappers の値が total_mappers の値よりも大きくなります。

共用メモリのロックでは,単一のロックがロックのハッシュ配列に変更されます。 vm サブシステムの vm_page_lock_count 属性の値を変更することで,ロックのハッシュ配列のサイズを変更できます。 省略時の値は 0 です。

12.7    ビッグ・ページによる性能改善

ビッグ・ページ・メモリ割り当てでは,仮想メモリの 1 つのページを 8,64,または 512 ページの物理メモリに対応づけることができます。 物理メモリの現在のページ・サイズは 8 KB なので,仮想メモリの 1 つのページに,64,512,または 4906 KB のメモリを対応づけることができることになります。 ビッグ・ページを使用すると,変換索引バッファ (TLB) のヒット・ミスによる性能への影響を最小限に抑えることができます。 その結果,大量のデータをマップする必要があるアプリケーションの性能が改善されることがあります。

ブート時にメモリを予約し System V の共用メモリでのみ使用できる粒度ヒントと異なり,ビッグ・ページは実行時にメモリを割り当て,System V の共用メモリ,スタック・メモリ,およびテキスト・セグメントの他に,可変メモリ (たとえば,mmap および malloc) をサポートしています。

ビッグ・ページ・メモリの割り当ては,大量の物理メモリ・リソースを備えたシステムで稼働している大規模データベースのように,メモリを多用するアプリケーションで使用したときに,最も効果があります。 メモリ・リソースが限られているシステムや,負荷の重さに比較してメモリ・リソースが不足しているシステムでは,ビッグ・ページの使用はお勧めできません。 同様に,大量のメモリ・ブロックを必要とする,メモリ多用型のアプリケーションがシステムで稼働していない場合は,ビッグ・ページを使用しても効果が得られない可能性があります。

12.7.1    ビッグ・ページを使用する

ビッグ・ページの有効化と使用は,以下の vm カーネル・サブシステムの属性によって制御します。

vm_bigpg_enabled -- ビッグ・ページの有効化

ビッグ・ページを有効 (1) にするか,無効 (0) にします。

ビッグ・ページを有効にすると,自動的に粒度ヒントが無効になります。 vm_bigpg_enabled を 1 にしたときには,gh_chunksrad_gh_regions,および関連する属性は無視されます。

ビッグ・ページを無効にしたときには,関連する vm_bigpg* 属性は,無視されます。

省略時の値: 0 (無効)

ブート時にのみ設定できます。

vm_bigpg_thresh -- ページ・サイズごとの空きメモリの配分

4 種類のページ・サイズ (8,64,512,および 4096 KB) ごとに,空きページ・リストに確保する物理メモリの割合 (パーセント) です。

メモリのページが解放されたときには,より大きなページを形成するために,解放されたページとそれに隣接するページの結合が試みられます。 8 KB のページが解放されたときには,64 KB のページを形成するために,解放されたページと他の 7 つの隣接するページの結合が試みられます。 結合に成功したときには,64 KB のページが解放されたことになるため,512 KB のページを形成するために,そのページと他の 7 つの 64 KB ページの結合が試みられます。 このページは,可能ならば,4 MB のページを形成するために,他の 7 つの 512 KB のページと結合されます。 この結合処理は,これで終わります。

vm_bigpg_thresh 属性は,ページ・サイズごとの空きメモリの結合を開始するメモリ量のしきい値を指定します。 vm_bigpg_thresh が 0 パーセントの場合は,サイズが 8,64,512 KB のページが解放されたときには,必ずそのサイズのページの結合が試みられます。 その結果,小さいページがすべて結合され,空きページのサイズがすべて 4096 KB になる可能性があります。

vm_bigpg_thresh が 6 パーセント (省略時の設定) の場合は,システム・メモリの 6 パーセント以上が 8 KB ページになっているときにのみ,8 KB ページの結合が試みられます。 他の大きいページ・サイズについても同じことがいえます。 結果として,空きページのサイズは,6 パーセントが 8 KB になり,6 パーセントが 64 KB になり,6 パーセントが 512 KB になります。 残りの空きページのサイズは 4096 KB になります。 これは,空きメモリが十分あり,システム・メモリの 6 パーセントを 512 KB ページに割り当てることができることを前提としています。 空きメモリが減少したときには,最も大きいページ・サイズ (4096 KB) への空きページの割り当てが最初に影響を受けます。 続いて,512 KB ページへの割り当て,64 KB ページへの割り当ての順に影響を受けます。

vm_bigpg_thresh の値を小さくするほど,より多くのページが結合されるため,小さいサイズの使用可能メモリの量が少なくなります。 このようにすると,小さいサイズのページの割り当て要求を満たすために,大きいページを小さいサイズに分割しなければならないため,性能が低下する可能性があります。 vm_bigpg_thresh が大きすぎる場合は,使用可能な大きいサイズのページが少なくなるため,アプリケーションでは,ビッグ・ページの利点を生かすことができなくなります。 通常は,省略時の値で十分ですが,システムで稼働する業務で,小さいページを多く必要とする場合は,この値を大きくすることができます。

省略時の値: 6 パーセント。 最小値: 0 パーセント。 最大値: 25 パーセント。

ブート時と実行時に設定することができます。

12.7.2    メモリ・オブジェクトにビッグ・ページを使用するための条件を指定する

メモリ・オブジェクトの種類ごとに,ビッグ・ページを使用するための条件を指定する属性は,vm_bigpg_anonvm_bigpg_segvm_bigpg_shmvm_bigpg_ssm,および vm_bigpg_stack であり,これらの省略時の値は 64 です。 これは,プロセスからのメモリ要求のサイズのうち,拡張仮想ページ・サイズの恩恵を受けることができるサイズの最小値を KB 単位で表しています。

この省略時の値 (64) の場合,カーネルは,64 KB 以上のメモリ割り当て要求に対して,要求されたサイズに従って,1 つまたはそれ以上の仮想ページ (サイズは,8 KB,64 KB,512 KB,および 4096 KB が混在) を作成して要求に応えます。 この属性値は,ページ・サイズを指定しているわけではありません。 つまり,省略時の値の 64 KB は,すべての仮想ページのサイズが 64 KB になることを意味しているわけではありません。 代りに,カーネルは,要求された総メモリ量に最も適したページ・サイズ (またはサイズの組み合わせ) を,要求に強制される境界合わせ上の制限の範囲内で選択します。 カーネルは,64 KB より小さいメモリ割り当て要求に対しては,1 つの仮想ページを 8 KB の物理メモリにマップする省略時のアルゴリズムを使用して処理します。

この属性の値を 64 より大きくすると,ビッグ・ページ・メモリ割り当ての恩恵を受けることができるアプリケーションが,64 の場合のサブセットに制限されます。 たとえば,属性の値を 8192 にすると,8192 KB 以上のサイズで割り当てを要求するプログラムのみに 8 KB より大きい仮想ページが割り当てられます。

vm_bigpg_anonvm_bigpg_segvm_bigpg_shmvm_bigpg_ssm,または vm_bigpg_stack の値を 0 にすると,それぞれの属性に対応するメモリ・オブジェクトの種類に対するビッグ・ページ・メモリ割り当てが無効になります。 たとえば,vm_bigpg_anon を 0 にすると,可変メモリの割り当てを要求するプロセスに対するビッグ・ページ・メモリの割り当てが無効になります。 特定の種類のメモリに対するビッグ・ページ・メモリ割り当てを無効にしても,はっきりした効果は期待できません。

システムがブートされた後の vm_bigpg_anonvm_bigpg_segvm_bigpg_shmvm_bigpg_ssm,または vm_bigpg_stack への変更は,新たに実行されるメモリ割り当てにのみ影響を与えます。 実行時の変更は,すでに実施済みのメモリ・マッピングには影響を与えません。

以下の属性に 1 〜 64 の値を設定すると,64 を設定したものとみなされます。

注意

以下のオブジェクト毎の属性を省略時の値 (64 KB) 以外に変更するときには,最寄のサポート担当者に相談してください。

vm_bigpg_anon -- 可変メモリ用のビッグ・ページ

カーネルがプロセスのアドレス空間内の仮想ページを複数の物理ページに対応づけるようになるために,ユーザ・プロセスが要求しなければならない可変メモリの最小量 (KB 単位) を設定します。 可変メモリは,mmap()nmmap()malloc(),および amalloc() の呼び出しで要求されます。 メモリ・マップ・ファイルに対しては,可変メモリはサポートされていません。

注意

プロセスの常駐セット・サイズを制限するための anon_rss_enforce 属性の値が 1 または 2 のときには,この設定が優先され,可変メモリとスタック・メモリのビッグ・ページ・メモリ割り当てが無効になります。 可変メモリとスタック・メモリのビッグ・ページ・メモリ割り当てを有効にしたいときには,anon_rss_enforce に 0 を設定してください。

省略時の値: 64 KB

ブート時と実行時に設定可能。

vm_bigpg_seg -- プログラム・テキスト・オブジェクト用のビッグ・ページ

カーネルがプロセスのアドレス空間内の仮想ページを複数の物理ページに対応づけるようになるために,ユーザ・プロセスが要求しなければならないプログラム・テキスト・オブジェクトの最小量 (KB 単位) を設定します。 プログラム・テキスト・オブジェクトの割り当ては,プロセスがプログラムを実行するときやシェアード・ライブラリをロードするときに発行されます。 vm_segment_cache_maxvm_segmentation の説明も参照してください。

省略時の値: 64 KB

ブート時と実行時に設定可能。

vm_bigpg_shm -- 共用メモリ用のビッグ・ページ

カーネルがプロセスのアドレス空間内の仮想ページを複数の物理ページに対応づけるようになるために,ユーザ・プロセスが要求しなければならない System V 共用メモリの最小量 (KB 単位) を設定します。 System V 共用メモリの割り当ては,shmget()shmctl(),および nshmget() の呼び出しで発行されます。

省略時の値: 64 KB

ブート時と実行時に設定可能。

vm_bigpg_ssm -- セグメント化共用メモリ用のビッグ・ページ

カーネルがプロセスのアドレス空間内の仮想ページを複数の物理ページに対応づけるようになるために,ユーザ・プロセスが要求しなければならないセグメント化共用メモリ (共用ページ・テーブルを用いた System V 共用メモリ) の最小量 (KB 単位) を設定します。 セグメント化共用メモリの要求は,shmget()shmctl(),および nshmget() の呼び出しで発行されます。

ssm_threshold IPC 属性の値が 0 のときには,vm_bigpg_ssm 属性は無効になります。 ssm_threshold の値は,SSM_SIZE の値以上でなければなりません。 省略時の設定では,ssm_threshold の値は SSM_SIZE です。 詳細は, sys_attrs_ipc(5) を参照してください。

省略時の値: 64 KB

ブート時と実行時に設定可能。

vm_bigpg_stack -- スタック・メモリ用のビッグ・ページ

カーネルがプロセスのアドレス空間内の仮想ページを複数の物理ページに対応づけるようになるために,ユーザ・プロセス・スタックに必要なメモリの最小量 (KB 単位) を設定します。 スタック・メモリは,ユーザのためにカーネルが自動的に割り当てます。

プロセスの常駐セット・サイズを制限するための anon_rss_enforce 属性の値が 1 または 2 のときには,この設定が優先され,可変メモリとスタック・メモリのビッグ・ページ・メモリ割り当てが無効になります。 可変メモリとスタック・メモリのビッグ・ページ・メモリ割り当てを有効にしたいときには,anon_rss_enforce に 0 を設定してください。

省略時の値: 64 KB

ブート時と実行時に設定可能。

詳細は, sys_attrs_vm(5) を参照してください。