「達人が教えるWebパフォーマンスチューニング」を進めながら、サンプルアプリのボトルネック探しとパフォーマンスの改善をしてみました。
どんな流れで、どんなコマンドを使ったのかを簡単に紹介します。
ボトルネック調査やパフォーマンス改善の思考の過程の詳細を知りたい場合。上記書籍をお手元にご準備いただくのをオススメします。
想定する読者
- Webの性能試験をする上で、どんな流れで進めるのか触りを知りたい人
- 性能試験を進める上で、活用できるコマンドを知りたい人
実施したこと
基本的な流れとしては、こんな感じです。
- 事前準備
- 実行結果を確認するためのログ出力の設定をする
- 負荷試験の実施
- ベンチマーカーで負荷をかける
- 負荷試験中のシステムを監視する
- 実行結果を確認して、ボトルネックを調べる
- チューニングを行う
事前準備
ログ出力の設定やコマンドのインストールなどを済ませます。
以下の環境構築記事を一通りなぞっていれば、準備OKだと思います。


負荷試験の実施
ベンチマーカーを使って負荷をかけます(後ろで紹介しているabコマンドを使いました)。
負荷試験中には、top, dstat等のコマンドを使用して、システムのリソース利用状況を監視しました。
- CPUが暇を持て余していないか
- リクエストが詰まっている(ネックになっている)のがどの部分か
なんてことを考えながら、監視していました。
ボトルネックの調査
負荷試験が終わったら、ログを確認しながらボトルネックを調べていきます。
シンプルなWebアプリケーションの構成の場合、以下のような項目をまず先に見にいくことでしょう。
- Webサーバのアクセスログを確認する
- SQLの実行結果(SlowQueryログ)を確認する
- システムリソースの利用状況と照らし合わせる
負荷がかかっている(CPUがパンパンである)わけではないのに、処理速度が伸びない ということがあれば、どこかで処理が詰まっていることを疑う等、いくつか定番の観点があるようです。
書籍の中で、いくつかの観点が紹介されていて参考になりました。
パフォーマンスの改善
すぐに修正できる範囲で実施したこととしては以下の通りです。
- データベースのテーブルへのIndex付与
- これだけでスループットが50倍くらいになりました
- Webサーバのワーカー数の増加
- CPUが遊んでいた
- リクエストの並列数を1 → 2 → 4と増やした際に、リクエストあたりの待ち時間が線形的に増えていた
- 上記のようなことを確認し、Webサーバのワーカが少ないことを疑った
この辺は、経験を積んで引き出しを増やしていくしかなさそう。
便利なコマンド
ボトルネック調査、パフォーマンス改善の際に活躍するコマンドについて、
使えそうなコマンドテンプレをまとめてみました。
アクセスログ解析 – alpコマンド
nginxのアクセスログを解析するために利用出来ます。
GitHub: https://github.com/tkuchiki/alp
集計対象
time
method
uri
status
response_time
request_time
結構便利。障害発生時にアクセスログを地道にgrepするよりもいいかも。
ベンチマーカー – abコマンド
多重度やリクエストを指定して、さくっと負荷をかけられる。
ベンチマーカーのインストール
単体レベルのテストをするには良さそう。
複雑なシナリオが必要になる場合だと、向かない。
スロークエリの解析 – mysqldumpslow
SlowQueryを集計するために使用する。
mysqlインストール時に付属しているので、特にインストールは不要。
1回あたりのクエリ実行時間が短い場合でも、大量の数のクエリが実行されていて、処理時間に占めるクエリ実行時間の割合が膨大になっている可能性もあるので、注意が必要。
クエリの実行時間やRows(n行返すために、何行アクセスしに行ったのか)等からボトルネックの原因を考えていくことができる。
CPUやメモリやプロセスやらのウォッチ – top
色々ウォッチできます。

CPUのコア数が2以上の場合、上に出ているCPUと下に出ているCPUの分母の意味合いが変わるので注意が必要。私もいつも「あれ?どっちだったっけ?」となります。
上の方は分母がマシン全てのCPU。
下の方は、1コア分のCPU。下の方がコア数が多いと、CPU利用率を合計したときに100%を超えることもあるわけですね。
システムメトリクスの表示 – dstat
dstat –cpuコマンドを使って、CPU使用率を簡単にウォッチできます。
GitHub: https://github.com/dstat-real/dstat
現在は開発が止まっていて、doolが後継として開発されている模様。
GitHub: https://github.com/scottchiefbaker/dool
おわりに
ざっくりと、負荷試験の流れと便利なコマンド集を紹介しました。
シナリオを作っての負荷試験を準備したことはあるのですが、abコマンドを使って簡単に負荷をかけてみる。というようなことは無かったので勉強になりました。
以上です。