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

UFS パラメータ

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 リリース)」を参照してください。

ndquot

備考欄

割り当て対象となる UFS ファイルシステム用の割り当て構造体の数を指定します。このパラメータは、1 つまたは複数の UFS ファイルで割り当てが有効になっているときだけ適用されます。歴史的経緯により、ufs: 接頭辞は不要です。

データ型

符号付き整数

デフォルト

((maxusers × 40) / 4) + max_nprocs

範囲

0 から MAXINT

単位

割り当て構造体

動的か

いいえ

検査

ありません。値が大きすぎると、システムがハングします。

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

デフォルトの割り当て構造体数では十分でない場合。このような状況は、コンソールやメッセージログに出力される次のメッセージから判別できます。


dquot table full
コミットレベル

変更の可能性あり

ufs_ninode

備考欄

メモリー内で維持すべき i ノードの数を指定します。i ノードはファイルシステム単位ではなく、UFS 全体でキャッシュされます 。

この場合のキーとなるパラメータは ufs_ninode です。このパラメータを使用して、i ノードキャッシュの処理に関係する 2 つのキーとなる境界値が計算されます。高位境界値は ufs_ninode / 2、下位境界値は ufs_ninode / 4 で計算されます。

システムが i ノードの処理を終わると、次のどちらかが起こる可能性があります。

  • i ノードによって参照されるファイルがもはやシステムにないため、その i ノードが削除される。i ノードが削除されると、その空間は i ノードキャッシュに戻され、別の i ノード (ディスクから読み込まれるか、新規ファイル用に作成されるもの) 用に使用されます。

  • ファイルは存在するが、実行プロセスに参照されていない。i ノードはアイドルキューに入れられます。参照されていたページはメモリーに残ります。

i ノードをアイドリングする場合、カーネルはこのアイドリング処理を一定の時期まで先送りします。ファイルシステムがロギングファイルシステムの場合も、カーネルは i ノードの削除を先送りします。2 つのカーネルスレッドがこの先送り処理を引き受けます。それぞれのスレッドが一方のキューを処理します。

先送りされていた処理が終わると、システムはその i ノードを削除キューかアイドルキューに入れます。それぞれのキューには、そのキューを処理できるスレッドがあります。i ノードがキューに入れられると、キューの占有率が下位境界値と比較され、占有率が下位境界値を超えていると、そのキューに関連するスレッドが起こされます。キューが起こされるると、スレッドがキューを調べ、i ノードに結びつけられたページがあればディスクに書き出し、i ノードを解放します。スレッドは、起こされた時にキューにあった i ノードの 50% を削除すると停止します。

アイドルスレッドの処理が負荷に追いつかない場合は、2 つめの機構が使用されます。システムは、vnode を見つける必要があると、ufs_vget ルーチンを実行します。vget は「最初に」アイドルキューの長さを調べます。長さが高位境界値を超えていると、アイドルキューから 2 つの i ノード取り出し、アイドリングします (ページをフラッシュし、i ノードを解放する)。vget は、自身が使用する i ノードを取得する「前に」これを行います。

システムは、コア内にページがない i ノードをアイドルリストの先頭に置き、ページがある i ノードをアイドルリストの終わりに置くことによって最適化を図ります。しかし、リストの順序に関し、それ以外の処理は行いません。i ノードは常にアイドルキューの先頭から削除されます。

i ノード全体がキューから削除されるのは、同期 、アンマウント、または再マウントが行われるときだけです。

歴史的経緯により、このパラメータには ufs: 接頭辞は必要ありません。

データ型

符号付き整数

デフォルト

ncsize

範囲

0 から MAXINT

単位

i ノード

動的か

はい

検査

ufs_ninode が 0 以下の場合、この値は ncsize に設定されます。

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

デフォルトの i ノード数では足りない場合。kstat -n inode_cache で報告される maxsize reached フィールドが kstatmaxsize フィールドより大きい場合は、ufs_ninode の値が小さすぎる可能性があります。i ノードのアイドリングが多すぎる場合も、問題になることがあります。

i ノードのアイドリングが多すぎるかどうかは、kstat -n inode_cache を使用して、inode_cache kstat を調べることで判断できます。thread idles はバックグラウンドスレッドがアイドリングした i ノード数を、vget idles は i ノードを使用する前の要求プロセスによるアイドル数をそれぞれ表しています。

コミットレベル

変更の可能性あり

ufs_WRITES

備考欄

ufs_WRITES がゼロ以外の場合、1 つのファイルに対する書き込み未処理のバイト数が調べられます。ufs_HW を参照し、書き込みを行うべきか、未処理のバイト数が ufs_LW になるまで書き込みを延期すべきかが判定されます。未処理のバイト数のトータルはファイルごとに管理されるため、あるファイルの未処理のバイト数が限度を超えても、それが他のファイルに影響を与えることはありません。

データ型

符号付き整数

デフォルト

1 (有効)

範囲

0 (無効)、1 (有効)

単位

切り替え (オン/オフ)

動的か

はい

検査

なし

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

UFS の書き込みスロットル (抑制) を全体的にオフにしたい場合。十分な入出力能力がない場合は、このパラメータを無効にすると、ディスクに対するサービスキューが長くなるおそれがあります。

コミットレベル

変更の可能性あり

ufs_LW および ufs_HW

備考欄

ufs_HW では、単一ファイル境界値の未処理バイト数を指定します。未処理のバイト数がこの値を上回り、ufs_WRITES が設定されていると、書き込みは延期されます。書き込みの延期は、書き込みを行うスレッドを、条件変数で眠らせることで行われます。

ufs_LW は 1 つのファイルに対する未処理のバイト数の境界値です。これを下回ると、他の処理が休眠状態となっている原因の条件変数が切り替えられます。書き込みが終了し、バイト数が ufs_LW を下回ると、条件変数が切り替わり、それによってその変数で待機しているすべてのスレッドが立ち上がり、それぞれの書き込みを行おうとします。

データ型

符号付き整数

デフォルト

ufs_LW の場合は 8 x 1024 x 1024、ufs_HW の場合は 16 x 1024 x 1024

範囲

0 から MAXINT

単位

バイト

動的か

はい

検査

なし

暗黙的制約

ufs_LWufs_HW は、ufs_WRITES がゼロでないときだけ意味があります。たとえば ufs_LWufs_HW が近すぎると複数のスレッドが立ち上がってもいずれも書き込みを実行できないことがあったり、あるいは ufs_LWufs_HW が離れすぎていると複数のスレッドが必要以上に待たされることがあるなどの不要な問題を避けるために、ufs_HWufs_LW はともに変更するようにしてください。

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

ファイルシステムがストライプ化ボリュームから構成されている場合は、これらの値の変更を検討します。使用可能な合計帯域幅が ufs_HW の現在の値を簡単に超える可能性があります。残念ながら、このパラメータはファイルシステムごとに設定されるものではありません。

ufs_throttles が通常ではない値のときにも、このパラメータの変更を検討するかもしれません。現在、ufs_throttles にアクセスできるのは、カーネルデバッガを使用した場合だけです。

コミットレベル

変更の可能性あり

freebehind

備考欄

freebehind アルゴリズムを有効にします。このアルゴリズムが有効な場合、システムはメモリー使用率が高いときに順次入出力を検出すると、新しく読み取ったブロックに関してファイルシステムキャッシュを迂回します。

データ型

ブール型

デフォルト

1 (有効)

範囲

0 (無効)、1 (有効)

動的か

はい

検査

なし

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

freebehind アルゴリズムが頻繁に発生する場合。重要な順次システムファイル動作が予想されない場合、 freebehind を無効にすると、大きさに関係なくすべてのファイルがファイルシステムのページキャッシュで維持される候補になります。さらに細かいチューニングについては、smallfile を参照してください。

コミットレベル

変更の可能性あり

smallfile

備考欄

ファイルの大きさが超えると freebehind アルゴリズムでキャッシュに保持しない候補になる、しきい値を決定します。

大容量メモリーシステムには、深刻なメモリー不足を引き起こすことなく、10M バイトのファイルを千単位でキャッシュできるだけのメモリーがあります。しかし、この状況はあくまでもアプリケーションに強く依存します。

smallfile パラメータと freebehind パラメータの目的は、キャッシュによるメモリー不足を頻繁に引き起こすことなく、キャッシュ情報を再利用することです。

データ型

符号付き整数

デフォルト

32,768

範囲

0 から 2,147,483,647

動的か

はい

検査

なし

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

アプリケーションが中程度の大きさのファイルを順次読み取り、バッファリングによる大きな利益が予想され、なおかつシステムが特にメモリー不足に陥っていない場合、smallfile を増やします。中程度の大きさのファイルとは、32K バイトから 2G バイトのファイルを意味します。

コミットレベル

変更の可能性あり