ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris カーネルのチューンアップ・リファレンスマニュアル Oracle Solaris 10 8/11 Information Library (日本語) |
1. Oracle Solaris システムのチューニングの概要
2. Oracle Solaris カーネルチューニング可能パラメータ
4. インターネットプロトコル群のチューニング可能パラメータ
入出力バッファーのキャッシングに使用するメモリーの最大量を指定します。バッファーは、ファイルシステムのメタデータ (スーパーブロック、i ノード、間接ブロック、ディレクトリ) の書き込みに使用されます。割り当てられるメモリー量 (K バイト単位) が bufhwm を超えるまで、必要に応じてバッファーが割り当てられます。超過した時点で、要求を満たせるだけのバッファーが回復されるまで、バッファーキャッシュからメタデータが破棄されます。
歴史的経緯により、bufhwm には ufs: 接頭辞は不要です。
符号付き整数
物理メモリーの 2 %。
80K バイトから物理メモリーの 20% または 2T バイトのどちらか小さい方。つまり、bufhwm_pct は 1 から 20 にできます。
bufhwm: K バイト
bufhwm_pct: 物理メモリーの %。
いいえ。bufhwm および bufhwm_pct はシステムの初期設定時に限って評価され、ハッシュ容量が算出されます。これらのパラメータから算出された限度 (バイト数) は、データ構造体に格納され、バッファーの割り当てや解放に応じて、この値が調整されます。
動作しているシステムのロック手順に従わずにこの値を調整すると、正しくない動作を招くおそれがあります。
稼働中に bufhwm または bufhwm_pct を変更しても無効です。
bufhwm が下限の 80 K バイトに満たない場合、または上限 (物理メモリーの 20%、2T バイト、またはカーネルヒープの最大量の 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."
bufhwm と bufhwm_pct がどちらもゼロ以外の値に設定されている場合は、bufhwm が優先されます。
バッファーは必要になったときにのみ割り当てられるので、デフォルト値に対する負担増は、バッファーハッシュヘッダー用に必要となる制御構造体の割り当てです。これらの構造体は、32 ビットカーネルでは想定されるバッファー当たり 52 バイト、64 ビットカーネルでは想定されるバッファー当たり 96 バイトを消費します。
512M バイトの 64 ビットカーネルでは、ハッシュチェーン数は 10316 / 32 == 322 であり、次の 2 の累乗の 512 まで拡大されます。したがって、ハッシュヘッダーは 512 x 96 バイト、すなわち 48K バイトを消費します。ハッシュヘッダー割り当てでは、バッファーが 32K バイトであることが前提です。
バッファープール内でまだ割り当てられていないメモリー量を知るには、カーネルデバッガを使用して、カーネルの 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 biostats で biostats の kstat を調べると、このシステムでは、buffer_cache_hits と buffer_cache_lookups の割合も適切であることが分かったとします。これらの情報は、このシステムのデフォルト設定であることを示します。
変更の可能性あり
割り当て対象となる UFS ファイルシステム用の割り当て構造体の数を指定します。このパラメータは、1 つまたは複数の UFS ファイルで割り当てが有効になっているときだけ適用されます。歴史的経緯により、ufs: 接頭辞は不要です。
符号付き整数
((maxusers × 40) / 4) + max_nprocs
0 から MAXINT
割り当て構造体
いいえ
ありません。値が大きすぎると、システムがハングします。
デフォルトの割り当て構造体数では十分でない場合。このような状況は、コンソールやメッセージログに出力される次のメッセージから判別できます。
dquot table full
変更の可能性あり
メモリー内で維持すべき 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 フィールドが kstat の maxsize フィールドより大きい場合は、ufs_ninode の値が小さすぎる可能性があります。i ノードのアイドリングが多すぎる場合も、問題になることがあります。
i ノードのアイドリングが多すぎるかどうかは、kstat -n inode_cache を使用して、inode_cache kstat を調べることで判断できます。thread idles はバックグラウンドスレッドがアイドリングした i ノード数を、vget idles は i ノードを使用する前の要求プロセスによるアイドル数をそれぞれ表しています。
変更の可能性あり
ufs_WRITES がゼロ以外の場合、1 つのファイルに対する書き込み未処理のバイト数が調べられます。ufs_HW を参照し、書き込みを行うべきか、未処理のバイト数が ufs_LW になるまで書き込みを延期すべきかが判定されます。未処理のバイト数のトータルはファイルごとに管理されるため、あるファイルの未処理のバイト数が限度を超えても、それが他のファイルに影響を与えることはありません。
符号付き整数
1 (有効)
0 (無効)、1 (有効)
切り替え (オン/オフ)
はい
なし
UFS の書き込みスロットル (抑制) を全体的にオフにしたい場合。十分な入出力能力がない場合は、このパラメータを無効にすると、ディスクに対するサービスキューが長くなるおそれがあります。
変更の可能性あり
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_LW と ufs_HW は、ufs_WRITES がゼロでないときだけ意味があります。たとえば ufs_LW と ufs_HW が近すぎると複数のスレッドが立ち上がってもいずれも書き込みを実行できないことがあったり、あるいは ufs_LW と ufs_HW が離れすぎていると複数のスレッドが必要以上に待たされることがあるなどの不要な問題を避けるために、ufs_HW と ufs_LW はともに変更するようにしてください。
ファイルシステムがストライプ化ボリュームから構成されている場合は、これらの値の変更を検討します。使用可能な合計帯域幅が ufs_HW の現在の値を簡単に超える可能性があります。残念ながら、このパラメータはファイルシステムごとに設定されるものではありません。
ufs_throttles が通常ではない値のときにも、このパラメータの変更を検討するかもしれません。現在、ufs_throttles にアクセスできるのは、カーネルデバッガを使用した場合だけです。
変更の可能性あり
freebehind アルゴリズムを有効にします。このアルゴリズムが有効な場合、システムはメモリー使用率が高いときに順次入出力を検出すると、新しく読み取ったブロックに関してファイルシステムキャッシュを迂回します。
ブール型
1 (有効)
0 (無効)、1 (有効)
はい
なし
freebehind アルゴリズムが頻繁に発生する場合。重要な順次システムファイル動作が予想されない場合、 freebehind を無効にすると、大きさに関係なくすべてのファイルがファイルシステムのページキャッシュで維持される候補になります。さらに細かいチューニングについては、smallfile を参照してください。
変更の可能性あり
ファイルの大きさが超えると freebehind アルゴリズムでキャッシュに保持しない候補になる、しきい値を決定します。
大容量メモリーシステムには、深刻なメモリー要求を行わずに、10M バイトのファイルを何千もキャッシュするのに十分なメモリーがあります。しかし、この状況はあくまでもアプリケーションに強く依存します。
smallfile パラメータと freebehind パラメータの目的は、キャッシュによるメモリー不足を頻繁に引き起こすことなく、キャッシュ情報を再利用することです。
符号付き整数
0
0 から 2,147,483,647
はい
なし
アプリケーションが中程度の大きさのファイルを順次読み取り、バッファリングによる大きな利益が予想され、なおかつシステムが特にメモリー不足に陥っていない場合、smallfile を増やします。中程度の大きさのファイルとは、32K バイトから 2G バイトのファイルです。
変更の可能性あり