NFS サーバーの調整は、ネットワーク、NFS サーバー、各クライアントの性能を検査してから行います。最初に検査するのはネットワークです。ディスクが正常に動作している場合に、NFS クライアントから見てサーバーが遅いということは、ネットワークが遅いということと同じです。ネットワークの使用状況を調べてください。
各ネットワークのパケット数と衝突/エラー発生回数を調べます。
server% netstat -i 15 input le0 output input (Total) output packets errs packets errs colls packets errs packets errs colls 10798731 533 4868520 0 1078 24818184 555 14049209 157 894937 51 0 43 0 0 238 0 139 0 0 85 0 69 0 0 218 0 131 0 2 44 0 29 0 0 168 0 94 0 0
他のインタフェースを調べるには -I を使用します。
上記の netstat コマンドで使用している引数の意味は以下のとおりです。
表 2-1 netstat -i 15 コマンドの引数引数 | 説明 |
---|---|
-i |
TCP/IP ネットワークに使われている全インタフェースの状態を表示します。 |
15 |
15 秒ごとに情報を収集します。 |
netstat -i 15 を入力した画面では、ネットワークトラフィックが使用可能なマシンによって、入力パケットと出力パケットの両方が連続的に増加していることが示されます。
出力側衝突回数 (Output Colls - le) を出力パケット数 (le) で割ることによってネットワーク衝突率を求めます。
たいていの場合、ネットワーク全体の衝突率が 10 %より高いということは、ネットワークが過負荷である場合や、ネットワークの構成に問題がある場合、あるいはハードウェアに問題がある、などを意味します。
入力エラー発生回数 (le) を入力パケット数の合計 (le) で割ることによって入力パケット誤り率を求めます。
入力誤り率が 25 %を超える場合は、ホストによってパケットが正しく送信されていない可能性があります。
ネットワークのハードウェア、またはトラフィックの混雑、ローレベルのハードウェア上の問題によっても、伝送上の問題が発生することがあります。たとえば、ブリッジやルーターによってパケットが正しく送信されないと、強制的に再送信が行われ、性能低下の原因になります。
ブリッジがパケットヘッダーの Ethernet アドレスを調べることによって、遅延が生じます。アドレスの検出中、ブリッジネットワークインタフェースによって、パケットの一部が正しく送信されないことがあります。
ネットワークハードウェアに帯域幅の制限がある場合は、以下の作業を行ってください。
パケットサイズを小さくします。
mount を使用するか、または /etc/vfstab ファイルに、読み取りバッファーサイズ (rsize) と書き込みバッファーサイズ (wrsize) を指定します。ブリッジを通るデータの方向によって値は異なりますが、これらの変数を 2048 に設定してください。データがブリッジなどの装置を介して双方向に伝送される場合は、両方の変数の値をさらに小さくしてください。
server:/home /home/server nfs rw,rsize=2048,wsize=2048 0 0
クライアントがユーザーデータグラムプロトコル (UDP) と通信していて、多数の読み取りおよび書き込み要求が正しく送信されない場合は、送信されなかったパケットの代わりにパケット全体を再送信します。
クライアントから「 ping -sRv サーバー名」と入力して、パケットの経路を表示することによって、パケットがネットワークを往復 (エコー) するために必要な時間を調べます。
ネットワークが遅いか、ネットワークに遅いルータがあるか、あるいはネットワークが非常に混み合っている場合は、往復に数ミリ秒 (ms) を要します。最初に入力した ping コマンドから返された結果は、無視してください。また、ping -sRv コマンドは、パケットロス数も表示します。
client% ping -sRv サーバー名 PING server: 56 data bytes 64 bytes from server (129.145.72.15): icmp_seq=0. time=5. ms IP options: <record route> router (129.145.72.1), server (129.145.72.15), client (129.145.70.114), (End of record) 64 bytes from server (129.145.72.15): icmp_seq=1. time=2. ms IP options: <record route> router (129.145.72.1), server (129.145.72.15), client (129.145.70.114), (End of record)
上記の ping コマンドで使用している引数の意味は以下のとおりです。
表 2-2 ping コマンドの引数引数 | 説明 |
---|---|
s |
1 秒にデータグラムを 1 個送信し、エコー応答を受信するたびに 1 行の結果を表示します。応答がない場合、結果は表示されません。 |
R |
経路を記録します。インターネットプロトコル (IP) 記録オプションが設定され、IP ヘッダー内のパケットの経路が保存されます。 |
v |
詳細情報オプションです。受信したエコー応答以外のすべての ICMP パケットを一覧表示します。 |
ハードウェアに問題があると思われる場合は、ping -sRv を使って、ネットワークに接続されている複数台のホストの応答時間を調べてください。予測していた応答時間が得られない場合は、そのホストに問題がある可能性があります。
ping コマンドは ICMP プロトコルのエコー要求データグラムを使って、指定ホストまたはネットワークゲートウェイから ICMP エコー要求を引き出します。時分割方式の NFS サーバーでは、ICMP エコーを取得するのにかなり時間がかかることがあります。サーバーから ICMP エコーを取得するのに要する時間は、クライアントから NFS サーバーまでの距離によっても変化します。
ping -sRv コマンドに対する応答が得られた場合と、得られなかった場合の処理の流れを以下に示します。
以下では、大規模な構成の SPARCserver 690 システムを例にとって説明しています。
server% share - /export/home rw=netgroup "" - /var/mail rw=netgroup "" - /cdrom/solaris_2_3_ab ro ""
マウントされているファイルシステムと、そのファイルシステムが実際にマウントされているディスクドライブを表示します。
server% df -k Filesystem kbytes used avail capacity Mounted on /dev/dsk/c1t0d0s0 73097 36739 29058 56% / /dev/dsk/c1t0d0s3 214638 159948 33230 83% /usr /proc 0 0 0 0% /proc fd 0 0 0 0% /dev/fd swap 501684 32 501652 0% /tmp /dev/dsk/c1t0d0s4 582128 302556 267930 53% /var/mail /vol/dev/dsk/c0t6/solaris_2_3_ab /dev/md/dsk/d100 7299223 687386 279377 96% /export/home 113512 113514 0 100% /cdrom/solaris_2_3_ab
この例では、/var/mail と /export/home ファイルシステムを使用しています。
df -k コマンドを使用してファイルサーバーが存在するディスク番号を調べます。
ファイルシステムの使用率が 100 % になると、通常、クライアント側で NFS 書き込みエラーが発生します。
上記の例の /var/mail は /dev/dsk/clt0d0s4 に、/export/home は Solstice DiskSuite メタディスクの /dev/md/dsk/d100 に存在しています。
df -k コマンドを使用して Solstice DiskSuite メタディスクが返された場合は、ディスク番号を確認します。
server% /usr/opt/SUNWmd/sbin/metastat ディスク番号
上記の例の /usr/opt/SUNWmd/sbin/metastate d100 によって、物理ディスク /dev/md/dsk/d100 が使用しているディスクを確認することができます。
d100 ディスクはミラー化されています。各ミラーは、3 つのストライプディスクと、4 つのストライプディスクを連結したものから構成されます。それぞれのセット内のディスクは同じ大きさですが、セット間では大きさが異なります。ミラーの他に、ホットスペアディスクもあります。このシステムでは、IPI ディスク (idX) を使用しており、 SCSI ディスク (sdX) は同じディスクとして扱われます。
server% /usr/opt/SUNWmd/sbin/metastat d100 d100: metamirror Submirror 0: d10 State: Okay Submirror 1: d20 State: Okay Regions which are dirty: 0% d10: Submirror of d100 State: Okay Hot spare pool: hsp001 Size: 15536742 blocks Stripe 0: (interlace : 96 blocks) Device Start Block Dbase State Hot Spare /dev/dsk/c1t1d0s7 0 No Okay /dev/dsk/c2t2d0s7 0 No Okay /dev/dsk/c1t3d0s7 0 No Okay Stripe 1: (interlace : 64 blocks) Device Start Block Dbase State Hot Spare /dev/dsk/c3t1d0s7 0 No Okay /dev/dsk/c4t2d0s7 0 No Okay /dev/dsk/c3t3d0s7 0 No Okay /dev/dsk/c4t4d0s7 0 No Okay d20: Submirror of d100 State: Okay Hot spare pool: hsp001 Size: 15536742 blocks Stripe 0: (interlace : 96 blocks) Device Start Block Dbase State Hot Spare /dev/dsk/c2t1d0s7 0 No Okay /dev/dsk/c1t2d0s7 0 No Okay /dev/dsk/c2t3d0s7 0 No Okay Stripe 1: (interlace : 64 blocks) Device Start Block Dbase State Hot Spare /dev/dsk/c4t1d0s7 0 No Okay /dev/dsk/c3t2d0s7 0 No Okay /dev/dsk/c4t3d0s7 0 No Okay /dev/dsk/c3t4d0s7 0 No Okay /dev/dsk/c2t4d0s7
エクスポートされている各ファイルシステムについて /dev/dsk エントリを調べます。以下のいずれかの方法を使用します。
whatdev スクリプトを使用して /dev/dsk エントリを確認する場合は、以下のようにします。
テキストエディタを使用して、以下の whatdev スクリプトを作成します。
#!/bin/csh # print out the drive name - st0 or sd0 - given the /dev entry # first get something like "/iommu/.../.../sd@0,0" set dev = '/bin/ls -l $1 | nawk '{ n = split($11, a, "/"); split(a[n],b,"”:"); for(i = 4; i < n; i++) printf("/%s",a[i]); printf("/%s\n", b[1]) }'' if ( $dev == "" ) exit # then get the instance number and concatenate with the "sd" nawk -v dev=$dev '$1 ~ dev { n = split(dev, a, "/"); split(a[n], \ b, "@"); printf("%s%s\n", b[1], $2) }' /etc/path_to_inst
「df -k /ファイルシステム名」と入力して、ファイルシステムの /dev/dsk エントリを調べます。
furious% df -k /var/mail Filesystem kbytes used avail capacity Mounted on /dev/dsk/c1t0d0s4 582128 302556 267930 53% /var/mail
「whatdev ディスク名」と入力して、ディスク番号を求めます (ディスク名は、 df -k /ファイルシステム名 コマンドによって返されたディスク名)。
この例では、whatdev /dev/dsk/clt0d0s4 と入力します。この場合のディスク番号は id8 (IPI ディスク 8) です。
server% whatdev /dev/dsk/c1t0d0s4 id8
メタディスク (/dev/md/dsk) 以外のディスクに存在する各ファイルシステムについて手順 b と 手順 c を繰り返します。
ファイルシステムにメタディスク (/dev/md/dsk) が存在する場合は、metastat の出力に応じて、メタディスクを構成する全ドライブに対して whatdev スクリプトを実行します。
この例では、whatdev /dev/dsk/c2t1d0s7 と入力します。
/export/home ファイルシステムは、14 のディスクから構成されています。このディスクの 1 つである /dev/dsk/c2t1d0s7 ディスクに、whatdev スクリプトを実行すると、次の結果が得られます。
server% whatdev /dev/dsk/c2t1d0s7 id17
この場合の /dev/dsk/c2t1d0s7 はディスク id17 (IPI ディスク 17) です。
手順 7 に進みます。
whatdev スクリプトではなく、ls -1L を使用して/dev/dsk エントリを確認する場合は、以下のようにします。
「ls -1L ディスク番号」と入力し、ドライブとそのドライブの主および副デバイス番号を表示します。
/var/mail ファイルシステムの場合の入力例を以下に示します。 ls -lL /dev/dsk/c1t0d0s4
ls -lL /dev/dsk/c1t0d0s4 brw-r----- 1 root 66, 68 Dec 22 21:51 /dev/dsk/c1t0d0s4
ls -1L の出力から副デバイス番号を探します。
この例では、ファイル所有権 (root) の直後の 66 が主デバイス番号、次の 68 は副デバイス番号です。
ディスク番号を調べます。
上記の例では、副デバイス番号 (68) を 8 で割ります (68÷8 = 8.5)。
端数を切り捨てます。8 がディスク番号です。
スライス (パーティション) 番号を求めます。
ディスク番号の s (slice の s) の後にある数字を確認します。 たとえば /dev/dsk/clt0d0s4 の場合は、s の後の 4 がスライス 4 を示します。
ディスク番号が 8、スライス番号が 4 であることを確認できました。 このディスクは sd8 (SCSI) か id8 (IPI) です。
「iostat -x 15」と入力して、各ディスクのディスク統計情報を表示します。-x によって、拡張ディスク統計情報を指示するオプションです。15 は、ディスク統計情報を 15 秒おきに収集することを意味します。
server% iostat -x 15 extended disk statistics disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b id10 0.1 0.2 0.4 1.0 0.0 0.0 24.1 0 1 id11 0.1 0.2 0.4 0.9 0.0 0.0 24.5 0 1 id17 0.1 0.2 0.4 1.0 0.0 0.0 31.1 0 1 id18 0.1 0.2 0.4 1.0 0.0 0.0 24.6 0 1 id19 0.1 0.2 0.4 0.9 0.0 0.0 24.8 0 1 id20 0.0 0.0 0.1 0.3 0.0 0.0 25.4 0 0 id25 0.0 0.0 0.1 0.2 0.0 0.0 31.0 0 0 id26 0.0 0.0 0.1 0.2 0.0 0.0 30.9 0 0 id27 0.0 0.0 0.1 0.3 0.0 0.0 31.6 0 0 id28 0.0 0.0 0.0 0.0 0.0 0.0 5.1 0 0 id33 0.0 0.0 0.1 0.2 0.0 0.0 36.1 0 0 id34 0.0 0.2 0.1 0.3 0.0 0.0 25.3 0 1 id35 0.0 0.2 0.1 0.4 0.0 0.0 26.5 0 1 id36 0.0 0.0 0.1 0.3 0.0 0.0 35.6 0 0 id8 0.0 0.1 0.2 0.7 0.0 0.0 47.8 0 0 id9 0.1 0.2 0.4 1.0 0.0 0.0 24.8 0 1 sd15 0.1 0.1 0.3 0.5 0.0 0.0 84.4 0 0 sd16 0.1 0.1 0.3 0.5 0.0 0.0 93.0 0 0 sd17 0.1 0.1 0.3 0.5 0.0 0.0 79.7 0 0 sd18 0.1 0.1 0.3 0.5 0.0 0.0 95.3 0 0 sd6 0.0 0.0 0.0 0.0 0.0 0.0 109.1 0 0
iostat -x 15 コマンドを使用し、各ディスクについて拡張ディスク統計情報を得ることができます。次の手順では、sed スクリプトを使用してディスク名をディスク番号に変換する方法を説明します。
拡張ディスク統計情報出力の各項目の意味は以下のとおりです。
表 2-3 iostat -x 15 コマンドの出力 (拡張ディスク統計情報)引数 | 説明 |
---|---|
r/s |
秒あたりの読み取り回数 |
w/s |
秒あたりの書き込み回数 |
Kr/s |
秒あたりの読み取り KB 数 |
Kw/s |
秒あたりの書き込み KB 数 |
wait |
サービス待ちの平均トランザクション数 (待ち行列の長さ) |
actv |
サービスを受けている平均トランザクション数 |
svc_t |
平均サービス時間 (ミリ秒) |
%w |
待ち行列が空になっていない時間の割合 |
%b |
ディスクが使用されている時間の割合 |
ディスク名をディスク番号に変換します。
ここでは、iostat と sar を使用します。ディスク名をディスク番号に変換する最も簡単な方法は、sed スクリプトを利用することです。
以下に示す d2fs.server sed スクリプトを参考にし、テキストエディタを使用して sed スクリプトを作成します。
作成した sed スクリプトでは、ディスク番号の代わりにファイルシステム名を使用します。
この例では、id8 ディスクが /var/mail、id9 と id10、id11、id17、id18、id25、id26、id27、id28、id33、id34、id35、id36 ディスクが /export/home です。
sed 's/id8 /var/mail/ s/id9 /export/home/ s/id10 /export/home/ s/id11 /export/home/ s/id17 /export/home/ s/id18 /export/home/ s/id25 /export/home/ s/id26 /export/home/ s/id27 /export/home/ s/id28 /export/home/ s/id33 /export/home/ s/id34 /export/home/ s/id35 /export/home/ s/id36 /export/home/'
iostat -xc 15 | d2fs.server と入力して、sed スクリプトを通して iostat -xc 15 コマンドを実行します。
iostat -xc 15 | d2fs.server の各オプションの意味を以下の表に示します。
表 2-4 iostat -xc 15 | d2fs.server コマンドのオプション引数 | 説明 |
---|---|
-x |
拡張ディスク統計情報の指定です。 |
-c |
システムがユーザーモード (us) 、システムモード (sy) 、入出力待ち (wt) 、アイドル (id) している時間の長さの割合を報告します。 |
15 |
15 秒ごとにディスク統計情報を収集します。 |
iostat -xc 15 | d2fs.server コマンドの出力例を以下に示します。
% iostat -xc 15 | d2fs.server extended disk statistics cpu disk r/s w/s Kr/s Kw/s wait actv svc_t %w %b us sy wt id export/home 0.1 0.2 0.4 1.0 0.0 0.0 24.1 0 1 0 11 2 86 export/home 0.1 0.2 0.4 0.9 0.0 0.0 24.5 0 1 export/home 0.1 0.2 0.4 1.0 0.0 0.0 31.1 0 1 export/home 0.1 0.2 0.4 1.0 0.0 0.0 24.6 0 1 export/home 0.1 0.2 0.4 0.9 0.0 0.0 24.8 0 1 id20 0.0 0.0 0.1 0.3 0.0 0.0 25.4 0 0 export/home 0.0 0.0 0.1 0.2 0.0 0.0 31.0 0 0 export/home 0.0 0.0 0.1 0.2 0.0 0.0 30.9 0 0 export/home 0.0 0.0 0.1 0.3 0.0 0.0 31.6 0 0 export/home 0.0 0.0 0.0 0.0 0.0 0.0 5.1 0 0 export/home 0.0 0.0 0.1 0.2 0.0 0.0 36.1 0 0 export/home 0.0 0.2 0.1 0.3 0.0 0.0 25.3 0 1 export/home 0.0 0.2 0.1 0.4 0.0 0.0 26.5 0 1 export/home 0.0 0.0 0.1 0.3 0.0 0.0 35.6 0 0 var/mail 0.0 0.1 0.2 0.7 0.0 0.0 47.8 0 0 id9 0.1 0.2 0.4 1.0 0.0 0.0 24.8 0 1 sd15 0.1 0.1 0.3 0.5 0.0 0.0 84.4 0 0 sd16 0.1 0.1 0.3 0.5 0.0 0.0 93.0 0 0 sd17 0.1 0.1 0.3 0.5 0.0 0.0 79.7 0 0 sd18 0.1 0.1 0.3 0.5 0.0 0.0 95.3 0 0 sd6 0.0 0.0 0.0 0.0 0.0 0.0 109.1 0 0
上記の例の各欄の用語と略語の意味は以下のとおりです。
表 2-5 iostat -xc 15 コマンドの出力引数 | 説明 |
---|---|
r/s |
秒あたりの読み取り回数 |
w/s |
秒あたりの書き込み回数 |
Kr/s |
秒あたりの読み取り KB 数 |
Kw/s |
秒あたりの書き込み KB 数 |
wait |
サービス待ちの平均トランザクション数 (待ち行列の長さ) |
actv |
サービスを受けている平均トランザクション数 |
svc_t |
平均サービス時間 (ミリ秒) |
%w |
待ち行列が空になっていない時間の割合 |
%b |
ディスクが使用されている時間の割合 |
svc_t |
ディスク要求の処理を終えるまでの平均サービス時間 (ミリ秒)。この時間には、待ち時間とアクティブ待ち行列時間、シーク回転時間、転送待ち時間が含まれます。 |
us |
CPU 時間 |
sed スクリプトを介して sar -d 15 1000 コマンドを実行します。
server% sar -d 15 1000 | d2fs.server 12:44:17 device %busy avque r+w/s blks/s avwait avserv 12:44:18 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 id20 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 var/mail 0 0.0 0 0 0.0 0.0 export/home 0 0.0 0 0 0.0 0.0 sd15 7 0.1 4 127 0.0 17.6 sd16 6 0.1 3 174 0.0 21.6 sd17 5 0.0 3 127 0.0 15.5
-d オプションは、ディスク装置の利用状況を報告します。15 は、15 秒ごとにデータを収集するという意味です。1000 は、データ収集を 1000 回行うという意味です。出力の各欄の用語と略語の意味は以下のとおりです。
表 2-6 sar -d 15 1000 | d2fs.server コマンドの出力ヘッダー | 説明 |
---|---|
device |
監視中のディスク装置名。 |
%busy |
装置が転送要求の処理に費やした時間の割合 (iostat %b と同じ)。 |
avque |
監視中に未処理の要求の平均個数 (iostat actv と同じ) 。待ち行列に要求がある場合のみ測定されます。 |
r+w/s |
装置に対する 1 秒あたりの読み取りおよび書き込み転送回数 (iostat r/s + w/s と同じ)。 |
blks/s |
1 秒あたりに装置に転送された 512 バイトブロック数 (iostat 2*(kr/s + kw/s)と同じ)。 |
avwait |
転送要求が待ち行列で待たされる平均時間 (ミリ秒) (iostat wait と同じ) 待ち行列に要求がある場合のみ測定されます。 |
avserv |
装置による転送要求の処理を終えるまでの平均時間 (ミリ秒) 。ディスクの場合、この時間には、シーク時間と回転待ち時間、データ転送時間が含まれます。 |
NFS 経由でファイルシステムがエクスポートされている場合は、%b と %busy 値を調べます。
%b 値はディスクがビジーになっている時間の割合を表し、iostat コマンドによって返されます。%busy 値は装置が転送要求の処理に費やした時間の割合を表し、sar コマンドによって返されます。%b と %busy 値が 30 % を超える場合は、 手順 e に進みます。30 % を超えていない場合は、手順 9 に進みます。
svc_t 値と avserv 値を調べます。
svc_t 値は平均サービス時間 (ミリ秒) を表し、iostat コマンドによって返されます。avserv 値は装置による転送要求の処理が終えるまでの平均時間 (ミリ秒) を表し、sar コマンドによって返されます。svc_t と同じ測定値を得るには、avwait を追加します。
svc_t 値 (平均サービス時間) が 40 ミリ秒を超える場合は、ディスクの応答時間が長くなっています。NFS クライアントから見ると、ディスクの入出力を伴う NFS 要求の処理は遅くなります。NFS 応答時間は、NFS プロトコル処理とネットワーク伝送時間を考慮して、平均 50 ミリ秒以下が適当です。ディスクの応答時間は、40 ミリ秒以下が適当です。
平均サービス時間は、ディスクの関数です。高速なディスクを使用している場合、平均サービス時間は遅いディスクを使用する場合にくらべて短くなります。
sys の crontab ファイルの行のコメント指定を外し、sar によって 1 か月間データを収集することによって、定期的にデータを収集します。
root# crontab -l sys #ident"@(#)sys1.592/07/14 SMI"/* SVr4.0 1.2*/ # # The sys crontab should be used to do performance collection. # See cron and performance manual pages for details on startup. 0 * * * 0-6 /usr/lib/sa/sa1 20,40 8-17 * * 1-5 /usr/lib/sa/sa1 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A
性能に関するデータが継続的に収集され、sar の実行結果の記録が作成されます。
/var/adm/sa ファイルには、数百 KB の空き領域が必要です。
負荷を分散させます。
Solstice DiskSuite または Online: DiskSuite を使用し、ファイルシステムを複数のディスクにストライプ処理します。Prestoserve 書き込みキャッシュを使用してアクセス回数を減らし、アクセスのピーク時の負荷を分散します (Solstice DiskSuite または Online: DiskSuite によるディスクのアクセス負荷の分散を参照)。
読み取り専用ファイルシステムがある場合は、バッファーキャッシュを調整します (バッファーキャッシュの調整 (bufhwm)を参照してください)。
%プロンプトに対して nfsstat -s と入力して、NFS の問題点を調べます。
-s オプションを指定すると、サーバーの統計情報を表示することができます。
server% nfsstat -s Server rpc: calls badcalls nullrecv badlen xdrcall 480421 0 0 0 0 Server nfs: calls badcalls 480421 2 null getattr setattr root lookup readlink read 95 0% 140354 29% 10782 2% 0 0% 110489 23% 286 0% 63095 13% wrcache write create remove rename link symlink 0 0% 139865 29% 7188 1% 2140 0% 91 0% 19 0% 231 0% mkdir rmdir readdir statfs 435 0% 127 0% 2514 1% 2710 1%
NFS サーバーの画面には、受信された NFS コール数 (calls)、拒否されたコール数 (badcalls) 、実際に行われた各種呼び出し数とその割合が表示されます。 nfsstat -s を実行して返される呼び出し数と割合については、以下の表を参照してください。
表 2-7 nfsstat -s コマンドの出力ヘッダー | 説明 |
---|---|
calls |
受信された RPC コール数の合計。 |
badcalls |
RPC 層に拒否されたコール数の合計 (badlen と xdrcall の合計)。 |
nullrecv |
受信したと思われるのに使用できる RPC コールがなかった回数。 |
badlen |
最小サイズの RPC コールより短い RPC コール数。 |
xdrcall |
ヘッダーを XDR デコードできなかった RPC コール数。 |
nfsstat -s コマンドの出力と対処方法を以下に示します。
表 2-8 nfsstat -s コマンドを実行して得られる出力と処置
原因 |
対処方法 |
---|---|
writes 値が 5 % を超える1 |
最高の性能が得られるように、Prestoserve NFS アクセラレータ (SBus カードまたは NVRAM-NVSIMM) をインストールします (Prestoserve NFS アクセラレータを参照) 。 |
badcalls が返される |
badcalls は、RPC レイヤーによって拒否されたコールで、badlen と xdrcall の合計です。ネットワークが過負荷になっている可能性があります。ネットワークインタフェース統計情報を利用して、過負荷のネットワークを特定してください。 |
readlink が NFS サーバーの lookup コール数の合計の 10 % を超える |
NFS クライアントが使用しているシンボリックリンクが多すぎます。シンボリックリンクは、サーバーによってエクスポートされたファイルシステム上に存在するリンクです。シンボリックリンクをディレクトリに置き換えてください。NFS クライアントにベースのファイルシステムとシンボリックリンクのターゲットの両方をマウントします。以下の 手順 13 を参照してください。 |
getattr が 40 % を超える |
actimeo オプションを使ってクライアントの属性キャッシュを大きくします。必ずDNLC と i ノードキャッシュは大きくしてください。vmstat -s を使用し DNLC のヒット率 (cache hits) を求め、必要に応じて /etc/system ファイルの ncsize 値を大きくします。ディレクトリ名ルックアップキャッシュ (DNLC) も参照してください。 |
1. writes 値 29 % は非常に高い値です。 |
シンボリックリンクを削除します。
nfsstat -s コマンド出力の symlink 値が 10 % を超える場合は、シンボリックリンクを削除してください。以下の例では、/usr/tools/dist/sun4 が/usr/dist/bin のシンボリックリンク先です。
vmstat -s と入力して、ディレクトリ名ルックアップキャッシュ (DNLC) ヒット率を表示します。
vmstat -s コマンドは、ヒット率 (cache hits) を返します。
% vmstat -s ...[略]... 79062 total name lookups (cache hits 94%) 16 toolong
ロングネーム数に問題がないにもかかわらず、ヒット率が 90 % 以下の場合は、 /etc/system ファイルの ncsize 変数値を大きくします。
set ncsize=5000
30 文字より短いディレクトリ名がキャッシュされます。また、長すぎてキャッシュできないディレクトリ名も報告されます。
ncsize のデフォルト値は以下のとおりです。
ncsize (ネームキャッシュ) = 17*maxusers + 90
NFS サーバーのベンチマークでは、16000 に設定されています。
maxusers = 2048 の場合は、34906 に設定されます。
ディレクトリ名ルックアップキャッシュの詳細については、ディレクトリ名ルックアップキャッシュ (DNLC) を参照してください。
システムを再起動します。
Prestoserve NFS アクセラレータを使用している場合は、その状態を調べて、UP 状態になっていることを確認します。
server% /usr/sbin/presto state = UP, size = 0xfff80 bytes statistics interval: 1 day, 23:17:50 (170270 seconds) write cache efficiency: 65% All 2 batteries are ok
エラー状態の場合は、『Prestoserve User's Guide』を参照してください。
これでサーバーを検査する手順は終了しました。引き続き、各クライアントを検査してください。
全体として見ると、調整にはクライアントの調整も含まれます。クライアントを調整した方が、サーバーを調整するより性能が改善されることがあります。たとえば、 100 あるクライアントの 1 台ごとに 4 MB のメモリーを増設することで、非常に効果的に NFS サーバーの負荷を小さくすることができます。
%プロンプトに対して nfsstat -c と入力して、クライアント統計情報を調べ、NFS に関係する問題がないか確認します。
client % nfsstat -c Client rpc: calls badcalls retrans badxids timeouts waits newcreds 384687 1 52 7 52 0 0 badverfs timers toobig nomem cantsend bufulocks 0 384 0 0 0 0 Client nfs: calls badcalls clgets cltoomany 379496 0 379558 0 Version 2: (379599 calls) null getattr setattr root lookup readlink read 0 0% 178150 46% 614 0% 0 0% 39852 10% 28 0% 89617 23% wrcache write create remove rename link symlink 0 0% 56078 14% 1183 0% 1175 0% 71 0% 51 0% 0 0% mkdir rmdir readdir statfs 49 0% 0 0% 987 0% 11744 3%
この nfsstat -c コマンドの出力例では、合計で 384687 回のコールがあり、そのうち再送信 (retrans) と時間切れ (timeout) が、それぞれ 52 回発生しています。
各フィールドの意味は、以下のとおりです。
表 2-9 nfsstat -c コマンドの出力例ヘッダー | 説明 |
---|---|
calls |
コール数の合計。 |
badcalls |
RPC によって拒否されたコール数の合計。 |
retrans |
再送信回数の合計。 |
badxid |
1 つの NFS 要求に対して確認が重複した回数。 |
timeout |
タイムアウトが発生したコール数。 |
wait |
使用できるクライアントハンドルがなかったためにコールが待たされた回数。 |
newcred |
確証情報のリフレッシュが求められた回数。 |
nfsstat -c コマンドの出力の説明と対処方法を以下に示します。
表 2-10 nfsstat -c コマンドを実行して得られる出力と、それに対する処置
問題 |
処置 |
---|---|
retrans 値が全コール数の 5 %を超える |
サーバーに要求が届いていません。 |
badxid 値と badcalls 値がほぼ等しい |
ネットワークの動作が遅くなっています。原因を究明してください。問題を解消するには、高速なネットワークにするかサブネットをインストールすることを検討してください。 |
badxid 値と timeouts 値がほぼ等しい |
大部分の要求はサーバーに届いていますが、予測よりサーバーの動作が鈍いことが考えられます。nfsstat -m を使用して予測時間を調べてください。 |
badxid 値がゼロに近い |
ネットワーク上で要求が失われています。mount オプションの rsize 値と wsize 値を小さくしてください。 |
null が 0 より大きい |
null コール数が多いということは、オートマウンタが頻繁にマウントを再試行していることを意味します。マウント時のタイムアウト時間が短かすぎます。オートマウンタコマンド行のマウント時タイムパラメタ (timeo) の値を大きくしてください。 |
NFS マウントしている各ファイルシステムの統計情報を表示します。
統計情報は、サーバー名とアドレス、マウントフラグ、現在の読み取り、書き込みサイズ、伝送回数、ダイナミック伝送に使われているタイマー情報から構成されます。
client % nfsstat -m /export/home from server:/export/home Flags: vers=2,hard,intr,dynamic,rsize=8192,wsize=8192,retrans=5 Lookups: srtt=10 (25ms), dev=4 (20ms), cur=3 (60ms) Reads: srtt=9 (22ms), dev=7 (35ms), cur=4 (80ms) Writes: srtt=7 (17ms), dev=3 (15ms), cur=2 (40ms) All: srtt=11 (27ms), dev=4 (20ms), cur=3 (60ms)
nfsstat -m コマンドの出力例の用語の意味は、以下のとおりです。
表 2-11 nfsstat -m コマンドの出力ヘッダー | 説明 |
---|---|
srtt |
正常時の往復時間。 |
dev |
予測偏差。 |
cur |
現在のバックオフタイムアウト値。 |
上記のコードの ( ) 内の数字は、ミリ秒で表した実際の時間です。その他の値は、オぺレーティングシステムのカーネルによって保持されている未スケール値で、無視してかまいません。応答時間は、ルックアップと読み取り、書き込みの操作の組み合せ時について示されています。nfsstat -m コマンドを実行して得られる出力と対処方法を以下にまとめます。
表 2-12 nfsstat -m コマンドを実行して得られる出力と処置
問題 |
処置 |
---|---|
srtt 値が 50 ミリ秒より大きい |
マウントポイントの反応が鈍いことが考えられます。前述の手順を参考に、ネットワークとサーバーのマウントポイントを提供しているディスクを調べてください。 |
"NFS server not responding" というメッセージが表示される |
メッセージが表示されないようにして、かつ性能を向上させるには、/etc/vfstab ファイルの timeo パラメタ値を大きくしてください。初期 timeo パラメタ値の 2 倍を基準にしてください。vfstab ファイルの timeo パラメタ値を変更して、nfsstat -c コマンドを実行します。badxid 値を調べて、表 2–10 の nfsstat -c コマンドの推奨処置に従ってください。 |
Lookups: cur 値が 80 ミリ秒より大きい |
要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。 |
Reads: cur 値が 150 ミリ秒より大きい |
要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。 |
Writes: cur 値が 250 ミリ秒より大きい |
要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。 |