以下では、大規模な構成の SPARCserver 690 システムを例にとって説明をしています。
share コマンド実行することによって、何がエクスポートされているのかを調べます。
server% share - /export/home rw=netgroup "" - /var/mail rw=netgroup "" - /cdrom/solaris_2_3_ab ro ""
df -k と入力して、マウントされているファイルシステムと、そのファイルシステムが実際にマウントされているディスクドライブを表示します。
ファイルシステムの使用率が 100% になると、通常、クライアント側で NFS 書き込みエラーが発生します。
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 コマンドを使用してファイルサーバーが存在するディスク番号を調べます。
上記の例の /var/mail は /dev/dsk/clt0d0s4 に、/export/home は Solstice DiskSuite(TM) メタディスクの /dev/md/dsk/d100 に存在しています。
df -k コマンドを使用して Solstice DiskSuite メタディスクが返された場合は、/usr/opt/SUNWmd/sbin/metastate ディスク番号 と入力して、ディスク番号を求めます。
上記の例の /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 スクリプトを使用してドライブのインスタンスかニックネームを調べるか、ls -lL /dev/dsk/c1t0d0s4 と more /etc/path_to_inst を入力して /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 /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、id19、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 コマンドの出力disk |
ディスク装置名 |
r/s |
秒あたりの読み取り回数 |
w/s |
秒あたりの書き込み回数 |
Kr/s |
秒あたりの読み取り KB 数 |
Kw/s |
秒あたりの書き込み KB 数 |
wait |
サービス待ちの平均トランザクション数 (待ち行列の長さ) |
actv |
サービスを受けている平均トランザクション数 |
svc_t |
平均サービス時間 (ミリ秒) |
%w |
待ち行列が空になっていない時間の割合 |
%b |
ディスクが使用されている時間の割合 |
svc_t |
ディスク要求の処理を終えるまでの平均サービス時間 (ミリ秒)。この時間には、待ち時間とアクティブ待ち行列時間、シーク回転時間、転送待ち時間が含まれます。 |
us |
CPU 時間 |
sy |
システム時間 |
wt |
入出力待ち時間 |
id |
アイドル時間 |
sar -d 15 1000 | d2fs.server と入力することにより、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 値を調べます。30 %を超える場合は、svc_t 値を確認してください。
%b 値はディスクがビジーになっている時間の割合を表し、iostat コマンドによって返されます。%busy 値は装置が転送要求の処理に費やした時間の割合を表し、sar コマンドによって返されます。%b と %busy 値が 30 %を超える場合は、 次の手順に進んでください。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 によるディスクのアクセス負荷の分散」を参照)。
読み取り専用ファイルシステムがある場合は、バッファーキャッシュを調整します (第 3 章「最適な NFS 性能を得るためのサーバーとクライアントの設定」を参照してください)。
%プロンプトに対して 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 %を超える |
最高の性能が得られるよう、Prestoserve NFS アクセラレータ (SBus カードまたは NVRAM-NVSIMM) をインストールします (「Prestoserve NFS アクセラレータ」を参照) 。 |
badcalls が返される |
badcalls は、RPC レイヤーによって拒否されたコールで、badlen と xdrcall の合計です。ネットワークが過負荷になっている可能性があります。ネットワークインタフェース統計情報を利用して、過負荷のネットワークを特定してください。 |
readlink が NFS サーバーの lookup コール数の合計の 10 %を超える |
NFS クライアントが使用しているシンボリックリンクが多すぎます。シンボリックリンクは、サーバーによってエクスポートされたファイルシステム上に存在するリンクです。シンボリックリンクをディレクトリに置き換えてください。NFS クライアントにベースのファイルシステムとシンボリックリンクのターゲットの両方をマウントします。以下の 手順 13 を参照してください。 |
etattrg が 40 %を超える |
actimeo オプションを使ってクライアントの属性キャッシュを大きくします。必ずDNLC と i ノードキャッシュは大きくしてください。vmstat -s を使用し DNLC のヒット率 (cache hits) を求め、必要ならば /etc/system ファイルの ncsize 値を大きくします。「ディレクトリ名ルックアップキャッシュ (DNLC) 」も参照してください。 |
** 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 アクセラレータを使用している場合は、%プロンプトに対して /usr/sbin/presto と入力して、その状態を調べます。
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』を参照してください。
これでサーバーを検査する手順は終了しました。引き続き、各クライアントを検査してください。