2011年3月26日土曜日

サーバの性能を引き出す

1台で処理できる負荷をサーバー数台で分散させるのは無駄なことです。なのでここでは、単一のサーバの性能を十分に引き出すことに焦点をあててみます。

まず、単一ホストの性能を引き出すには、サーバリソースの利用状況を正確に把握しなければなりません。そのために負荷計測を調べる必要があります。では、どのように調べればいいのか?実は、負荷を知るのに必要な情報はOSが持っています。

例えばLinuxでは、ps・top・sarなどのツールを利用します。

■psコマンド
プロセス識別子名・CPU時間・コマンド名を表示するツールです。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.33.34-2011-03-26-12-46.png


■topコマンド
topコマンドはある瞬間のOSの状態のスナップショットを表示するツールです。CPU使用率やメモリの利用状況など、様々な値が報告されています。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.00.09-2011-03-26-12-46.png

■sarコマンド
sar(System Admin Reporter:システム管理者向けレポーター)はCPUやネットワーク、メモリ、ディスクなどのシステム情報を確認・出力できるツールです。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.15.11-2011-03-26-12-46.png



ボトルネック見極め作業
上のツールを使ったところで、報告される値が多種にわたることが分かります。報告された値の中で、どこを見ていけばいいのでしょうか。実は、ボトルネックを見極めるための作業は、大きく2つに分けることができます。

■ロードアベレージを見る
ロードアベレージとはシステム全体の負荷状況を示す指標のことです。top・uptimeなどのコマンドでロードアベレージを見ます。ロードアベレージの値をヒントに、問題の切り分けをすることになります。

例) ロードアベレージは低いのにシステムのスループットが上がらない
ソフトウェアの設定や不具合・ネットワーク・リモートホスト側に原因がないかを調査します

例) ロードアベレージが高い場合
後述するCPU・I/Oのいずれかの原因があるのかを調査します。


■CPU・I/Oのいずれがボトルネックかを探る
まず、sar・vmstatコマンドを利用して時間経過とともにCPU使用率やI/O待ち率の推移を確認します。

例) CPU負荷が高い場合
原因としては以下の二つが挙げられます。
・ディスクやメモリ容量などそのほかの部分がボトルネックにはなっていない理想的な状態
        - サーバ増設やプログラムのロジックなので改善対処
・プログラミングの暴走で、CPUに必要以上の負荷がかかっている
        - プログラムの不具合を取り除きます



例) I/O負荷が高い場合
原因としては以下の二つが挙げられます
・プログラムの入出力が多くて負荷が高い
        - メモリ増設でキャッシュ領域を拡大させられる場合は、メモリを増設する
        - メモリ増設出来ない場合は、データの分散・キャッシュサーバの導入
               
・スワップが発生してディスクアクセスが発生している
        - 特定のプロセスが極端にメモリを消費していないかをpsで確認
        - プログラムの不具合でメモリを使いすぎている場合は、プログラムを改善
        - 搭載メモリが不足している場合はメモリ増設で対応



マルチタスクOSと負荷
近年のマルチタスクOSでは複数の異なるタスクを実行することができます。これは、短い時間間隔で複数のタスクを切り替えながら処理をするめることで実現しています。しかし、実行するタスクが増えてくると、CPUが空くのを待たされるタスクが現れます。この待ち状態は、プログラムの実行遅延となって現れます。

topコマンドの出力として”load average”という数字があります。これは、左から順に1分・5分・15分の間に、単位時間当たりに待たされたタスクの数を表します。
       
        load average: 0.07, 0.11, 0.10

ロードアベレージが高い状況は、それだけ遅延がある、つまり負荷が高い状況ということです。

しかし、これだけでは、CPU・I/Oのボトルネックを探ることができません。もう少し細かい調査が必要になってきます。


CPU使用率とI/O待ち率
過負荷でシステムのパフォーマンスが劣化する原因は、ほとんどの場合CPUかI/Oのどちらかです。ここで、CPU使用率とI/O待ち率が生かされます。この指標の確認の方法としてはsar(System Activity Reporter)コマンドがあります。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.15.11-2011-03-26-12-46.png

■ロードアベレージが高く、CPU使用率の値が高い
CPU使用率の値は、上の「%user」と「%system」で表示されます。

%user:CPUのユーザモードでの使用率
        ユーザプログラムが動作する際のCPUのモード、つまり通常のアプリケーションが動作するモード
        プログラムがCPUに負荷をかける場合、多くはユーザモードでの使用率が高くなります。

%system:CPUのシステムモードでの利用率
        システムプログラム=カーネルが動作する際のCPUモード
        大量のプロセスやスレッドを動作させている場合、システムモードでの使用率が高くなります


■ロードアベレージが高く、I/O待ち率の値が高い
I/O待ち率の値は、上の「%iowait」で表示されます。

%iowait:I/O待ち率



■ボトルネックを見極める
CPU、I/Oのどちらかが原因だということが分かったら、そこからさらに詳細に調査していきます。例えば、メモリの使用率やスワップ発生状況などです。

ボトルネックを見極める方法としては、
  1. ロードアベレージなどの総合的な数字
  2. CPU使用率やI/O待ち率などのより具体的な数字
  3. 各プロセスの状態
上のようにトップダウンで見ていく戦略が有効です。



ボトルネックを発見して取り除くことが性能向上につながる
チューニングは ”ハードウェア・ソフトウェアが性能を十分に発揮するために、問題があれば取り除く” という作業です。ハードウェア・ソフトウェアがもともと持っている性能以上の性能を出すことは不可能です。

つまり、サーバの性能を引き出すためには、ボトルネックが発生したときに原因と解決を見極めるための知識が必要になります。



       

0 件のコメント:

コメントを投稿