前回はWindowsでのサーバやPCのボトルネック箇所の簡単な見分け方をご紹介させていただきましたが、要望がありましたので今回はLinuxの場合をご紹介いたします。
4つの主要ボトルネック要素の復習です。
サーバやPCには4つの主要ボトルネック要素があります。このいずれかがボトルネックとなった場合システム全体のレスポンスが低下します。
- CPU使用率
- メモリ使用量
- ディスクI/O
- TCPコネクション数
ボトルネック箇所の簡単な見分け方
Linuxにおいてはボトルネック箇所を以下のように見分けることができます。
1. CPU使用率
CPU使用率が常に100%に近い場合はCPUがボトルネックであることが判明します。CPU使用状況を簡単に調べるには3つの方法があります。「top」「w」「vmstat」コマンドを使う方法です。
この例の場合はCPU0とCPU1の2個のCPUが搭載されていますが、双方共idle値が98%以上(=CPU使用率が2%未満)なので正常です。
ロードアベレージは処理を待っているプロセスの平均数です。ロードアベレージ値の解釈は人それぞれですが、経験的には1以下であれば軽い状態。1~3くらいであればやや重い状態。それ以上だとCPUがボトルネックであると言えそうです。
2. メモリ使用量
メモリ使用量が物理メモリ量を常に超えて空きメモリがなくなればメモリがボトルネックであることが判明します。 空きメモリ状況は以下のように調べることができます。
まずtopコマンドを実行します。
これを見ると512MBのメモリを搭載しているマシンで、442M程度のメモリを使用していて70M程度のメモリしか空きがない、と読み取れますが、それは今回の目的からすれば解釈の間違いです。もっと見てみましょう。
Linuxでは空きメモリがあるとそれをすべてCacheにまわそうとします。それがtopに出てくる数字です。
本当の意味で空きメモリ状況を把握するためにはCacheに回された分を差し引く必要があります。Cacheに回された分を差し引いた状況を調べるためにはfreeコマンドを実行します。この実行結果の2行目を見ると357MBくらい空いているのがわかります。よってこのマシンはメモリにかなり余裕があることがわかります。
3. ディスクI/O
ディスクI/Oの場合はCPUやメモリのように搭載リソースの消費状況によってボトルネックを判定するわけではありません。要件や予算によってどの程度のレスポンスタイムが要求されるか基準値が異なってきます。ディスクI/O状況を簡単に調べるには「vmstat」コマンドを使います。
ここではbi/boの部分を見ます。既記したように要件によってここの適正値は異なります。実際に測定しながら最適値を探してみてください。
※bi: Blocks received from a block device (blocks/s)., bo: Blocks sent to a block device (blocks/s)。
4. TCPコネクション数
アプリケーションの性質にもよりますがTCPコネクション数が数千以下であれば問題がないようです。それを超えると徐々にネットワークがボトルネックになる可能性があります。 TCPコネクション数を簡単に調べるために私は「netstat」コマンドを使うことが多いです。
場合にもよりますが多くの場合この数字がTCPコネクション数とほぼ同等です(厳密にはESTABLISHED,TIME_WAIT,FIN_WAIT等の総数。余計な部分は許容誤差と考えてます)。今回の場合は3050ですから正常の範囲内です。
TCPコネクションが張られるとポート番号が1つ消費されます。ポートは番号65535個しかありませんから、万が一数万個のTCPコネクションが張られるようなことがあった場合はサーバを分散化する等の対応が必要になります。
最後に
今回ご紹介した方法はお医者さんで言えば問診に当たります。もし怪しいと思う箇所が見つかったら精密検査を行う必要が出るかもしれません。ボトルネック箇所を見分けられるようになるためには今回ご紹介した内容を知識として持つと共に常にサーバの稼動状況を観察してみることであると考えます。毎日サーバを見ていると何か異常が起こったときに直感的に問題箇所を特定できるようになります。