Sun NFS サーバーの調整

第 2 章 NFS 性能の分析

この章では、NFS 性能の分析方法について説明します。システムを調整するための一般的な手順を簡単に示し、ネットワーク、サーバー、各クライアントの検査方法について説明します。

調整手順

NFS サーバーを最初に設定する際には、サーバーが最高の性能を発揮するように調整する必要があります。また、後で、特定の状況に応じてよりよい性能が得られるように、その都度調整する必要があります。

全般的な性能を向上させるための調整手順

以下の手順に従って、NFS サーバーの性能を向上させます。

  1. ネットワーク、サーバー、各クライアントの現在の性能レベルを測定します。ネットワーク、サーバー、クライアントの性能検査を参照してください。

  2. 収集されたデータのグラフを作成し、分析します。例外、ディスクと CPU の使用状況、ディスクサービス時間を調べてください。しきい値または性能値ルールを、データに適用します。

  3. サーバーを調整します。第 3 章「最適な NFS 性能を得るためのサーバーとクライアントの設定」を参照してください。

  4. 満足のいく性能レベルが得られるまでFailed Cross Reference Format からFailed Cross Reference Format を繰り返します。

性能上の問題を解決するための調整手順

性能上の問題が発生した場合の調整手順は以下のとおりです。

  1. 状態を観察し、ツールを使用して問題の原因を突き止めます。

  2. ネットワークとサーバー、各クライアントの現在の性能レベルを測定します。ネットワーク、サーバー、クライアントの性能検査を参照してください。

  3. 収集されたデータのグラフを作成し、分析します。例外、ディスクと CPU の使用状況、ディスクサービス時間を調べてください。しきい値または性能値ルールを、データに適用します。

  4. サーバーを調整します。第 3 章「最適な NFS 性能を得るためのサーバーとクライアントの設定」を参照してください。

  5. 満足のいく性能レベルが得られるまでFailed Cross Reference Format からFailed Cross Reference Format を繰り返します。

ネットワーク、サーバー、クライアントの性能検査

NFS サーバーの調整は、ネットワーク、NFS サーバー、各クライアントの性能を検査してから行います。最初に検査するのはネットワークです。ディスクが正常に動作している場合に、NFS クライアントから見てサーバーが遅いということは、ネットワークが遅いということと同じです。ネットワークの使用状況を調べてください。

ネットワークを調べる
  1. 各ネットワークのパケット数と衝突/エラー発生回数を調べます。


    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 を入力した画面では、ネットワークトラフィックが使用可能なマシンによって、入力パケットと出力パケットの両方が連続的に増加していることが示されます。

  2. 出力側衝突回数 (Output Colls - le) を出力パケット数 (le) で割ることによってネットワーク衝突率を求めます。

    たいていの場合、ネットワーク全体の衝突率が 10 %より高いということは、ネットワークが過負荷である場合や、ネットワークの構成に問題がある場合、あるいはハードウェアに問題がある、などを意味します。

  3. 入力エラー発生回数 (le) を入力パケット数の合計 (le) で割ることによって入力パケット誤り率を求めます。

    入力誤り率が 25 %を超える場合は、ホストによってパケットが正しく送信されていない可能性があります。

    ネットワークのハードウェア、またはトラフィックの混雑、ローレベルのハードウェア上の問題によっても、伝送上の問題が発生することがあります。たとえば、ブリッジやルーターによってパケットが正しく送信されないと、強制的に再送信が行われ、性能低下の原因になります。

    ブリッジがパケットヘッダーの Ethernet アドレスを調べることによって、遅延が生じます。アドレスの検出中、ブリッジネットワークインタフェースによって、パケットの一部が正しく送信されないことがあります。

    ネットワークハードウェアに帯域幅の制限がある場合は、以下の作業を行ってください。

    • パケットサイズを小さくします。

    • mount を使用するか、または /etc/vfstab ファイルに、読み取りバッファーサイズ (rsize) と書き込みバッファーサイズ (wrsize) を指定します。ブリッジを通るデータの方向によって値は異なりますが、これらの変数を 2048 に設定してください。データがブリッジなどの装置を介して双方向に伝送される場合は、両方の変数の値をさらに小さくしてください。


      server:/home  /home/server nfs rw,rsize=2048,wsize=2048 0 0

    クライアントがユーザーデータグラムプロトコル (UDP) と通信していて、多数の読み取りおよび書き込み要求が正しく送信されない場合は、送信されなかったパケットの代わりにパケット全体を再送信します。

  4. クライアントから「 ping -sRv サーバー名」と入力して、パケットの経路を表示することによって、パケットがネットワークを往復 (エコー) するために必要な時間を調べます。

    ネットワークが遅いか、ネットワークに遅いルータがあるか、あるいはネットワークが非常に混み合っている場合は、往復に数ミリ秒 (ms) を要します。最初に入力した ping コマンドから返された結果は、無視してください。また、ping -sRv コマンドは、パケットロス数も表示します。

    以下は、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 コマンドに対する応答が得られた場合と、得られなかった場合の処理の流れを以下に示します。

図 2-1 ping -sRv コマンドに対する応答の流れ

Graphic

NFS サーバーの検査


注 -

以下では、大規模な構成の SPARCserver 690 システムを例にとって説明しています。


NFS サーバーを検査する
  1. 何がエクスポートされているのかを調べます。


    server% share
    -               /export/home   rw=netgroup   ""
    -               /var/mail   rw=netgroup   ""
    -               /cdrom/solaris_2_3_ab   ro   ""

  2. マウントされているファイルシステムと、そのファイルシステムが実際にマウントされているディスクドライブを表示します。


    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 に存在しています。

  3. 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

  4. エクスポートされている各ファイルシステムについて /dev/dsk エントリを調べます。以下のいずれかの方法を使用します。

    • whatdev スクリプトを使用してドライブのインスタンスかニックネームを調べます(手順 5 に進みます)。

    • ls -lL コマンドを使用して /dev/dsk エントリを調べます (手順 6 に進みます)。

  5. whatdev スクリプトを使用して /dev/dsk エントリを確認する場合は、以下のようにします。

    1. テキストエディタを使用して、以下の 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

    2. df -k /ファイルシステム名」と入力して、ファイルシステムの /dev/dsk エントリを調べます。

      この例では、df -k /var/mail と入力します。


      furious% df -k /var/mail
      Filesystem            kbytes    used   avail capacity  Mounted on
      /dev/dsk/c1t0d0s4     582128  302556  267930    53%    /var/mail

    3. whatdev ディスク名」と入力して、ディスク番号を求めます (ディスク名は、 df -k /ファイルシステム名 コマンドによって返されたディスク名)。

      この例では、whatdev /dev/dsk/clt0d0s4 と入力します。この場合のディスク番号は id8 (IPI ディスク 8) です。


      server% whatdev /dev/dsk/c1t0d0s4
      id8

    4. メタディスク (/dev/md/dsk) 以外のディスクに存在する各ファイルシステムについて手順 b手順 c を繰り返します。

    5. ファイルシステムにメタディスク (/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) です。

    6. 手順 7 に進みます。

  6. whatdev スクリプトではなく、ls -1L を使用して/dev/dsk エントリを確認する場合は、以下のようにします。

    1. 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

    2. ls -1L の出力から副デバイス番号を探します。

      この例では、ファイル所有権 (root) の直後の 66 が主デバイス番号、次の 68 は副デバイス番号です。

    3. ディスク番号を調べます。

      • 上記の例では、副デバイス番号 (68) を 8 で割ります (68÷8 = 8.5)。

      • 端数を切り捨てます。8 がディスク番号です。

    4. スライス (パーティション) 番号を求めます。

      ディスク番号の s (slice の s) の後にある数字を確認します。 たとえば /dev/dsk/clt0d0s4 の場合は、s の後の 4 がスライス 4 を示します。

      ディスク番号が 8、スライス番号が 4 であることを確認できました。 このディスクは sd8 (SCSI) か id8 (IPI) です。

  7. 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

    ディスクが使用されている時間の割合 

  8. ディスク名をディスク番号に変換します。

    ここでは、iostatsar を使用します。ディスク名をディスク番号に変換する最も簡単な方法は、sed スクリプトを利用することです。

    1. 以下に示す d2fs.server sed スクリプトを参考にし、テキストエディタを使用して sed スクリプトを作成します。

      作成した sed スクリプトでは、ディスク番号の代わりにファイルシステム名を使用します。

      この例では、id8 ディスクが /var/mailid9id10id11id17、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/'

    2. 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 時間 

    3. 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

      装置による転送要求の処理を終えるまでの平均時間 (ミリ秒) 。ディスクの場合、この時間には、シーク時間と回転待ち時間、データ転送時間が含まれます。 

    4. NFS 経由でファイルシステムがエクスポートされている場合は、%b%busy 値を調べます。

      %b 値はディスクがビジーになっている時間の割合を表し、iostat コマンドによって返されます。%busy 値は装置が転送要求の処理に費やした時間の割合を表し、sar コマンドによって返されます。%b%busy 値が 30 % を超える場合は、 手順 e に進みます。30 % を超えていない場合は、手順 9 に進みます。

    5. svc_t 値と avserv 値を調べます。

      svc_t 値は平均サービス時間 (ミリ秒) を表し、iostat コマンドによって返されます。avserv 値は装置による転送要求の処理が終えるまでの平均時間 (ミリ秒) を表し、sar コマンドによって返されます。svc_t と同じ測定値を得るには、avwait を追加します。

      svc_t 値 (平均サービス時間) が 40 ミリ秒を超える場合は、ディスクの応答時間が長くなっています。NFS クライアントから見ると、ディスクの入出力を伴う NFS 要求の処理は遅くなります。NFS 応答時間は、NFS プロトコル処理とネットワーク伝送時間を考慮して、平均 50 ミリ秒以下が適当です。ディスクの応答時間は、40 ミリ秒以下が適当です。

      平均サービス時間は、ディスクの関数です。高速なディスクを使用している場合、平均サービス時間は遅いディスクを使用する場合にくらべて短くなります。

  9. 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 の空き領域が必要です。


  10. 負荷を分散させます。

    Solstice DiskSuite または Online: DiskSuite を使用し、ファイルシステムを複数のディスクにストライプ処理します。Prestoserve 書き込みキャッシュを使用してアクセス回数を減らし、アクセスのピーク時の負荷を分散します (Solstice DiskSuite または Online: DiskSuite によるディスクのアクセス負荷の分散を参照)。

  11. 読み取り専用ファイルシステムがある場合は、バッファーキャッシュを調整します (バッファーキャッシュの調整 (bufhwm)を参照してください)。

  12. %プロンプトに対して 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 層に拒否されたコール数の合計 (badlenxdrcall の合計)。

    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 レイヤーによって拒否されたコールで、badlenxdrcall の合計です。ネットワークが過負荷になっている可能性があります。ネットワークインタフェース統計情報を利用して、過負荷のネットワークを特定してください。

    readlink が NFS サーバーの lookup コール数の合計の 10 % を超える

    NFS クライアントが使用しているシンボリックリンクが多すぎます。シンボリックリンクは、サーバーによってエクスポートされたファイルシステム上に存在するリンクです。シンボリックリンクをディレクトリに置き換えてください。NFS クライアントにベースのファイルシステムとシンボリックリンクのターゲットの両方をマウントします。以下の 手順 13 を参照してください。

    getattr が 40 % を超える

    actimeo オプションを使ってクライアントの属性キャッシュを大きくします。必ずDNLC と i ノードキャッシュは大きくしてください。vmstat -s を使用し DNLC のヒット率 (cache hits) を求め、必要に応じて /etc/system ファイルの ncsize 値を大きくします。ディレクトリ名ルックアップキャッシュ (DNLC) も参照してください。

     1. writes 値 29 % は非常に高い値です。

  13. シンボリックリンクを削除します。

    nfsstat -s コマンド出力の symlink 値が 10 % を超える場合は、シンボリックリンクを削除してください。以下の例では、/usr/tools/dist/sun4/usr/dist/bin のシンボリックリンク先です。

    1. /usr/dist/bin のシンボリックリンクを削除します。


      # rm /usr/dist/bin
      

    2. /usr/dist/bin ディレクトリを作成します。


      # mkdir /usr/dist/bin
      

    3. ディレクトリをマウントします。


      client# mount server: /usr/dist/bin
      client# mount server: /usr/tools/dist/sun4
      client# mount 
      

  14. vmstat -s と入力して、ディレクトリ名ルックアップキャッシュ (DNLC) ヒット率を表示します。

    vmstat -s コマンドは、ヒット率 (cache hits) を返します。


    % vmstat -s
    ...[略]...
    79062 total name lookups (cache hits 94%)
    16 toolong

    1. ロングネーム数に問題がないにもかかわらず、ヒット率が 90 % 以下の場合は、 /etc/system ファイルの ncsize 変数値を大きくします。


      set ncsize=5000
      

      30 文字より短いディレクトリ名がキャッシュされます。また、長すぎてキャッシュできないディレクトリ名も報告されます。

      ncsize のデフォルト値は以下のとおりです。

      ncsize (ネームキャッシュ) = 17*maxusers + 90

      • NFS サーバーのベンチマークでは、16000 に設定されています。

      • maxusers = 2048 の場合は、34906 に設定されます。

      ディレクトリ名ルックアップキャッシュの詳細については、ディレクトリ名ルックアップキャッシュ (DNLC) を参照してください。

    2. システムを再起動します。

  15. 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

    • DOWN 状態になっている場合は、UP 状態に設定します。


      server% presto -u
      

    • エラー状態の場合は、『Prestoserve User's Guide』を参照してください。

これでサーバーを検査する手順は終了しました。引き続き、各クライアントを検査してください。

各クライアントの検査

全体として見ると、調整にはクライアントの調整も含まれます。クライアントを調整した方が、サーバーを調整するより性能が改善されることがあります。たとえば、 100 あるクライアントの 1 台ごとに 4 MB のメモリーを増設することで、非常に効果的に NFS サーバーの負荷を小さくすることができます。

各クライアントを検査する
  1. %プロンプトに対して 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) の値を大きくしてください。

  2. 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–10nfsstat -c コマンドの推奨処置に従ってください。

    Lookups: cur 値が 80 ミリ秒より大きい

    要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。 

    Reads: cur 値が 150 ミリ秒より大きい

    要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。 

    Writes: cur 値が 250 ミリ秒より大きい

    要求の処理に時間がかかりすぎています。ネットワークかサーバーのいずれかの動作が遅いことが考えられます。