遅くなる原因と、改善の基礎
改善の基礎
ISUCONでは、主に「データーベース」と「アプリケーション」の改善をメインに行います。
ここでの「アプリケーション」とは、要するにGo言語で書かれたプログラムのことを指します。
他にもリバースプロキシツールである「nginx」の設定を書き換えて静的配信やロードバランスを行ったりもします。
この章では、遅い原因がそもそも何なのかということと、遅い物をどう解決すればよいのかを学んでいきます。
遅い原因
遅いとは何か
レスポンスが遅いということ!
何かの計算や探索などの処理が遅くて、時間がかかる
- データーベースのクエリの実行
- 1回の実行で 100ms ~ 1s かかるクエリがあったら、500回叩かれるだけで100秒かかる
- 暗号化の処理
- パスワードをハッシュ化する際の計算には結構時間がかかる
- 待機する処理がある
- 何かの値が帰ってくるまで待機する
- lock されているファイルにアクセスできるまで待つ
リソース(CPUやメモリ)が足りない
- 凄い数のリクエストが来るので、基本的にリソースが足りない
通信が遅い
- 通信回数が多い
- データーベースとの通信
- 1回の実行で 10ms しかかからなくても、10000回 叩かれれば100秒かかる
- データーベースとの通信
- 通信量が多い
- 画像の送信
他にも沢山の原因がある
よくある原因としてはこのような感じですが、この他にも、書ききれないような沢山の原因があります。
ISUCONでは、適切に計測し、ログをあさり原因を割くりあて、改善することが求められます。
どう解決すればよい?
何かの計算や探索などの処理が遅くて、時間がかかる
- データーベース
- 非効率な探索を行っているクエリを書き換える
- 10件しか必要ないのに、全件取得していたら、
LIMIT 10
を付けて、10件だけ取得するようにする
- 10件しか必要ないのに、全件取得していたら、
- Indexというテーブルへの処理を高速化するためのデータ構造を使う
- データーベースも1行ずつ探索する子であることを理解し、自分がデーターベースの気持ちになってみる
- その上でどこに Index を貼ればデーターベース君が探索しなきゃいけない行の数を減らせるかを考える
- 非効率な探索を行っているクエリを書き換える
- アプリケーション
- 遅い処理を並列処理する
リソース(CPUやメモリ)が足りない
- 複数サーバーのリソースをフル活用できるように、上手くロードバランス、つまり負荷分散を行う
- 例えば、データーベース専用のサーバーを用意する
- データーベースとアプリケーションの負荷の比を考えて、サーバー構成も2:1とかにする
通信が遅い
- 通信回数が多い
- N+1 クエリが起きている事が多い。アプリケーション側で解決する
- JOINを使って、一回で取得できるようにする
- キャッシュを使って、取得した値がもう一度必要になったらキャッシュで持っておいた値を返す
- N+1 クエリが起きている事が多い。アプリケーション側で解決する
- 通信量が多い
- 静的配信は nginx で行う
改善では調べる力が重要!
沢山の改善方法がありますが、これらを改善するのに役立つ力が開発経験です。
本当に様々な要素がボトルネックになるので、必然的に総合格闘技になります。
実際には、計測し、ボトルネックが分かったところで、改善方法が分からないことが良く出てきます。
そのため、改善方法を調べるための力「調べる力」が必要不可欠なのです。
分からない事を日々から調べる癖をつけ、調べる力を鍛えておきましょう!
ISUCONは総合格闘技
遅くなる原因、改善方法、これらは様々な要素が絡み合っています。
ISUCONは、様々なデベロッパーエクスペリエンス、つまり開発経験が力となる、総合格闘技なのです!