PCやサーバのレスポンスが悪くなると何の疑いもなくメモリ不足を疑う人が多いようですが、よく調べてみるとメモリ以外の箇所でボトルネックが発生している事例も多いようです。それを踏まえて今回はWindowsでの簡単な見分け方を述べてみようと思います。

4つの主要ボトルネック要素

 サーバやPCには4つの主要ボトルネック要素があります。このいずれかがボトルネックとなった場合システム全体のレスポンスが低下します。

  1. CPU使用率
  2. メモリ使用量
  3. ディスクI/O
  4. TCPコネクション数

ボトルネック箇所の簡単な見分け方

 これらの要素がボトルネックとなっているかどうかは以下のように見分けることができます。

1. CPU使用率

 改めて記すことがないくらい有名ですが「タスクマネージャ」の「パフォーマンス」タブを開きCPU使用率を見ます。CPU使用率が常に100%に近い場合はCPUがボトルネックであることが判明します。

 →この場合はアプリケーションのロジックを改善するかもしくはCPU数を増やすことでボトルネックが解消されます。ただし何らかのアプリケーションが暴走している可能性がありますので、気になる方は念のためOSを再起動してもう一度測定するのもよいでしょう。

2. メモリ使用量

 同様に「タスクマネージャ」の「パフォーマンス」タブを開きメモリ使用量を見ます。メモリ使用量が物理メモリ量を常に超えていたらメモリがボトルネックであることが判明します。

 →この場合はメモリを増強することでボトルネックが解消されます。ただし何らかのアプリケーションがメモリリークしている可能性がありますので、気になる方は念のためOSを再起動してもう一度測定するのもよいでしょう。

3. ディスクI/O

 パフォーマンスモニタにて、オブジェクト:「LogicalDisk」(もしくは物理ディスクI/Oとして「PhysicalDisk」)カウンタ:「Avg. Disk Queue Length」を追加ししばらく様子を観察します。この値が常に2以上だとディスクI/O処理要求で常時待ち発生している状態ですのでディスクI/Oがボトルネックであることが判明します。

 →この場合はディスク装置を上位のものに交換するか、もしくはディスク装置がキャッシュメモリを増強できる機種の場合はそれを増強することでボトルネックが解消されます。ただしDBなどの場合はサーバメモリを増やしてキャッシュ容量を増やすことでヒット率が向上し、結果的にディスクI/Oが軽減する場合があります。

4. TCPコネクション数

TCPコネクション数を調べる場合パフォーマンスモニタを活用する方法(オブジェクト:「Web Service」、カウンター:「Current Connections」)もありますが、私はコマンドプロンプトを開いてnetstat -anの行数を調べてみます(この方法はTCPコネクション以外の情報も含まれるので厳密ではありませんが許容誤差の範囲である場合がほとんどです)。アプリケーションの性質にもよりますがTCPコネクション数が数千以下であれば問題がないようです。それを超えると徐々にネットワークがボトルネックになる可能性があります。

 →この場合はWEBサーバの場合KeepAliveを無効にする、OSのパラメータを変更して接続のタイムアウト値を変更する等の方法でボトルネックが解消されます。

最後に

 以上、今回はあくまでも簡単な見分け方をご紹介させていただきました。システムはいろいろな要素が絡むので今回の方法だけでボトルネック箇所を百発百中で発見できるわけではありませんが、日常運用においては今回の方法で十分に問題箇所の切り分けが可能です。参考になりましたら幸いです。