ISUCON10本選に参加して4位でした!

Finatextでエンジニアをしている石橋淳志(@bashi0501)です。
9月に行われたISUCON10の予選を突破して(ブログ)、先日行われた本選に出場してきました。
チーム名は 一口坂46 です。オフィスの前の坂の名前です。

結果としては、31342ptで4位(本戦の結果発表)でした。今回は上位3位を学生チームが独占するという波乱が起きて、一応企業チームとしては1位でした(笑)なんとか3位に食い込んで阻止したかった…

Image for post
Image for post

リポジトリ

https://github.com/s-tajima/isucon10f-hz46

やったこと

チームとしてやったことは各メンバーのエントリを見てもらうとして、僕のやったことだけさくっとまとめときます

とりあえずNewRelic入れる

予選と同様にGoの参考実装はechoが用いられていました。ただ予選はecho v3で本選はv4だったのでちょっともたつきましたが、まぁ無難に

benchmarkサーバのコンテスト開始時刻をキャッシュ

ベンチマークジョブを受け取る度にコンテストの時刻設定情報をDBから取得していたのをメモリに乗せる

参加者の質問一覧表示でN+1を解消

シンプルにチームの取得をwhere inで取得するように変更。ちょっとsqlxのwhere inの書き方でごたつく…

管理者の質問一覧表示もN+1を解消

こちらも同様

質問の回答通知でもN+1解消

送るべき通知の取得をwhere inで取得するように変更

DBの接続設定やログOFF、NewRelic外す

そのまま

出来なかったこと

上のやったことだとちょっと少ない感があるのですが、3時間くらいやって結局うまく行かないことがありました。。

本選はセッション管理があり、その周辺でリクエストごとに参加者情報の取得、チーム情報の取得、チームに所属している参加者の取得、コンテスト時刻情報の取得、あたりが都度DBから取得されていました。これらはチーム登録フェーズを終えてコンテスト開始した後は変わらないので(たぶん)、開始時刻以降はメモリに乗せるように変更しました。

が、「招待URLが不正です」とかでうまく通らず。。全方位に効くものだったので結構粘ったのですが、結局ベンチマークを通ることはなく断念。。ここは未だに理由がよくわかってない。。

また、本選の問題はボリュームが大きくてアプリケーションで手をつけれてない部分がまだまだあったので、ある程度で諦めて撤退するという判断も誤ったかなと

チームメンバーのエントリ

https://gist.github.com/yami20/0dedc537f4baedecc54162867d9e298d

まとめ

データをメモリに乗せる担当としてはほとんど何も乗せれなかったのは悔やまれる結果でした。。

僕自身はISUCONへの参加は今回が初めてだったのですが、本選も出場できてKLab賞のポータブルモニタも貰えてかなり楽しめました!(KLabさん、ありがとうございます!)

来年はどうするかわかりませんが、どちらかというと弊社のインターン生や新卒でチーム組んで上位入賞してもらいたいなぁと淡い期待を…

最後に。ボリューミーで、センスのある工夫が埋め込まれていて、テーマとしても面白い問題を作成してくださったり、環境を提供してくださったりと運営の皆様は大変な数ヶ月だったと思います。
お疲れさまでした!ありがとうございました!

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store