Oracle Solaris カーネルのチューンアップ・リファレンスマニュアル

bufhwm および bufhwm_pct

備考欄

入出力バッファーのキャッシングに使用するメモリーの最大量を指定します。バッファーは、ファイルシステムのメタデータ (スーパーブロック、i ノード、間接ブロック、ディレクトリ) の書き込みに使用されます。割り当てメモリー量 (K バイト単位) が bufhwm を超えるまで、必要に応じてバッファーが割り当てられます。超過した時点で、要求を満たせるだけのバッファーが回復されるまで、バッファーキャッシュからメタデータが破棄されます。

歴史的経緯により、bufhwm には ufs: 接頭辞は不要です。

データ型

符号付き整数

デフォルト

物理メモリーの 2 %。

範囲

80K バイトから物理メモリーの 20% または 2TB のどちらか小さい方。つまり、bufhwm_pct は 1 から 20 にできます。

単位

bufhwm: K バイト

bufhwm_pct: 物理メモリーの %。

動的か

いいえ。bufhwm および bufhwm_pct はシステムの初期設定時に限って評価され、ハッシュ容量が算出されます。これらのパラメータから算出された限度 (バイト数) は、データ構造体に格納され、バッファーの割り当てや解放に応じて、この値が調整されます。

稼働中に bufhwm または bufhwm_pct を変更しても無効です。

検査

bufhwm が下限の 80 K バイトに満たない場合、または上限 (物理メモリーの 20%、2TB、またはカーネルヒープの最大量の 1/4 のいずれか小さい方) を超える場合は、上限にリセットされます。無効な値を試みると、システムコンソールと /var/adm/messages ファイルに次のメッセージが出力されます。


"binit: bufhwm (value attempted) out of range 
(range start..range end). Using N as default."

「value attempted」は、/etc/system ファイルに指定された値、またはカーネルデバッガを使用することによって指定された値です。N は使用可能なシステムメモリーに基づいてシステムが計算した値です。

同様に、bufhwm_pct が 1 から 20% という許容範囲外の値に設定された場合は、デフォルトの 2% にリセットされます。その場合は、次のメッセージがシステムコンソールと /var/adm/messages ファイルに出力されます。


"binit: bufhwm_pct(value attempted) out of range(0..20).
       Using 2 as default."

bufhwmbufhwm_pct がどちらもゼロ以外の値に設定されている場合は、bufhwm が優先されます。

どのような場合に変更するか

バッファーは必要になったときにのみ割り当てられるので、デフォルト値に対する負担増は、バッファーハッシュヘッダー用に必要となる制御構造体の割り当てです。これらの構造体は、32 ビットカーネルでは想定されるバッファー当たり 52 バイト、64 ビットカーネルでは想定されるバッファー当たり 96 バイトを消費します。

512 M バイトの 64 ビットカーネルでは、ハッシュチェーン数は 10316 / 32 == 322 であり、次の 2 の累乗の 512 に拡大されます。したがって、ハッシュヘッダーは 512 x 96 バイト、すなわち 48 K バイトを消費します。ハッシュヘッダー割り当てでは、バッファーが 32 K バイトであることが前提です。

バッファープール内でまだ割り当てられていないメモリー量を知るには、カーネルデバッガを使用して、カーネルの bfreelist 構造体を調べます。この構造体で調べるフィールドは b_bufsize であり、これが残っているはずのメモリー (バイト数) です。mdb コマンドを使用し、buf マクロで調べる例を示します。


# mdb -k
Loading modules: [ unix krtld genunix ip nfs ipc ]
> bfreelist::print "struct buf" b_bufsize
b_bufsize = 0x225800

6G バイトのメモリーを装備したこのシステムでは、bufhwm のデフォルト値は 122277 です。実際に要求されるバッファーサイズは通常、1K バイトより大きいので、ヘッダー構造体の数を突き止めることはできません。しかし、一部の領域は、このシステムに割り当てられた制御構造体からうまく回収されることがあります。

512M バイトシステム上でこの構造体が、10144K バイトのうち 4K バイトだけがまだ割り当てられていないことを示したとします。また、kstat -n biostatsbiostats の kstat を調べると、このシステムでは、buffer_cache_hitsbuffer_cache_lookups の割合も適切であることが分かったとします。これらの情報は、このシステムのデフォルト設定であることを示します。

コミットレベル

変更の可能性あり

変更履歴

bufhwm (Solaris 9 リリース)」を参照してください。