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

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 ノードを使用する前の要求プロセスによるアイドル数をそれぞれ表しています。

コミットレベル

変更の可能性あり