はじめてのISUCON
まずはこれを読んでみる、やってみる
その上で実際のチューニング手順
0. 用語・ツール
top: パフォーマンスの可視化。CPU利用率やプロセス数等を、リアルタイムでモニタリングできる。
dstats: パフォーマンスの可視化。CPU利用率やプロセス数等を、特定時点でのパフォーマンスをモニタリングできる (スナップショット)。
ab: Aptche bentch。ベンチマーカー。負荷を与え、その計測結果を表示してくれる。オプションを指定することで負荷時間や並列数を指定できる。
alp: Webサーバー (nginx等)のアクセスログから、エンドポイント毎のパフォーマンスを可視化。 結果計測とボトルネック調査ができる。
アクセスログに指定した指標を排出するよう設定すること
チューニング後はログをローテションし、調整前後で結果を分ける必要あり
mysqldumpslow: MySQLログから、パフォーマンスの低いクエリを可視化。 結果計測とボトルネック調査ができる。
アクセスログに指定した指標を排出するよう設定すること
チューニング後はログをローテションし、調整前後で結果を分ける必要あり
k6: シナリオによる負荷試験を行う。プロダクトのボトルネックとなるエンドポイントを特定できる。
1. 計測する = ベンチマーカー&パフォーマンス可視化 (3章)
まずはパフォーマンス計測できるようにする
access_logを出力、そのフォーマットを整形
ログの内容からパフォーマンスを可視化 = alp, Ubuntuでinstallするところから
計測ができるようになったらベンチマークから負荷をテスト = ab (abはローカル上で起動させる)
ここまでで、ボトルネックとなるリソースを判断できる (リクエストを送信したURLの計測ができるようになるため)
上記手順で計測を繰り返す場合は、試験の実行毎にアクセスログをローテーションする必要がある
ローカルでabを実行、ホスト上でtopコマンドにてパフォーマンスを可視化
topコマンドからCPUの利用率から、ボトルネックを特定する
2. クエリの性能を測る、mysqldumpslow (3章)
MySQLのログ出力設定を行う
クエリログからmysqldumpslowで計測する
mysqldumpslowの結果から、クエリのボトルネックを特定する
対象のテーブルのCREATE文を確認し、indexを貼るなど対処を行う
ログをローテーションして、クエリの結果が向上しているか確認
3. CPUを活用する (3章)
abを利用してリクエストするクライアント数を増やし、並列リクエストの性能を測る
topコマンドではリアルタイム計測しか確認できないので、dstatコマンドでCPU利用状況のスナップショットを確認する。topコマンドも併せて確認することで、CPUの利用率も見る (プロセス数)
レイテンシーとスループットの数値、CPUの利用状況から、CPUが適切に利用できてるか判断する
適切なプロセス数を立てられていない場合、アプリケーションサーバーの設定を確認する(Railsの場合はunicorn)
4. シナリオによる負荷試験から、プロダクトのボトルネックを見つける (4章)
abコマンドのような特定エンドポイントへの負荷試験ではなく、手順に沿った、複数ユーザーによる負荷試験を行える
関数やシナリオ、ユーザー情報毎にjsファイルにまとめ (コンポーネント化)、一連の処理を複数ユーザーで実行する
sleep(), check(), parseHTML(), ShardArray x accounts.json等を利用する
シナリオ負荷試験を実行後、alpによるエンドポイント毎の結果を計測し、ボトルネックを見つける