Edited at

ISUCON 5予選に初参加してきた チーム名「Kossyとなかまたち」

More than 3 years have passed since last update.

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コードを読んで仕様は把握に努めてた。

この時点で relationsfootprints は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


    • 諦めること