ISUCON9予選に参加した話

こんにちはhelloooです。弊グループのアドベントカレンダーを埋めるネタが思いつかなかったので9月に参加したISUCONについての振り返りをしようかなと思います。

ISUCONとは

ISUCONは2011年から行われているコンテストで、課題となるアプリケーションを最も性能が出るように修正したチームが優勝というコンテストです。

チームについて

大学の友人たちと一緒に参加しました。言語はチームメンバーの2/3が慣れているRubyで参加しました。チーム構成はインフラ:1名,アプリ:2名で行いました。 実際に編集したコードはこちらです

取り組み

使用ツール

実施内容

N+1の解消


ベンチワークを回した結果GET /new_items.jsonが遅すぎたのでslow queryを消すことに。一つ一つ修正していくとスコアが上がっていた。
Seller_list buyer_listについても同様に修正def get_category_by_idの修正に合わせてfixを行う。
indexを張る作業も同時に行っていた。

1台構成を3台構成に変更


初期起動時は1台構成であり、web + app + dbがすべて一台で起動されている状態なので

  • 1台目:WEB+APP
  • 2台目:App +DB
  • 3台目:APP

の構成に変更した気がする。

nginx.conf・mysqld.confの設定修正


キャッシュ周りを主にやってもらった記憶がある...

わかっていたが対応できなかったもの


  • 外部API呼び出し
    • 明らかにボトルネックになっていることはわかっていた。
    • 「非同期処理にすればいけるでしょー」と思っていたが、他に影響あるか確認したりするコストが発生する上、Rubyでの非同期処理ってどうやるかをぱっと思い出せなかった。
      • Sideiq? Delayedjob? 言い訳ですがgoroutineで書きたいしGoですればよかった
      • ThreadとかFiberでもよかったのかなぁ
  • 1: db 2:app 3:app構成
    • 一度実施したが、画像のURLが違うというエラーが発生。画像アップロードを含むエンドポイント/sell/uploadを片方のAppに流すようにしたが解決せず。
      • 今でもなんでだめなのかいっちょんわからん

反省・所感

  • N+1については修正までのフローが去年に比べ早くなりスコアが上がりやすくなったと感じています。 ただindexについては感覚でやっていることがあり、もっと知識をつけるべきだなぁ
  • 方針についての判断を早くすべきでした。対応できなかったものについてどちらも中途半端に取り組み結果が出ずに終わりました。どちらに取り組むかを決めて動いていれば本戦のスコアに届く未来があったと思うと悲しみが深いです。
  • Rubyでの非同期処理について少し学んで起きましょうね!!!!!

終わりに

順位は161という形で終わりましたが去年よりも順位を上げているので成長はしているのかなぁと思います。 ISUCONは業務ともつながりが深く誰もが楽しんでもらえるコンテストですので社内開催をしても面白いイベント&技術力向上になると思いますねぇ....