この節では、NFS スレッド数の設定方法について説明します。さらに、/etc/system ファイルに含まれている、 NFS 性能に関連する主要パラメタの調整について説明します。/etc/system ファイルのパラメタを調整するときは、サーバーの物理メモリーの大きさやカーネルのアーキテクチャーに注意してください。
調整に問題があると、システムが不安定になり、最悪の場合には、起動ができなくなるなどの問題が発生することがあります。
性能の向上のために、NFS サーバーを設定する際には、必ず NFS スレッドを設定します。スレッド 1 つは、NFS 要求を 1 つ処理することができます。スレッドプールを大きくすることにより、サーバーは複数の NFS 要求を並行して処理することができます。Solaris 2.4 から Solaris 8 ソフトウェア環境では、デフォルトの設定は 16 であり、望ましい NFS 応答時間は得られません。プロセッサ数とネットワーク数に従って、このデフォルト値を大きくしてください。NFS サーバーのスレッド数は、/etc/init.d/nfs.server 内の nfsd 呼び出し行を編集することによって変更します。
/usr/lib/nfs/nfsd -a 64
上記のコード例 では、要求時 NFS スレッドの最大割当数を 64 に指定しています。
NFS スレッド数を変更する方法は 3 つあります。本書の構成上の規則に従っているかぎり、どの方法を使用してもほぼ同じ数になります。NFS スレッドの数が余分にある場合も、問題が生じることはありません。
NFS スレッドの数を設定するには、以下の 3 つの方法のうちで最大の値を使用してください。
アクティブなクライアントプロセス 1 つに対して NFS スレッド数を 2 個にする
通常、クライアントワークステーションがもつアクティブプロセスは 1 個だけです。ただし、NFS クライアントが時分割システムの場合は、多数のアクティブプロセスをもつことがあります。
CPU 1 個に対して NFS スレッド数を 16 〜 32 個にする
SPARCclassic や SPARCserver 5 システムでは、NFS スレッド数を 16 個程度にします。60 MHz の SuperSPARC プロセッサを搭載したシステムでは、32 個にします。
ネットワーク容量 10 M ビットに対して NFS スレッド数を 16 個の割合にする
たとえば、SunFDDI™ インタフェースを 1 つ使用している場合は、スレッド数を 160 に設定し、2 つ使用している場合は、スレッド数を 320 に設定します。
カーネルの固定サイズテーブル数は、Solaris ソフトウェア環境の新しいリリースが出るたびに減少しています。現在では、ほとんどのテーブルは動的にサイズ変更されるか、maxusers 値とリンクしています。Solaris 2.4 から Solaris 8 のソフトウェア環境では、さらに、DNLC と i ノードキャッシュを増やすための調整が必要になります。また、Solaris 2.4 では、ページャーの調整が必要です。Solaris 2.5、2.5.1、2.6、7、8 のオペレーティング環境では、ページャーの調整は必要ありません。
オぺレーティングシステムのカーネルは、起動時に /etc/system ファイルを読み込み、ロード可能なオぺレーティングシステムのカーネルモジュールの検索パスを設定して、カーネル変数を設定できるようにします。詳細は、system(4)のマニュアルページを参照してください。
/etc/system ファイルにコマンドを記述する場合は、十分に注意してください。/etc/system ファイル内のコマンドによって、カーネルの設定が自動的に変更されます。
使用しているマシンが起動せず、/etc/system に問題があると思われる場合は、 boot -a オプションを使用してください。このオプションを指定すると、システムはデフォルトの設定で起動し、起動パラメタの指定を求めます。これには、構成ファイルの /etc/system も含まれます。構成ファイル /etc/system の指定を求めるプロンプトに対しては、元の /etc/system ファイルのバックアップ用コピーの名前を入力するか、/dev/null と入力してください。ファイルを修正し、ただちにシステムを再起動して、正しく動作するかどうかを確認します。
プロセステーブルなどの各種テーブルのサイズは、maxusers パラメタ値によって決定します。maxusers パラメタは、以下の形式で /etc/system ファイルに設定します。
set maxusers = 200
Solaris 2.4 から Solaris 8 のソフトウェア環境では、maxusers は、システムに搭載されているメモリー容量に基づいて動的に設定されます。設定は以下の式で表されます。
maxusers = システム内の構成されている RAM (MB)
メモリー容量 (MB) は、実際には、起動時にカーネルが使用する 2 MB 程度を除いた値であり、physmem で表されます。最小値は 8、自動設定される最大値は 1024 であり、この最大値は 1 GB 以上のメモリーを搭載したシステムに有効です。ユーザー自身が /etc/system に maxusers を設定することもできますが、設定された値はチェックされ、最大でも 2048 に制限されます。2048 に設定した場合、どのカーネルアーキテクチャでも安全なレベルで使用できますが、大量のオぺレーティングシステムのカーネルメモリーを使用することになります。
性能に関係するオぺレーティングシステムカーネルパラメタである、i ノードキャッシュとネームキャッシュのデフォルト値を以下に示します。
表 3-5 i ノードキャッシュとネームキャッシュのデフォルト値
カーネル資源 |
変数 |
デフォルト値 |
---|---|---|
i ノードキャッシュ | ufs_ninode |
17 * maxusers + 90 |
ネームキャッシュ | ncsize |
17 * maxusers + 90 |
/etc/system ファイルに設定する bufhwm 変数は、バッファーキャッシュに割り当てる最大メモリー容量を決定し、KB 単位で指定します。bufhwm のデフォルト値は 0 であり、この設定で、システムはシステムメモリーの 2 % まで使用することができます。バッファーキャッシュに使用可能な大きさは、最大でシステムメモリーの 20 % です。NFS 専用のファイルサーバーで、メモリーが比較的小容量の場合は、10 % 程度にする必要が生じることがあります。大きなシステムの場合、オぺレーティングシステムのカーネルの仮想アドレス空間が不足しないように、さらに制限する必要があります。
バッファーキャッシュは、i ノードや間接ブロック、シリンダグループ関係のディスク入出力をキャッシュする目的にのみ使用されます。以下の例では、バッファーキャッシュ (bufhwm) を最大で 10 MB まで確保できるように bufhwm を設定しています。通常、これ以上の値は設定しないでください。
set bufhwm=10240
バッファーキャッシュの読み取りヒット率 (%rcache) と書き込みヒット率 (%wcache) を表示する sar -b コマンドを実行して (以下のコード例を参照)、バッファーキャッシュを監視することができます。
# sar -b 5 10 SunOS hostname 5.2 Generic sun4c 08/06/93 23:43:39 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s Average 0 25 100 3 22 88 0 0
1 秒間に 50 以上の著しい回数の読み取りと書き込みが行われる場合、読み取りヒット率 (%rcache) が 90% 以下の場合、あるいは書き込みヒット率 (%wcache) が 65% 以下の場合は、バッファーキャッシュ bufhwn の値を大きくします。
上記の sar -b 5 10 コマンドの出力例では、読み取りヒット率が 90 % 以上、書き込みヒット率が 65 % 以上になっています。
sar コマンドの引数の意味は、以下のとおりです。
表 3-6 sar コマンドの引数引数 | 説明 |
---|---|
b |
バッファーの使用状況を検査します。 |
5 |
5 秒おきに検査します (最低でも 5 秒にします)。 |
10 |
統計情報を収集する回数です。 |
システムは、バッファーキャッシュのサイズが許容範囲を超えることを防ぎます。バッファーキャッシュサイズを大きくすると、以下の問題が発生します。
サーバーが停止します。
オペレーティングシステムのカーネル仮想メモリーの不足によって、デバイスドライバに障害が発生します。
ディレクトリ名ルックアップキャッシュ (DNLC) は、maxusers に基づいてデフォルト値が設定されます。NFS サーバーに多数のクライアントを接続している場合は、キャッシュサイズ (ncsize) を大きくしてください。大幅に性能が改善されます。
DNLC のヒット率 (cache hits) を調べるには、vmstat -s と入力します。
% vmstat -s ...[略]... 79062 total name lookups (cache hits 94%) 16 toolong
30 文字より短いディレクトリ名はキャッシュされ、長すぎてキャッシュ不可能なディレクトリ名は報告だけされます。キャッシュされなかった場合は、ファイルを得るためにパス名の要素を検索していく際に、ディレクトリ名を読むというディスクの入出力が必要になります。ヒット率が 90 % よりはるかに低い場合は、注意が必要です。
NFS の性能が、キャッシュのヒット率によって大きな影響を受ける場合があります。getattr と setattr、lookup は、通常、全 NFS コールの 50 %より大きな値になります。要求された情報がキャッシュにない場合は、ディスクアクセスを行うので、read あるいは write 要求にともなう性能の低下が生じます。DNLC キャッシュの大きさを制限する要素は、使用可能なカーネルメモリーの容量です。
特に長い名前を多用していないにもかかわらず、ヒット率(cache hits)が 90 % より低い場合は、ncsize 変数を調整します。ncsize 変数は、DNLC キャッシュの大きさを、キャッシュすることが可能な名前変換、および v ノード変換の数で表します。DNLC エントリ 1 個に使用されるカーネルメモリーは、約 50 バイトです。
/etc/system ファイルを開き、ncsize を設定します。maxusers 値に基づき、デフォルトより大きな値を設定します。
デフォルトでは、NFS 専用のサーバーには多くの RAM は必要ないため、maxusers 値および DNLC 値が小さくなっています。したがって、サイズを 2 倍にしてください。
set ncsize=5000
ncsize のデフォルト値は以下の式で表されます。
ncsize (ネームキャッシュ) = 17 * maxusers + 90
NFS サーバーのベンチマークを 16000 に設定します。
maxusers を 34906 に設定します。
システムを再起動します。
以下を参照してください。
メモリー常駐の i ノードは、ファイルシステム内の実体の操作が行われるたびに使用されます。ディスクから読み取られた i ノードは、再び必要になるときのために、キャッシュされます。ufs_ninode は、アイドル状態のノードのリストを UNIX ファイルシステムが保持しようとするサイズです。ufs_ninode を 1 に設定することによって、10,000 のアイドルノードが保持されます。アイドルノードの数が ufs_ninode を超えると、アイドルノードを削除することによってメモリーの空き領域が確保されます。
DNLC キャッシュのエントリは、それぞれ i ノードキャッシュのエントリに対応しています。そのため、i ノードキャッシュのサイズを変更する場合は、DNLC キャッシュのサイズも変更してください。また、i ノードキャッシュの大きさは、最低でも DNLC キャッシュと同じ大きさにする必要があります。最高の性能を得るには、Solaris 2.4 から Solaris 8 のソフトウェア環境では DNLC キャッシュと同じ大きさにすることをお勧めします。
動作中のシステムで adb を使用して ufs_ninode を操作し、ただちにその結果を確認することができます。ufs_ninode の最大値は、i ノードが使用するカーネルメモリーの容量によって制限されます。この上限は maxusers = 2048 に対応しており、ncsize では 34906 になります。
カーネルメモリに割り当てられている容量は、sar -k を実行して調べます。
Solaris 2.4 オペレーティング環境では、i ノード 1 個は、lg_mem pool から 300 バイトのカーネルメモリーを使用します。
Solaris 2.5.1、2.6、7、8 オペレーティング環境では、i ノード 1 個は、lg_mem pool から 320 バイトのカーネルメモリーを使用します。
Solaris 2.5.1、2.6、7、8 オペレーティング環境では、ufs_ninode は、最低でも ncsize と同じ値になるように自動的に調整されます。ヒット率を高めるために ncsize を調整し、システムがデフォルトの ufs_ninodes 値を使用できるようにしてください。
i ノードキャッシュのヒット率が 90 %より低いか、DNLC からローカルディスクのファイル入出力負荷の調整要求が出された場合は、以下の操作を行います。
i ノードキャッシュの大きさを大きくします。
/etc/system ファイルの ufs_ninode を DNLC (ncsize) と同じ値に設定します。
たとえば Solaris 2.4 ソフトウェア環境では、以下のように設定します。
set ufs_ninode=5000
i ノードキャッシュのデフォルト値は、ncsize と同じです。
ufs_ninode (デフォルト値) = 17 * maxusers + 90
ncsize より小さな値を ufs_ninode に設定しないでください。ufs_ninode は、アクティブと非アクティブの i ノードの合計ではなく、非アクティブの i ノード数だけを制限します。
システムを再起動します。
SunFDDI、SunFastEthernet、SunATM などの高速なネットワークでは、NFS クライアント側の先読み量を増やすことで、NFS の読み取りスループットが向上します。
以下の場合は、先読み値を増やさないでください。
クライアントのメモリーが不足している
トラフィックの多いネットワークである
ファイルアクセスが突発的である
使用可能なメモリーの量が十分に確保できない場合は、先読みは行われません。
デフォルトでは、先読みは 1 ブロック (バージョン 2 では 8 KB、バージョン 3 では 32 KB) に設定されています。先読みを 2 ブロックに設定すると、ファイルから最初の 8 KB を読み取っている間に、次の 16 K バイトがフェッチされます。先読みでは、8 KB 単位で情報をフェッチすることによって、前もって新しい情報を確保しておくことができます。
先読み量を増やすことによって、ある点までは読み取りスループットを向上させることができます。先読み量の最大値は、構成やアプリケーションによって異なります。先読み量が最大値を超えると、スループットが低下する場合があります。通常、先読み値を 8 (8 ブロック) より大きくしても、スループットは改善されません。
以下の手順では、nfs_nra と nfs3_nra 値は別々に調整することができます。Solaris 2.5、2.5.1、2.6、7、8 のいずれかがクライアントで動作している場合は、nfs_nra の調整が必要になることがあります (NFS バージョン 2)。クライアントからサーバーに、バージョン 3 をサポートしていない旨の通知がある場合は、この調整を行ってください。