OS X Server:パフォーマンスを評価する

Mac OS X Server v10.4 以降が稼働しているサーバのパフォーマンスの評価を開始するスクリプトの使用方法について説明します。主な目的は、CPU、ディスクストレージ、およびネットワークの主要リソースの使用率を確認することです。

リソースの使用率

こちらの perl スクリプト (「top_guide.pl」) を使って、お使いのサーバにおける、時間経過と共に変化する主要リソースの使用率を評価できます。このスクリプトは、Mac OS X Server v10.4 以降で動作します。

上記のスクリプトは top -d を実行しますが、時間経過と共に変化する主要リソースの使用率を抽出し要約します。引数がない場合、top_guide.pl の出力は次のようになります。

--------  -----------  ------------  -------------  -------------  -------------  -------------  ------
          CPU usage:          300-s  Reads/sec:     Writes/sec:    Net in/sec:    Net out/sec:   kernel
Time:     user  sys    Idle   avg.   number MB      number MB      pkts   Mb      pkts   Mb      CPU%
--------  ----- -----  -----  -----  ------ ------  ------ ------  ------ ------  ------ ------  ------
08:44:36    0.1   0.1   99.8   99.8       0    0.0       0    0.0      11    0.0       0    0.0     0.4
08:44:46    0.1   0.3   99.6   99.8       0    0.0       0    0.1      12    0.0       0    0.0     0.4
08:44:56    0.0   0.2   99.8   99.8       0    0.0       0    0.0      17    0.0       0    0.0     0.4
08:45:06    0.0   0.2   99.8   99.8       0    0.0       0    0.0       6    0.0       0    0.0     0.4
08:45:16    0.0   0.2   99.8   99.8       0    0.0       0    0.0       9    0.0       0    0.0     0.4
08:45:26    8.7  24.6   66.7   98.6      43    0.8      98    0.6     803    1.0    1399    1.1     5.0
08:45:37    5.7  83.6   10.7   95.7      48    0.4    1085  116.9   95366 1053.1   61830   35.4    72.4
08:45:47   11.5  88.5    0.0   92.4      23    0.2    3228  426.9  337955 3843.6  207872  114.0   284.8
08:45:58    4.6  95.4    0.0   89.0       4    0.0     594  596.7  447499 5215.5  266449  140.9   370.0

CPU、ディスク I/O、およびネットワークの 3 つの主要エリアに分類できます。それぞれのエリアには、次の列が表示されます。

  • Time:最新のサマリ行の終了時間です。サンプル期間のデフォルト値は 10 秒です。
  • CPU usage:user:ユーザモードの CPU 使用率です。この値は、システム上で利用可能な総 CPU リソースに対する割合 (%) です。たとえば 8 プロセッサ構成のシステムで、ユーザ CPU が 50 % の場合、稼働中の全アプリケーションの総 CPU 使用率は、4 プロセッサと同等であることを指します。
  • CPU usage: sys:カーネルモードの CPU 使用率で、利用可能な総 CPU リソースに対する割合 (%) で示されます。
  • Idle:待機状態の CPU で、利用可能な総 CPU リソースに対する割合 (%) で示されます。
  • 300-s avg.:直近の 300 秒間における、使用されていない CPU の割合の平均です (「-r」オプションを使用して平均する間隔を変更した場合、列のタイトルが変更した値に変わることに注意してください)。
  • Reads/sec - number:サンプル期間に生じたディスク読み込み回数です。
  • Reads/sec - MB:サンプル期間にディスクから読み込まれた総メガバイト数です。
  • Writes/sec - number:サンプル期間に生じた書き出し回数です。
  • Writes/sec - MB:サンプル期間に書き出された総メガバイト数です。
  • Net in/sec - pkts:サンプル期間に受信された総パケット数です。
  • Net in/sec - Mb:サンプル期間の総ネットワーク入力 (メガビット/秒) です。
  • Net out/sec - pkts:サンプル期間に送信された総ネットワークパケット数です。
  • Net out/sec - Mb:サンプル期間の総ネットワーク出力 (メガビット/秒) です。

このスクリプトが提供するその他のオプションには次が含まれます。

  • -h:すべての使用状況に関する情報を表示します。
  • -o filename:出力のコピーをタブ区切りでファイルに保存します。この出力形式は、スプレッドシートやその他のデータ分析スクリプトへのインポートに適しています。出力が常に自己記述的な形式になるよう、最初の行にヘッダが含まれます。
  • -d:日付とタイムスタンプを表示します。管理者がサーバへの長時間にわたるログオン履歴を確認する場合に非常に役立ちます。
  • -S processNames:単一のインスタンスの処理を監視します。サーバ上で、プロセス ID が 1 つだけの特定のサービスに注目したい場合に役立ちます。主に AFP サーバとして利用されるサーバが例に挙げられます。この場合、引数 -S AppleFileServer を使って、AppleFileServer プロセスのユーザ CPU 使用率の列を追加します。プロセス名をカンマで区切って複数のプロセスを表示できます。
  • -M processNames:アプリケーションが複数のプロセスを使う場合を除き -S と同様です。その一例が smbd で、これは接続ごとに 1 つ動作します。主に Samba を使用するシステムでは、-M smbd を使ってすべての Samba の動作のユーザ CPU 使用率を要約する列を表示します。

サーバパフォーマンスの完全な分析はこの記事の対象ではありませんが、top-guide.pl の出力にシステム上の CPU、ディスク、およびネットワークリソース使用率のサマリが表示されます。管理者はこのサマリとシステムのハードウェアおよび負荷を比較して、より詳しく調査するエリアを決定できます。各エリアを調査する際に役立つと考えられる補足ツールを次に示します。

CPU 使用率

CPU 使用率が高い場合、アプリケーションの効率を向上させることが調査の主な目的となります。これはこの記事の対象ではありませんが、CPU が利用されていない場合があります。高い負荷に対応できる十分なネットワークおよびディスクリソースがあるにも関わらず、相当量の CPU が待機中のままであるような状態を調査するためにいくつかの方法があります。

CPU があまり利用されないのは、次の 2 つの場合があります。

  • アプリケーションスレッドのロック
  • カーネルリソースのロック

Mac OS X 10.5 Leopard で導入された plockstat(1) コマンドを特定のアプリケーションに対して実行し、pthread ロックの競合を調査できます。コンテキストスイッチ数 (CSW 列) が多いプロセスに対する top -d の出力を調べて、pthread ロックの競合が発生している可能性のあるプロセスを特定できます。pthread ロックの競合を調査するプロセスを特定したら、次のコマンドを使います。 # plockstat -C -e 10 -p <pid>

 Mutex block
   
   Count     nsec Lock                       Caller
   -------------------------------------------------------------------------------
  8540    29622 0x805eb0                     a.out`process_request+0x3d1
  8361    28284 0x805eb0                     a.out`release_block+0xac
  
 R/W reader block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
     1  3014987 0xa781e8                     a.out`key_find+0x121
     5    78831 0xa3d158                     a.out`key_find+0x121
     2   120532 0xa3d158                     a.out`key_delete+0x137
 
 R/W writer block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
    10  5336318 0xa781e8                     a.out`key_replace+0x80
    13  3827632 0xa75fe8                     a.out`key_replace+0x80
     3  3644946 0xa5fde8                     a.out`key_create+0x37
     6   161055 0xa3d158                     a.out`key_replace+0x80
     1   785267 0xa37758                     a.out`key_create+0x37

この出力を調べて、各ロックでブロックされた nsec の合計を確認できます。合計値に対してこの値が高い場合、実行時間はロックの競合の影響を受けています。この情報は、アプリケーション作成者がアプリケーションのパフォーマンスを特定し向上させる際に役立ちます。符号を使用できる場合、ブロックした機能の符号名が Caller フィールドに表示されます。また、合計ブロック数が多い (1 秒あたり 250 を超過) 場合、スレッド間のリスケジュールの効率が多少失われています。上記がパフォーマンスの阻害要因であると断定するには至りませんが、高いブロック率はアプリケーションの効率が本来より低いことを指す場合が多いため、調査が必要です。

カーネル内リソースの競合問題の場合があります。Mac OS X カーネルは、ほとんどのマルチスレッドリソースをカーネル mutex および reader-writer ロックで管理します。Mutex の競合は、次に示すような dtrace(1M) スクリプトによって評価できます。

lockstat:::adaptive-block

{

        @often[arg0, stack(5)] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

このスクリプトによって、5 秒のサンプリング後にソートされたリスト (もっとも競合が多いロックとパスが各出力ブロックの最後に示される) が表示されます。出力例を次に示します。

        375517140

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`ip_output_list+0xd34

              mach_kernel`tcp_setpersist+0x18b

              mach_kernel`tcp_output+0x17a0

                0

        375571960

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`vnode_ref+0x32

              mach_kernel`fcntl_nocancel+0x4b3

              mach_kernel`unix_syscall64+0x26d

                0

このスクリプトは、375517140 のカーネル mutex が、ip_output_list() を呼び出す tcp_setpersist() を tcp_output() が呼び出すパスでブロックされていることをレポートしています。上記ロックの両方で 1 秒ごとのブロック数が 0 のため、ロックの競合は問題ではありません。この形式のスクリプトでは、1 つのロックに対するすべてのインスタンスが合計されないことに注意してください。スクリプトを次のように変更します。

lockstat:::adaptive-block

{

        @often[arg0] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

出力は次のように変更されます。

       1301055072                9

       1417504384                9

        353318336               10

        359381776               10

       1301055088               11

          5387344              165

この出力は、カーネルアドレス 5387344 のロックでのみ多数の競合状態が発生していますが、発生数は注意が必要なレベルより少ない (250 未満) ことを示しています。

最後に、次のようにスクリプトを若干変更してカーネル reader-writer ロックを確認します。

lockstat:::rw-block

{

    @often[arg0, stack(4)] = count();

}


profile:::tick-5sec

{

    normalize(@often, 5);

    printa(@often);

    clear(@often);

}

dtrace(1M) lockstat スクリプトおよび plockstat(1) の使用に際して次に注意してください。

  • ロック統計値の収集は、パフォーマンスに影響します。これらのツールがシステムの遅延を引き起こす場合があります。実行時は十分注意し、パフォーマンスに対する影響によって、通常動作では発生しない競合が発生することに留意してください。
  • ロックでブロックされることだけでは影響されない設計もあります。変化が非常に遅いリソース上でのロックを考えてください。そのリソースで、管理するためにロックを使用することを選択している場合もあります。長時間実行される処理の完了を待っているロックが残されている場合があります。

このような場合、実際にはパフォーマンスを低下させない長いホールド時間が発生する可能性があります。

ディスクの使用率

iopending(1) は、I/O キューの長さを、キューの長さのグラフとして表示します。たとえば、次のようになります。

2008 May 21 10:35:26,  load: 0.99,  disk_r:      0 KB,  disk_w:    392 KB
           value  ------------- Distribution ------------- count   
             < 0 |                                         0       
               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298    
               1 |                                         12      
               2 |                                         5       
               3 |                                         4       
               4 |                                         2       
               5 |                                         3       
               6 |                                         2       
               7 |                                         2       
               8 |                                         3       
               9 |                                         2       
              10 |                                         3       
              11 |                                         2       
              12 |                                         2       
              13 |                                         2       
              14 |                                         2       
              15 |                                         0       

この例はいくつかのディスク処理を示していますが、ほぼすべての I/O キューの長さが 0 のため問題ないことを示します。また、 iopending を使って特定のディスクまたはファイルシステムのボリュームに焦点をあてることができます。たとえば /Volumes/MyRAID に焦点をあてる場合、次のコマンドを使います。 iopending -m MyRAID

最後に、I/O を特定プロセスに関連付け、 fs_usage(1) を使ってレイテンシ―を評価できます。Shark と fs_usage(1) の使用に関する詳細は、この Developer connection の文書に記載されています。

ネットワーク使用率

多くのサーバでは、ネットワーク上のさまざまな距離にある複数のネットワークインターフェイスおよびクライアントから接続されています。したがって、パフォーマンスの分析は複雑です。ただし、すでにわかっている速度の構造内でクライアントが直接接続される LAN 環境では、top_guide.pl と netstat -i によってレポートされる測定結果から、どれだけの容量が使用されているか見極めることができます。そのような値を読み取るときは、次のガイドラインに留意してください。

ギガビットネットワーク - 全二重、1500 バイト MTU
最高速度 - スモールパケット:    1488 Kpps   762 Mbps
最大パケット速度 - 1500 バイトパケット:  81 Kpps   987 Mbps
(Kpps = 1000 パケット/ 1 秒)

ネットワークのパフォーマンスを分析するときは、過剰なパケット再送信率 (この記事では対象外) などの問題に対する netstat -s の出力を確認することも有用です。

関連情報

  • ファイルシステムの使用状況の監視に関する詳細については、「Examining File System Usage」を参照してください。
  • Shark time-profiling ツールの情報については、「Shark User Guide」を参照してください。
  • Dtrace の使用方法の詳細については、「How To Use Dtrace」を参照してください。

Apple 製以外の製品に関する情報や、Apple が管理または検証していない個々の Web サイトは、推奨や承認なしで提供されています。Apple は他社の Web サイトや製品の選定、性能、使用については一切責任を負いません。Apple は他社の Web サイトの正確性や信頼性については一切明言いたしません。インターネットの使用にはリスクがつきものです。詳しくは各社にお問い合わせください。その他の会社名や製品名は、それぞれの所有者の商標である場合があります。

公開日: