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

ufs_ninode

説明

メモリーに保持する i ノードの数。i ノードは、ファイルシステム単位ではなく、全体としてキャッシュされます (UFS の場合)。

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

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

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

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

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

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

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

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

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

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

データ型

符号付き整数

デフォルト

ncsize

範囲

0 から MAXINT

単位

i ノード

動的か

はい

検査

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

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

デフォルトの i ノード数では足りない場合。kstat -n inode_cache で報告される maxsize reached フィールドが kstatmaxsize フィールドより大きい場合は、ufs_ninode の値が小さすぎる可能性があります。ただし、先に述べた i ノードの遊休化が過度に発生するのも問題です。

このような状況を知るには、kstat -n inode_cache を使用して inode_cache kstat を調べます。thread idles はバックグラウンドスレッドが遊休化した i ノード数を、vget idles は i ノードを使用する前の要求プロセスによる遊休数をそれぞれ表しています。

コミットレベル

変更の可能性あり