なっく日報

技術やら生活やらのメモ

ISUCON5に参戦して、想定以上に惨敗してきました!

9/26(土)にISUCONに初参戦してきました。

結果は、予選敗退。

内容的にも、思っていた以上にいろいろ上手くいきませんでした。

が、この悔しさを今後の人生に活かせるよう記録しておきたいと思います。

チーム構成

同じ会社のF氏と、8月まで同じ部署の同僚だったI氏、そして私。

全員アプリ寄りエンジニアで、インフラに強い人がいないメンバー構成。

F氏がOS寄り+MySQL、I氏はNginxとかフロント寄りミドル、自分がNode.jsでアプリごりごりという感じで行こうと話し合ってました。

選択言語

Node.js・・・まさかないとは・・・

ここで、3人とも触れる(と思っていた・・・)ということで、golangを選んだのが運の尽きでした。

チームでやったこと(なんとなくの記憶)

  • gorelic(newrelic agentのgolang用。サードパーティ製っぽい)導入→失敗
  • MySQLにインデックスを貼る → ここら辺が一番効果大きかった。Maxで1800ほど行った
  • 静的ファイルをNginx配信に変更 → あまり効果なし
  • CSSをdocument.writeに変更 → fail
  • カーネルパラメータ変更 → あまり効果なし
  • Nginx外してみる → あまり効果なし。golang実装でログが出ないので、戻した。。
  • gorilla/mux → httprouterに変更 → あまり効果なし
  • entries Redis置き換え → 間に合わず
  • usersインメモリ化 → あまりスコア変わらず
  • relationsインメモリ化 → 効果ありそうだったが、fail。19時まで粘ったが、時間切れ

敗因の分析

ボトルネック特定は最初にするべきだった

わかっていたんです。

わかっていたつもりではいたんですが・・・本番となるとできないものですね。。

newrelicに期待し過ぎたのが甘かった。

Node.jsでの事前検証で、

  • どのAPIが遅い
  • どのテーブルへのCRUDが遅いか

ぐらいは取れたので、これでいける!と思っていたのですが、gorelicだとnewrelicのダッシュボードにデータがなぜか出ませんでした。

gorelicの調査で、無駄に2時間くらいは費やした気が。。

しかも、golang実装はアプリのログがほぼ出ない! + Nginx外したせいもあり、ますますボトルネック特定が困難に。

最終的にNginxを戻して、I氏がNginxのアクセスログを手作業で集計して、あたりを付けてくれたので、手をつける箇所がある程度把握できました。

が、一番最初にこれをやるべきだった・・・ソースも3人で最初から読むべきだった・・・・

golang

1年くらい前に勉強してました。

が、プロダクトとかで使ったことがあるわけでなく、いざ書いてみると全然書けませんでしたwww

自分がアプリ触るのを諦めるなら、Javaという選択肢もあったし、

自分以外触れなくなるけど、Perlでも良かった。

RubyPythonも全員触れなくはなかったし。。

言語選定、個人的には一番後悔してます。。

次回があれば、活かしたいこと

  • ボトルネック特定するまでどこにも触らない。APIのエンドポイントをボトルネック順に潰していく
    • そのためにボトルネック特定するツールをちゃんと準備しておく(1つのツールに頼らず、第2、第3の選択肢も・・・)
  • Perl, Ruby, Pythonのいずれかを書けるようにしておく(Node.jsの実装が準備されることはもう期待しない・・・)
  • MySQLの復習

最後に

それでも、とても楽しかったし、今後の仕事にも活かせそうな気がします。

参加して本当に良かった。

チームのみんな、お疲れ様!

運営の皆様、ありがとうございました!