ディレクトリ名検索キャッシュ(DNLC)とUFSメモリiノードの設定について
参考文献では、ufs_ninodeの最大値はMAXINT(2ギガバイト)となっています。カーネルチューニングパラメタ ncsizeも同様です。一般のチューニングはncsizeに値を設定すると、ufs_ninodeに反映されます。ここで、大きな値をncsizeに指定すると、次のNOTICEがコンソールに表示されます。
ufs: [ID 802296 kern.notice] NOTICE: setting ufs_ninode to max value of 513978
メッセージ末尾の値、513978はufs_inode_maxと呼ばれるカーネル変数です。
これは、UFSドライバの初期化時、次のようなロジックで利用可能メモリサイズを検査しているために表示されるものです。
UFSドライバのiノード処理ルーチン(ufs_inode.c) |
ufsinit関数 |
条件1:ufs_ninodeが0、または0以下の場合 ufs_ninodeにncsizeをセット 条件2:ufs_inode_maxが0の場合 ufs_inode_max=inodeの最大数=kmem_maxavailの1/4をinode構造体のサイズで割る 条件3:ufs_ninodeがufs_inode_maxを上回る、またはufs_ninodeとncsizeが共に0の場合 ufs: [ID 802296 kern.notice] NOTICE: setting ufs_ninode to max value of 513978 を表示(513978はその時のufs_inode_max) ufs_ninodeにufs_inode_maxをセット |
図1.UFSドライバのiノード設定
ufsinit関数からコールされるkmem_maxavail関数はその時点の利用可能ページを返してくれます。
カーネルメモリマネージャ(kmem.c) |
kmem_maxavail関数:呼び出された時点の利用可能ページ数を返す関数 |
条件1:availrmemがtune.t_minarmemより大きいか? YES:max_phys(物理メモリの最大値)に、availrmemからtune.t_minarmemを引いた値をセット NO:max_physにゼロをセット max_virtに仮想メモリの最大値をセット pages_availにmax_physかmax_virtのいずれか小さい方をセット pages_availをページ値に変換した値でリターン |
図2.利用可能ページ数の獲得
iノード構造体1個のサイズは336バイトです。
ncsizeは、それに指定した値がセットされます。ufs_ninodeは、UFSドライバ初期化時の利用可能メモリの1/4に制限されます。
ufs_ninodeを大きな値にセットしたい場合は次のset命令で可能です。過大な値を設定するとメモリ不足になることがありますのでご注意下さい。
set ncsize=655360 set ufs_inode_max=655360 set ufs_ninode=655360 |
図3.iノードとDNLC数の拡張
【参考】tune.t_minarmemの構造体は次のようになっています。
|
図4.tuneable.h:カーネル調整可能構造体
Copyright (C) 2004 by The Art of Computer Technologies, Corp. All rights reserved.