ISUCON5予選に初参加してきましたのでふりかえります。
最終スコア4000弱で惨敗でした。
事前準備
顔合わせから(武さんとは初対面)、チームで集まってISUCON4予選を解いて、各々準備を進めて本番に望みました。当初予定していた担当と方針はこんな感じ。
-
@haman29 <- 僕
- アプリケーション(Ruby), Redis
-
@Kshi_Kshi
- MySQL(my.cnf、インデックス両方), OSとか
- 武さん
- Nginx
みんなアプリケーションエンジニアで普段使っている言語が Ruby, node.js, Java とバラバラだったこともあり、僕がRuby書きたい(あわよくばRedisも)というわがままを聞いてもらった。
- 最初の2時間でプロファイリング(kataribe, mysql slow log, top..)をして、ボトルネックを見つけ、TODOと優先度を決める
- 最後の1時間は再起動テスト
当日
-11:00
Rubyで行くことを選択していたのは運が良かった。
11:00-13:00
初期ベンチを回してスコア100くらいだったか。
プロファイリング取ろうと用意していたnginx.confを投入したらベンチ0点になったりとかで、結構ワタワタしていた。
僕はRubyコードを読んで仕様は把握に努めてた。
この時点で relations
と footprints
はRedisに乗せれるな〜と妄想してた。まだ手を動かしてない。
13:00-14:00
方針決め。とにかく get '/'
が重いことが kataribe でわかり mysql slow log から relations
, entries_of_friends
, comments_of_friends
のクエリチューニングしましょうという話になった。
15:08
one = ? or another = ? してたところを別々に取りunion
select * も select one か select another にした
この辺りで確かスコア500くらい
16:12
entries_of_friends
のクエリ改善。
クエリ結果をループで回しさらにクエリを呼ぶお決まりの形になっていたので
friends の id リストを作って where in するようにした。
この辺りでスコア1500ぐらい
-18:00
続いて comments_of_friends
のクエリもチューニングするぞ!と意気込んでたが、2時間ぐらい使って成果が上げられなかった、、
18:00
def is_friends?
がたくさん呼ばれてて全体の20%ぐらい使われているとのことだったので、ここでRedis使ってis_friends?
の書き換え実装を始めた。設計は局所的に使うので簡単に。
isu5:friends:<user_id>: user_id の Set
19:00
実装終わったけど、ベンチ回せず...orz
不完全燃焼に終わった。
チームメンバがミドルウェアのチューニングを頑張ってくれて最終スコアは4000弱で落ち着きました。
KPT
- Keep
- setup.shという名の再起動スクリプトまとめを用意していたので、常に同じ条件でベンチが回せた
- Program
- ピヨってしまった 場数が足りてない
- 2時間も同じ問題に悩んでいた
- アプリ1人はきつかった
- Try
- 諦めること