メモリ・リソースを最適化することで,Tru64 UNIX の性能を改善できる場合があります。 通常は,ページングやスワッピングをなくすか減らすのが,性能を改善する最適な方法です。 そのためには,メモリ・リソースを追加します。
この章では,次の項目について説明します。
オペレーティング・システムがプロセスおよびファイル・システム・キャッシュに仮想メモリを割り当てる方法,およびメモリが再生 (reclaim) される方法 (12.1 節)。
性能の高いスワップ領域を構成する方法 (12.2 節)
メモリ使用状況の情報を表示する方法 (12.3 節)。
プロセス用のメモリ・リソースを増やすために変更できるカーネル・サブシステム属性 (12.4 節)。
ページングおよびスワッピング動作の変更 (12.5 節)。
共用メモリ用に物理メモリを予約する方法 (12.6 節)。
ビッグ・ページを使用して,メモリを多用するアプリケーションの性能を改善する方法 (12.7 節)
オペレーティング・システムは,ページと呼ばれる 8 KB 単位で物理メモリを割り当てます。 仮想メモリ・サブシステムはシステム内のすべての物理ページを維持管理し,ページを次の 3 つの領域に効率的に分配します。
静的固定メモリ
ブート時に割り当てられ,オペレーティング・システムのデータやテキスト,システム・テーブル用に使用されます。 UNIX ファイル・システム (UFS) や CD-ROM ファイル・システム (CDFS) の最近アクセスされたメタデータを保持するメタデータ・バッファ・キャッシュにも,静的固定メモリが使用されます。
静的固定メモリの量は,サブシステムを削除するか,メタデータ・バッファ・キャッシュのサイズを小さくしないかぎり,減らすことはできません (12.1.2.1 項を参照)。
動的固定メモリ
動的固定メモリはブート時に割り当てられ,システム・ハッシュ・テーブルなどの,動的に割り当てられるデータ構造体用に使用されます。
ユーザ・プロセスも,mlock
関数などの仮想メモリ・ロック・インタフェースを使用して,アドレス空間に動的固定メモリを割り当てます。
動的固定メモリの量は,要求に従って変化します。
vm
サブシステムの
vm_syswiredpercent
属性は,ユーザ・プロセスが固定できるメモリ量の最大値 (省略時は,物理メモリの 80 パーセント) を指定します。
プロセスおよびデータ・キャッシュ用の物理メモリ
固定されていない物理メモリを,ページング可能メモリといいます。 このメモリは,プロセスが最近アクセスした可変メモリ (変更可能な仮想アドレス空間) と,ファイル・バック・メモリ (プログラム・テキストやシェアード・ライブラリ用に使用されるメモリ) 用に使用されます。 ページング可能メモリは,AdvFS のメタデータやファイル・データの他,最近アクセスされた UFS ファイル・システム・データ (読み取り書き込み用,およびマッピングされたファイル領域でのページ・フォールト用) のキャッシュにも使用されます。
仮想メモリ・サブシステムは,プロセスおよびファイル・システムの要求に応じて,物理ページを割り当てます。
限られた量の物理メモリをプロセスとファイル・システムが取り合うため,仮想メモリ・サブシステムは最も古いページの内容を定期的にスワップ領域またはスワップ・ディスクに書き込んで,そのページを再生します (ページング)。
負荷が高い場合は,メモリを解放するためにプロセス全体が中断されることがあります (スワッピング)。
この章で説明しているように,各種の
vm
サブシステム属性をチューニングすることで仮想メモリの動作を制御できます。
どのチューニング・ガイドラインに従えば処理性能を改善できるかを判断するには,メモリの動作を理解していなければなりません。 以降の項では,仮想メモリ・サブシステムが下記の処理をどのように行うかを説明します。
物理ページの維持管理 (12.1.1 項)
ファイル・システム・バッファ・キャッシュへのメモリの割り当て (12.1.2 項)
プロセスへのメモリの割り当て (12.1.3 項)
ページの再生 (12.1.4 項)
仮想メモリ・サブシステムは,システム内のすべての物理メモリ・ページを維持管理します。 ページのリストを使用して,各ページの位置と古さが管理されます。 最も古いページが,最初に再生 (再利用) されます。 各物理ページはいつでも,次のリストのいずれかに置かれます。
ページの再生は,空きリストのサイズが限界値 (チューニング可能) まで減ったときに開始されます。
アクティブ・リスト -- プロセスまたはユニファイド・バッファ・キャッシュ (UBC) で現在使用されているページ
どのアクティブ・ページを最初に再生 (再利用) するかを決定するために,ページ・スティーラ・デーモンがアクティブ・リスト上で最も古いページを見つけます。 プロセスが使用している最も古いページは,非アクティブ・ページと見なされます。 UBC が使用している最も古いページは,UBC LRU (Unified Buffer Cache least-recently used) ページと呼ばれます。
ページ・リスト上にあるページの数を調べるには,vmstat
コマンドを使用します。
アクティブ・リスト (vmstat
の出力の
act
フィールド) 上のページには,非アクティブ・ページと UBC LRU ページも含まれます。
12.1.2 ファイル・システム・バッファ・キャッシュのメモリ割り当て
オペレーティング・システムは,ファイル・システムのユーザ・データとメタデータを格納するために,キャッシュを使用します。 キャッシュが後で再使用された場合は,ディスク入出力動作を行わなくてすむため,性能が向上します。 これは,ディスク入出力動作よりも,メモリからのデータ取り出しの方が高速なためです。
以降の項では,次のファイル・システムのキャッシュについて説明します。
メタデータ・バッファ・キャッシュ (12.1.2.1 項)
ユニファイド・バッファ・キャッシュ (12.1.2.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
システム・コールは次の処理を行います。
カーネルがプロセスの維持管理に使用するデータ構造体セットと,リソース限界値のセットなどからなる,UNIX プロセス本体を作成します。
詳細は,
fork
(2)
プロセス用に,連続したブロックの仮想アドレス空間を作成します。 仮想アドレス空間は,実際の物理メモリへマッピングするためにプロセスが使用する仮想ページの配列です。 仮想アドレス空間は,可変メモリ (プロセスの実行中に変更されるデータ要素や構造体を保持するメモリ) とファイル・バック・メモリ (プログラム・テキストやシェアード・ライブラリに使用されるメモリ) 用に使用されます。
物理メモリの量は限られているため,プロセスの仮想アドレス空間全体を一度に物理メモリに置くことはできません。 ただし,仮想アドレス空間の一部 (プロセスのワーキング・セット) が物理メモリにマッピングされていれば,プロセスは実行できます。 可変メモリとファイル・バック・メモリのページは,必要なときだけメモリに読み込まれます (ページ・イン)。 メモリ要求が増えてページを再生しなければならない場合,可変メモリのページはページ・アウトされ,その内容はスワップ領域に移動されます。 一方,ファイル・バック・メモリのページは,単に解放されるだけです。
スレッド (実行の流れ) を 1 つ以上作成します。 省略時は,1 プロセスにつき 1 スレッドです。 マルチプロセシング・システムでは,複数のプロセス・スレッドをサポートしています。
仮想メモリ・サブシステムは,各プロセスに大量の仮想アドレス空間を割り当てますが,プロセスはこの空間の一部しか使用しません。 ユーザ領域には,4 TB だけが割り当てられます。 ユーザ領域は一般的にプライベートで,非共用の物理ページにマッピングされます。 さらに 4 TB の仮想アドレス空間が,カーネル空間用に使用されます。 カーネル空間は通常,共用物理ページにマッピングされます。 残りの空間は,何の用途にも使用されません。
図 12-4
に,プロセスの仮想アドレス空間の用途を示します。
図 12-4: プロセス仮想アドレス空間の用途
仮想ページがアクセスされると,仮想メモリ・サブシステムは物理ページを見つけて,仮想アドレスを物理アドレスに変換しなければなりません。 各プロセスには,仮想アドレスから物理アドレスへの現在の変換エントリからなる配列である,ページ・テーブルがあります。 ページ・テーブルのエントリは,仮想アドレスに順番に対応しており (つまり,仮想アドレス 1 がページ・テーブル・エントリ 1 に対応する),物理ページへのポインタと保護情報を持っています。
図 12-5
に,仮想アドレスから物理アドレスへの変換を示します。
図 12-5: 仮想アドレスから物理アドレスへの変換
プロセスの常駐セットとは,物理アドレスにマッピングされたことのあるすべての仮想アドレス (つまり,プロセスの動作中にアクセスされたすべてのページ) のセットのことです。 常駐セットのページは,複数のプロセスで共用されている可能性があります。
プロセスのワーキング・セットとは,現在,物理アドレスにマッピングされている仮想アドレスのセットのことです。
ワーキング・セットは常駐セットのサブセットで,ある時点でのプロセスの常駐セットのスナップショットです。
12.1.3.3 ページ・フォールト
可変メモリ (ファイル・バック・メモリではない) の仮想アドレスが要求された場合,仮想メモリ・サブシステムは物理ページを見つけ,そのページをプロセスから使用できるようにしなければなりません。 この速度は,ページがメモリとディスクのどちらにあるかによって異なります (図 1-10 を参照)。
要求されたアドレスが現在使用中の場合 (つまり,そのアドレスがアクティブ・ページ・リストにある場合) は,ページ・テーブルにそのアドレスのエントリがあります。 この場合,PAL コードが物理アドレスを変換索引バッファ (TLB) にロードし,TLB から CPU にアドレスが渡されます。 この処理はメモリ動作なので高速です。
要求されたアドレスがページ・テーブル内でアクティブでない場合,PAL の検索コードはページ・フォールトを発行します。 ページ・フォールトにより,仮想メモリ・サブシステムはページを見つけ,ページ・テーブルで仮想アドレスから物理アドレスへの変換ができるようにします。
ページ・フォールトには,次の 4 種類があります。
要求された仮想アドレスが,初めてアクセスされるアドレスの場合は,ゼロフィル・オンデマンド・ページ・フォールトが発生します。 仮想メモリ・サブシステムは,次の処理を実行します。
使用可能な物理メモリ・ページを割り当てます。
ページをゼロで埋めます。
ページ・テーブルに,仮想アドレスから物理アドレスへの変換を設定します。
要求された仮想アドレスが,すでにアクセスされたことがあり,メモリ・サブシステムの内部データ構造体にある場合は,ショート・ページ・フォールトが発生します。 たとえば,物理アドレスがハッシュ・キュー・リストまたはページ・キュー・リストにある場合,仮想メモリ・サブシステムはそのアドレスを CPU に渡し,仮想アドレスから物理アドレスへの変換をページ・テーブルに設定します。 この処理はメモリ動作なので高速です。
要求された仮想アドレスがすでにアクセスされたことがあり,物理ページが再生されている場合,ページの内容は空きページ・リストまたはスワップ領域にあります。 ページが空きページ・リストにある場合は,ハッシュ・キューおよび空きリストから取り除かれ,再利用されます。 この動作は高速で,ディスク入出力を伴いません。
ページがスワップ領域にある場合は,ページ・イン・ページ・フォールトが発生します。 仮想メモリ・サブシステムはページの内容をスワップ領域から物理メモリにコピーし,仮想アドレスから物理アドレスへの変換をページ・テーブルに設定します。 この処理にはディスク入出力動作が必要なため,メモリ動作よりも時間がかかります。
プロセスが読み取り専用仮想ページを変更しようとした場合,コピー・オン・ライト・ページ・フォールトが発生します。 仮想メモリ・サブシステムは使用可能な物理メモリ・ページを割り当て,読み取り専用ページの内容を新しいページにコピーし,ページ・テーブルに変換を設定します。
仮想メモリ・サブシステムでは,プロセスの実行時間を改善し,ページ・フォールトの回数を減らすために,次の技法を使用します。
追加ページのマッピング
仮想メモリ・サブシステムでは,どのページが次に必要となるかを予測します。 どのページが最近使用されたかや,使用可能なページの数,その他の要因をチェックするアルゴリズムを使用して,サブシステムは要求されたアドレスを含むページとともに追加ページをマッピングします。
可能であれば,仮想メモリ・サブシステムはプロセスの常駐セット全体の 2 次キャッシュへのマッピングを試み,テキストとデータがキャッシュにある状態で処理全体を実行します。
vm
サブシステムの
private_cache_percent
属性は,可変メモリ用に予約する 2 次キャッシュの割合を指定します。
この属性は,ベンチマークにのみ使用されます。
省略時は,キャッシュの 50 パーセントが可変メモリ用に予約され,50 パーセントがファイル・バック・メモリ (共用) 用に予約されます。
可変メモリのキャッシュを大きくするには,private_cache_percent
属性の値を大きくします。
メモリ・リソースの量は限られているため,仮想メモリ・サブシステムは定期的にページを再生しなければなりません。 空きページ・リストには,プロセスおよび UBC から利用できるクリーン・ページが置かれています。 メモリに対する要求が増えると,このリストが使い尽くされてしまうことがあります。 ページ数が限界値 (チューニング可能) より少なくなると,仮想メモリ・サブシステムは,プロセスおよび UBC が使用している最も古いページを再生することによって,空きリストを補充します。
ページを再生するために,仮想メモリ・サブシステムは次の処理を実行します。
メモリ不足を防止するために,変更されたページをスワップ領域に事前に書き出します。 詳細は,12.1.4.1 項を参照してください。
メモリ要求を満たすことができなかった場合は,次の手順でページングを開始します。
UBC が借用しているページを再生し,空きページ・リストにいれます。
アクティブ・リスト内で最も古い非アクティブ・ページおよび UBC LRU ページを再生し,その変更されたページの内容をスワップ領域またはスワップ・ディスクに移動して,空きリストにクリーン・ページを置きます。
必要であれば,アクティブ・リスト内のページをもっと積極的に再生 (再利用) します。
ページングによるメモリの再生についての詳細は,12.1.4.2 項を参照してください。
メモリ要求を満たすことができなかった場合は,スワッピングを開始します。 仮想メモリ・サブシステムは,一時的にプロセスを中断し,常駐セット全体をスワップ領域に移動して,多数のページを解放します。 スワッピングについては,12.1.4.3 項を参照してください。
ページングおよびスワッピングの開始時期と停止時期は,いくつかの
vm
サブシステム属性によって決まります。
図 12-6
に,ページングおよびスワッピングを制御する属性の一部を示します。
図 12-6: ページングおよびスワッピングの属性
この属性の詳細は,次のとおりです。
vm_page_free_target
--
ページングを停止するしきい値を指定します。
空きページ・リスト上のページ数がこの値に達すると,ページングが停止します。
vm_page_free_target
属性の省略時の値は,システムのメモリ量に依存します。
表 12-1
を使用して,ご使用のシステムでの省略時の値を確認してください。
表 12-1: 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_min
--
ページの割り当てに対応して,ページの再生を行わなければならないしきい値を指定します。
省略時の値は,vm_page_free_reserved
属性の 2 倍です。
vm_page_free_reserved
--
メモリの割り当てを特権タスクに制限する時期を決めるしきい値を指定します。
空きページ・リストのページ数がこの値を下回ると,メモリを取得できるのは特権タスクだけになります。
省略時の値は 10 ページです。
vm_page_free_swap
--
アイドル・タスクのスワッピングを開始するしきい値を指定します。
空きページ・リストのページ数がこの値を下回ると,アイドル・タスクのスワッピングが開始されます。
省略時の値は,次の式で計算されます。
vm_page_free_min + ((vm_page_free_target - vm_page_free_min) / 2)
vm_page_free_optimal
--
ハード・スワッピングを開始するしきい値を指定します。
空きリストにあるページの数がこの値を 5 秒間下回ると,ハード・スワッピングが開始されます。
最初にスワップ・アウトされるのは,スケジューリングの優先順位が最も低く,常駐セットのサイズが最も大きいプロセスです。
省略時の値は,次の式で計算されます。
vm_page_free_min + ((vm_page_free_target - vm_page_free_min) / 2)
vm_page_free_hardswap
--
ページ・スワッピングを停止するしきい値を指定します。
空きリストにあるページの数がこの値まで増えると,ページングが停止します。
省略時の値は,vm_page_free_target
属性の値を 16 倍した値です。
ページングおよびスワッピングの属性の変更方法については,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
属性の値未満になった場合,仮想メモリ・サブシステムはページングを使用して,空きページ・リストを補充します。
ページ・アウト・デーモンおよびタスク・スワッパ・デーモンはページ再生処理の延長であり,ページングおよびスワッピングを制御します。
ページング処理は,次の手順で実行されます。
ページ再生処理が,ページ・スティーラ・デーモンを起動します。
このデーモンは,UBC のサイズが借用しきい値以下になるまで,UBC が仮想メモリ・サブシステムから借用しているクリーン・ページをまず再生します。
借用しきい値は
ubc_borrowpercent
属性の値で指定され,省略時の値は 20 パーセントです。
UBC ページは変更されないことが多いため,UBC の借用ページを解放すると,素早くページを再生できます。
再生したページがダーティな (変更されている) 場合は,そのページの内容をディスクに書き出してから,ページを空きページ・リストに移動しなければなりません。
クリーンな UBC 借用メモリを解放しても,空きリストの補充が十分でない場合は,ページ・アウトが発生します。 ページ・スティーラ・デーモンが,アクティブ・ページ・リスト内の最も古い非アクティブ・ページおよび UBC LRU ページを再生 (再利用) し,その変更ページの内容をディスクに移動して,クリーン・ページを空きリストに置きます。
空きページが減り続けると,ページングは一層活発になります。
空きページ・リスト上のページの数が
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
サブシステム属性によって制御されます。
アイドル・タスクのスワッピングは,空きリスト上のページの数が一定時間
vm_page_free_swap
属性の値より少なくなったときに開始されます。
タスク・スワッパは,30 秒以上アイドル状態だったタスクをすべて中断させます。
ハード・タスク・スワッピングは,空きページ・リスト上のページの数が,5 秒以上の間
vm_page_free_optimal
属性の値より少なくなったときに開始されます。
タスク・スワッパは,一度に 1 つずつ,優先順位が最も低く,常駐セットのサイズが最も大きいタスクを中断させます。
スワッピングは,空きリスト上のページの数が
vm_page_free_hardswap
属性の値まで増えたときに停止します。
スワップ・インは,空きリスト上のページの数が一定時間
vm_page_free_optimal
属性の値以上になったときに発生します。
vm_inswappedmin
属性の値は,タスクがスワップ・アウト状態のままでいなければならない,最小時間 (秒) を指定します。
この時間が経過すると,タスクをスワップ領域から取り出せるようになります。
省略時の値は 1 秒です。
タスクのワーキング・セットがスワップ領域からページ・インされ,そのタスクは実行できる状態になります。
vm_inswappedmin
属性の値は,システムをリブートすることなく変更できます。
スワッピングの開始時期と停止時期を制御する属性を変更することによって,システムの性能が向上することがあります (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 項を参照してください。
次のリストで,性能の高いスワップ領域の構成方法について説明します。
すべてのスワップ・デバイスが,システムの稼働中に追加されたのではなく,システムのブート時に構成されていることを確認します。
ページ・フォールトによる遅延を少なくするには,速いディスクをスワップ領域に使用します。
ビジー状態でないディスクをスワップ領域に使用します。
スワップ領域を複数のディスクに分散させます。 1 つのディスクに複数のスワップ・パーティションを置かないでください。 分散させるとページングおよびスワッピングがより効率的になり,1 つのアダプタ,ディスク,またはバスがボトルネックになるのを防止できます。 ページ再生処理では,データが複数のディスクに書き込まれた場合に性能が向上するディスク・ストライピングの一種 (スワップ領域インタリービング) を使用します。
1 つのバスがボトルネックになることがないように,スワップ・ディスクを複数の入出力バスに分散させます。
複数のスワップ・デバイスを用いるときには,デバイスをストライピングして 1 つの論理スワップ・デバイスとして構成するのではなく,複数の独立したデバイス (または LSM ボリューム) として構成します。
ページングが頻繁に発生していて,システムのメモリ量を増やすことができない場合は,スワップ・デバイスに RAID5 を使用することを検討してください。 RAID5 についての詳細は,第 9 章を参照してください。
スワップ・デバイスの追加についての詳細は,『システム管理ガイド』を参照してください。
性能および可用性を高めるための,ディスクの構成およびチューニングについての詳細は,第 9 章を参照してください。
12.3 メモリ統計情報のモニタリング
表 12-2
では,メモリ使用状況の表示に使用するツールについて説明します。
表 12-2: 仮想メモリおよび UBC を表示するためのツール
以降の項では,vmstat
,ps
,swapon
,および
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 や仮想メモリの問題の診断に使用できる情報が含まれています。
次のフィールドを調べてください。
プロセス情報 (procs
):
r
--
実行中または実行可能状態のスレッドの数。
w
--
割り込み可能な待ち状態 (イベントまたはリソースを待っていて,割り込みや中断が可能な状態) のスレッドの数。
たとえば,ユーザからのシグナルを受けたり,メモリからスワップ・アウトさせることができます。
u
--
割り込み不可の待ち状態 (イベントまたはリソースを待っていて,割り込みや中断ができない状態) のスレッドの数。
たとえば,この状態のスレッドはユーザからのシグナルを受けることができません。
シグナルを受けるには,待ち状態から抜けなければなりません。
割り込み不可の待ち状態のプロセスは,kill
コマンドで停止できません。
仮想メモリ情報 (memory
):
act
--
アクティブ・リスト上のページの数 (非アクティブ・ページと UBC LRU ページを含む)。
free
--
空きリスト上のページの数。
wire
--
固定リスト上のページの数。
固定リスト上のページは,再生 (再利用) できません。
ページング情報 (pages
):
fault
--
アドレス変換フォールトの数。
cow
--
コピー・オン・ライト・ページ・フォールトの数。
親プロセスと子プロセスでメモリ・ページを共用していて,いずれかのプロセスがこのページを変更しようとした場合に,このページ・フォールトが発生します。
コピー・オン・ライト・ページ・フォールトが発生すると,仮想メモリ・サブシステムは,新しいアドレスを変換バッファにロードしてから,要求されたページの内容をこのアドレスにコピーし,その内容をプロセスが変更できるようにします。
zero
--
ゼロフィル・オンデマンド・ページ・フォールトの数。
要求されたページが内部データ構造体にはなく,一度も参照されたことがない場合に,このページ・フォールトが発生します。
ゼロフィル・オンデマンド・ページ・フォールトが発生した場合,仮想メモリ・サブシステムは利用可能な物理メモリ・ページを割り当て,そのページをゼロで埋めてから,そのアドレスをページ・テーブルに設定します。
react
--
非アクティブ・ページ・リストにある間にページ・フォールトが発生した (参照された) ページの数。
pin
--
ページ・スティーラ・デーモンが要求したページの数。
pout
--
ディスクにページ・アウトされたページの数。
in
--
クロック・デバイス以外で 1 秒間に発生した割り込みの数。
sy
--
1 秒間に呼び出されたシステム・コールの数。
cs
--
1 秒間に発生したタスクおよびスレッドのコンテキスト切り替えの数。
CPU 使用状況 (cpu
):
us
--
通常プロセスおよび優先プロセスのユーザ時間の割合。
ユーザ時間には,CPU がライブラリ・ルーチンを実行した時間も含まれます。
sy
--
システム時間の割合。
システム時間には,CPU がシステム・コールを処理した時間も含まれます。
id
--
アイドル時間の割合。
vmstat
コマンドによる CPU 使用状況モニタリングについては,12.3.1 項を参照してください。
[例に戻る]
vmstat
コマンドを用いてメモリ性能の問題を診断するには,次の手順を実行します。
空きページ・リストのサイズ (free
) をチェックします。
空きページの数と,アクティブ・ページ (act
) および固定ページ (wire
) の値を比較します。
空きページ,アクティブ・ページ,および固定ページの合計が,システムの物理メモリの量に近くなければなりません。
free
の値は小さくなければなりませんが,値が定常的に小さく (128 ページ未満),過度なページングやスワッピングが発生している場合は,作業負荷に対して物理メモリの量が十分でない可能性があります。
次のようなコマンド出力は,構成に対して UBC のサイズが小さすぎることを示しています。
vmstat
コマンドまたは
monitor
コマンドの出力で,ファイル・システムのページ・インが頻発しているがページ・アウト動作が少ないまたは全くない状態が示されるか,空きページ数が非常に少ないことが示される。
iostat
コマンドの出力で,スワップ・ディスクの入出力動作が少ないまたは全くない状態が示されるか,ファイル・システムの入出力動作が過度であることが示される。
詳細は,9.2 節を参照してください。
ページングが過度になると,2 次キャッシュのミス率が高くなります。 この状況は,次の出力で示されることがあります。
ps
コマンドの出力で,タスク・スワッピング動作が頻繁であることが示される。
詳細は,12.3.2 項を参照してください。
swapon
コマンドの出力で,スワップ領域の使用が過度であることが示される。
詳細は,12.3.3 項を参照してください。
物理メモリの使用状況に関する統計情報を表示するには,次のように入力します。
# 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.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 や仮想メモリの問題の診断に使用できる,次の情報が含まれます。
CPU 時間の使用量の割合 (%CPU
)。
[例に戻る]
実メモリの使用量の割合 (%MEM
)。
[例に戻る]
プロセスの仮想アドレスのサイズ (VSZ
) --
このプロセスに割り当てられている可変メモリの総量 (バイト)。
[例に戻る]
プロセスの実メモリ (常駐セット) サイズ (RSS
) --
仮想ページにマッピングされている物理メモリの総量 (アプリケーションが物理的に使用したメモリの総量で,単位はバイト)。
共用メモリは,常駐セットのサイズに含まれます。
このため,このサイズの総計は,システムで利用可能な物理メモリの総量を超えることがあります。
[例に戻る]
プロセスの状態 (S
) --
プロセスが次のどの状態にあるかを示します。
実行可能 (R
)。
スリープ中 (S
) --
プロセスはイベントまたはリソースを待っています (20 秒未満)。
ただし,割り込みや中断は可能です。
たとえば,プロセスはユーザ・シグナルを受けることや,スワップ・アウトが可能です。
割り込み不可のスリープ中 (U
) --
プロセスはイベントまたはリソースを待っています。
このとき,割り込みや中断はできません。
kill
コマンドを使用してこの状態のプロセスを停止させることはできません。
この状態のプロセスがシグナルを受け取るには,待ち状態から抜けなくてはなりません。
アイドル (I
) --
プロセスは,20 秒以上スリープ状態になっています。
終了 (T
) --
プロセスは終了しています。
停止 (H
) --
プロセスは停止しています。
スワップ・アウト (W
) --
プロセスはメモリからスワップ・アウトされています。
メモリにロック中 (L
) --
プロセスは,メモリにロックされ,スワップ・アウトできない状態です。
メモリ要求がソフト限界値を超えている (>
)。
制御端末を持ったプロセス・グループ・リーダ (+
)。
優先順位が下げられている (N
)。
優先順位が上げられている (<
)。
現在までに使用した CPU 時間 (TIME
)。
フォーマットは,hh:mm:ss.ms
です。
[例に戻る]
実行しているコマンド (COMMAND
)。
[例に戻る]
ps
コマンドの出力から,どのプロセスがシステムの CPU 時間およびメモリ・リソースを最も消費し,プロセスがスワップ・アウトされているかどうかを調べることができます。
実行中またはページング中のプロセスに的を絞ってください。
考慮すべき事項を,次に説明します。
プロセスが大量のメモリを使用している場合 (RSS
フィールドおよび
VSZ
フィールドを参照),過度なメモリ要求が発生することがあります。
アプリケーションのメモリ使用量を少なくする方法については,7.1 節
を参照してください。
プロセスが重複して実行されている場合は,kill
コマンドを使用して重複プロセスを終了させます。
詳細は
kill
(1)
プロセスが大量の CPU 時間を使用している場合,無限ループに陥っている可能性があります。
kill
コマンドを使用してプロセスを終了させなければなりません。
ソース・コードを変更して問題を修正しなければならないことがあります。
また,クラス・スケジューラを使用して特定のタスクやアプリケーションに CPU 時間の割合を指定して割り当てることや (13.2.2 項を参照),nice
コマンドまたは
renice
コマンドを使用してプロセスの優先順位を下げることができます。
これらのコマンドは,プロセスのメモリ使用状況には効果がありません。
詳細は,
nice
(1)renice
(8)
スワップ・アウトされたプロセスをチェックします。
S
(状態) フィールドを調べてください。
このフィールドが
W
のプロセスはスワップ・アウトされています。
プロセスのスワップ・アウトが繰り返されている場合は,メモリ・リソースが不足している可能性があります。
メモリ・リソースの追加については,12.4 節を参照してください。
このコマンドとオプションの詳細は,
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
サブシステム属性を説明します。
kmemreserve_percent
-- ページ・サイズ (8 KB) 以下のカーネル・メモリ割り当て用に予約される物理メモリの割合を指定します。
kmemreserve_percent
属性は,リブートすることなく変更できます。
チューニングするかどうかの判断
ドロップしたパケットがあることが
netstat
-d
-i
コマンドの出力で示された場合や,ドロップしたパケットが
vmstat
-M
コマンドの
fail_nowait
見出しの下に出力された場合は,kmemreserve_percent
属性の値を大きくしてください。
このような状況は,ネットワークの負荷が高い場合に発生します。
カーネル・サブシステム属性の変更については,第 3 章を参照してください。
12.5 ページング動作およびスワッピング動作の変更
以降の項で示すように,ページング動作とスワッピング動作を変更することで,性能を改善できることがあります。
ページングしきい値を大きくする (12.5.1 項)。
スワッピング・レートを管理する (12.5.2 項)。
スワッピングを積極的に行うようにする (12.5.3 項)。
プロセスの常駐セットのサイズを制限する (12.5.4 項)。
ダーティ・ページの事前書き出しの頻度を管理する (12.5.5 項)。
ページ・イン・クラスタおよびページ・アウト・クラスタのサイズを管理する (12.5.6 項)。
入出力要求を管理する (12.5.7 項)。
メモリ・ロックを使用する (7.1.7 項)。
ページングとは,プログラムの一部 (ページ) をメモリ内へ,またはメモリから外へ転送することです。
ページングは頻繁に発生しないようにしてください。
ページングが開始されない,空きリストの最小ページ数を指定できます。
ページングについての詳細は,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_optimal
--
ハード・スワッピングが開始されるしきい値を指定します。
空きリスト上のページの数がこの値を 5 秒間下回ると,ハード・スワッピングが開始されます。
vm_page_free_min
+ ((vm_page_free_target
-
vm_page_free_min)/ 2 )
vm_page_free_min
--
ページ・スワッピングが開始されるしきい値を指定します。
空きリスト上のページの数がこの値を下回ると,ページングが開始されます。
vm_page_free_reserved
の値の 2 倍)。
vm_page_free_reserved
--
メモリの割り当てを特権タスクに制限する時期を決めるしきい値を指定します。
空きリスト上のページの数がこの値を下回ると,特権タスクのみがメモリを取得できるようになります。
vm_page_free_target
--
空きページ・リスト上のページの数がこの値まで増えると,ページングが停止します。
省略時の値は,システム上で利用できる管理対象メモリの容量に従って決まり,次の表のとおりです。
使用可能なメモリ (MB) | vm_page_free_target (ページ) |
512 未満 | 128 |
512 〜 1023 | 256 |
1024 〜 2047 | 512 |
2048 〜 4095 | 768 |
4096 以上 | 1024 |
vm_page_free_optimal
,vm_page_free_min
,vm_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
属性は,タスク・スワッパがアイドル・タスクを積極的にスワップ・アウトするかどうかを指定します。
チューニングするかどうかの判断
タスク・スワッピングを積極的に行うと,システムのスループットが向上します。 ただし,対話処理の応答性能が低下します。 通常は,タスク・スワッピングを積極的に行う必要はありません。
vm_aggressive_swap
属性の値は,リブートすることなく変更できます。
カーネル属性の変更についての詳細は,第 3 章
を参照してください。
12.5.4 スワッピングを避けるために常駐セットのサイズを制限する
Tru64 UNIX は,特に指定しないかぎりプロセスの常駐セットのサイズを制限しません。
アプリケーションでは,setrlimit()
コールで
RLIMIT_RSS
リソース値を指定することにより,プロセスごとのメモリ常駐ページ数の限界値を設定できます。
ただし,アプリケーションでのプロセスの常駐セットのサイズの制限は必須ではなく,システム・ワイドの省略時の限界値はありません。
したがって,プロセスの常駐セットのサイズは,システムのメモリ制限によってのみ制限されます。
メモリの要求が空きページの数を上回ると,常駐セットのサイズが大きいプロセスがスワッピングの候補となります。
スワッピングについての詳細は,12.1.4 項
を参照してください。
常駐セットのサイズが大きいためにプロセスがスワッピングされるのを防ぐには,常駐セットのサイズに対して,プロセス固有の限界値とシステム・ワイドの限界値を指定します。
関連する属性
常駐セットのサイズ制限に関連する
vm
サブシステム属性を,以下のリストに示します。
anon_rss_enforce
--
プロセスの常駐セットの大きさの制御や,空きページの窮迫時に,プロセスが使用している可変メモリをスワップ・アウトする (プロセスをブロックする) 時期の制御を行うためのレベルを指定します。
anon_rss_enforce
を 1 または 2 に設定すると,vm_rss_max_percent
属性によって,プロセスの常駐セットのサイズにシステム・ワイドの限界値を強制できるようになります。
anon_rss_enforce
を 1 (ソフト限界値) に設定すると,vm_rss_block_target
および
vm_rss_wakeup_target
属性を設定することによって,プロセスのブロックと,可変メモリのページングを細かく制御できます。
vm_rss_max_percent
--
すべてのプロセスに対して常駐セットのサイズのシステム・ワイドの限界値となる,可変メモリの総ページ数に対する割合を指定します。
この属性の値は,anon_rss_enforce
属性が 1 または 2 に設定されている場合にのみ有効です。
この割合を小さくすると,すべてのプロセスに対して,常駐セットのサイズのシステム・ワイドの限界値を強制することができます。
ただし,この限界値は,特権プロセスと非特権プロセスのどちらにも適用され,setrlimit()
コールによってより大きな常駐セット・サイズをプロセスに設定していても,それが無効になるので注意してください。
vm_rss_block_target
--
プロセスの常駐セットからの可変メモリのスワッピングを開始する,空きページ数のしきい値を指定します。
可変メモリのページングは,空きページ数がこの値と同じか下回った場合に開始されます。
プロセスは,空きページ数が
vm_rss_wakeup_target
属性で指定された値まで増加するまで,ブロックされます。
vm_page_free_optimal
と同じ。
この値を大きくすると,ハード・スワッピングが開始される前に可変メモリがページングされます。 この値を小さくすると,可変メモリのページングは,ハード・スワッピングが開始される時点よりも遅くなります。
vm_rss_wakeup_target
--
可変メモリがスワップ・アウトされているプロセスのブロックを解除する,空きページ数のしきい値を指定します。
空きページの数がこの値まで増えると,プロセスのブロックが解除されます。
vm_page_free_optimal
と同じ。
この値を大きくすると,タスクのブロックが解除される前に,より多くのメモリが解放されます。 この値を小さくするとタスクのブロック解除が早くなりますが,解放されるメモリは少なくなります。
vm_page_free_optimal
--
ハード・スワッピングが開始されるしきい値を指定します。
空きリスト上のページの数がこの値を 5 秒間下回ると,ハード・スワッピングが開始されます。
vm_page_free_min
+ ((vm_page_free_target
-
vm_page_free_min
) / 2)
チューニングするかどうかの判断
システムでページングが発生していない場合は,常駐セットのサイズを制限する必要はありません。
常駐セットのサイズを制限する場合,特定プロセスの場合とシステム・ワイドの場合のどちらでも,vm
サブシステム属性
anon_rss_enforce
を併用して,常駐セットのサイズのソフト限界値とハード限界値のどちらかを設定しなければなりません。
ハード限界値を有効にすると,タスクの常駐セットはこの限界値を超えることはできません。 タスクがハード限界値に達すると,タスクの可変メモリのページがスワップ領域に移動され,常駐セットのサイズが限界値以下に抑えられます。
ソフト限界値を有効にすると,可変メモリのページングが,次の条件で開始されます。
タスクの常駐セットがシステム・ワイドまたはプロセスごとの限界値を超えた場合
空きページ・リストのページの数が
vm_rss_block_target
属性の値より少ない場合
anon_rss_enforce
属性を変更したときには,システムのリブートが必要です。
vm_page_free_optimal
,vm_rss_maxpercent
,vm_rss_block_target
,vm_rss_wakeup_target
属性は,システムをリブートすることなく変更できます。
12.5.5 変更ページの事前書き出しを管理する
vm
サブシステムは,変更された (ダーティ) ページをディスクに事前書き出しすることによって,メモリ不足を防止しようとします。
事前書き出しされたページを再生する場合,仮想メモリ・サブシステムはページが有効であることを確認するだけですみ,性能が向上します。
仮想メモリ・サブシステムは,空きリスト上のページがもうすぐなくなると予測した場合,最も古い非アクティブ・ページおよび UBC LRU ページをディスクに事前書き出しします。
事前書き出しに関連する属性は,チューニングできます。
事前書き出しについての詳細は,12.1.4.1 項
を参照してください。
関連する属性
変更ページの事前書き出しに関連する
vm
サブシステムの属性を,以下のリストに示します。
vm_ubcdirtypercent
--
UBC がディスクへの書き込みを開始する時点のダーティ (変更) ページの割合を指定します。
vm_page_prewrite_target
--
メモリ不足の心配があるときに,vm
サブシステムがディスクに事前書き出しする変更 UBC (LRU) ページの最大数を指定します。
vm_page_free_target
* 2
vm_page_free_target
--
空きページ・リストのページの数がこの値まで増えると,ページングが停止します。
システム上で使用できる管理対象メモリの容量に従って決まる省略時の値を,次の表に示します。
使用可能なメモリ (MB) | vm_page_free_target (ページ) |
512 未満 | 128 |
512 〜 1023 | 256 |
1024 〜 2047 | 512 |
2048 〜 4095 | 768 |
4096 以上 | 1024 |
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
--
スワップ・デバイスに渡されるページ・アウト (書き込み) クラスタの最大サイズをバイト数で指定します。
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
--
スワップ・パーティションで同時に処理待ちにできる非同期入出力要求の数を指定します。
非同期スワップ要求は,ページ・アウト動作と,変更ページの事前書き出しに使用されます。
チューニングするかどうかの判断
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)
上記の例は,次の情報を示しています。
1 番目の数 (402
) は,512 ページ・チャンク (4 MB) の数を示します。
2 番目の数 (4
) は,64 ページ・チャンクの数を示します。
3 番目の数 (0
) は,8 ページ・チャンクの数を示します。
4 番目の数 (2
) は,1 ページ・チャンクの数を示します。
メモリを節約するには,共用メモリを使用するアプリケーションが動作している間に空いている 512 ページ・チャンクが 1 〜 2 個だけになるまで,gh_chunks
属性の値を小さくします。
次の
vm
サブシステム属性も,粒度ヒントに影響します。
gh_min_seg_size
--
共用メモリ・セグメントのサイズを指定します。
このサイズを超えるメモリは
gh_chunks
属性で予約されたメモリから割り当てられます。
省略時の値は 8 MB です。
gh_fail_if_no_mem
--
1 (省略時の値) が設定されている場合,shmget
関数は,要求したセグメント・サイズが
gh_min_seg_size
属性で指定された値よりも大きく,gh_chunks
領域内に要求を満たすだけのメモリがないときには,失敗を示す結果を返却します。
gh_fail_if_no_mem
属性の値が 0 の場合は,gh_chunks
属性で予約されているメモリの量よりも要求が大きいときには,ページング可能メモリ領域のメモリを切り出して要求全体が満たされます。
gh_keep_sorted
--
粒度ヒント用に予約するメモリをソートするかどうかを指定します。
省略時は,予約されたメモリはソートされません。
gh_front_alloc
--
粒度ヒント用に予約したメモリを,下位の物理メモリ・アドレスから割り当てる (省略時の設定) かどうかを指定します。
この機能は,メモリ・ボードの数が奇数の場合に便利です。
さらに,アタッチ要求のサイズおよびアドレスが境界に合っていないことを示すメッセージが,システム・コンソールに表示されます。 境界が合っていないアタッチのメッセージは,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_mappers
,unaligned_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_chunks
,rad_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_anon
,vm_bigpg_seg
,vm_bigpg_shm
,vm_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_anon
,vm_bigpg_seg
,vm_bigpg_shm
,vm_bigpg_ssm
,または
vm_bigpg_stack
の値を 0 にすると,それぞれの属性に対応するメモリ・オブジェクトの種類に対するビッグ・ページ・メモリ割り当てが無効になります。
たとえば,vm_bigpg_anon
を 0 にすると,可変メモリの割り当てを要求するプロセスに対するビッグ・ページ・メモリの割り当てが無効になります。
特定の種類のメモリに対するビッグ・ページ・メモリ割り当てを無効にしても,はっきりした効果は期待できません。
システムがブートされた後の
vm_bigpg_anon
,vm_bigpg_seg
,vm_bigpg_shm
,vm_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_max
と
vm_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)