ISUCON8に参加しました

みんなのウェディングのインフラエンジニア横山です。 今回は、ISUCON8に参加して予選敗退するまでの流れをお伝えします。
我々のチームの最終的な結果は以下の通りです。

全体138位でした。。
ISUCON8 オンライン予選 全ての順位とスコア

事前練習

去年、ISUCON7に参加したまさが、ISUCONは事前準備が大切と言っていたので2ヶ月ほど前から練習を開始しました。
練習に利用したのは以下のレポジトリです。
isucon7-qualify
当初は月曜の業務後に毎週集まり2時間程度進めていました。しかし、練習を始めるのが早すぎたためか次第にモチベーションが下がり集まりが悪くなるようになりました。
あまり早くから練習するのはモチベーションが続かないので直前に2~3回程度長時間行う方が良さそうです。
この事前練習の中でalpの使い方やISUCONの流れについて理解が進みました。

オンライン予選会当日

オンライン予選会なのでどこからでも参加できましたが、mixiさんに用意していただいた会場を利用しました。
@mixi_engineers
1チームに1台モニタが用意されており、15時にはおやつまで用意されていました。
来年もあれば利用させていただきたいです。 mixiさん最高でした。

チューニング内容

ここではチームメンバーそれぞれが行なったことについてそれぞれのメンバーがお伝えします。

横山(インフラ担当)

インフラ担当として大きく以下のことを行いました。

  • web/DBサーバの分離
  • alpを使ったログ集計
  • h2oからnginxへの置き換え

そのほかにもnginxでgzip onにするなどしましたが大きくスコアが変わることはありませんでした。
web/DBサーバの分離を行なった影響で/initializeの処理が行われなくなるなどトラブルに対応しているうちに時間がなくなり、3台あったうちの1台は全く使わずに終わりました。。
デプロイスクリプトを事前に準備しておくともう少し時間に余裕をもてたのかなと思います。
また初期実装がh2oだったことも驚きでした。nginxに切り替えなかったチームはどのくらいいるのか気になります。
全体的にはインフラ側で対応できることが少なかった印象です。

黒澤(アプリケーション担当)

今回の問題のテーマはチケット販売管理のアプリで、練習問題でやったISUCON7の過去問のように画像を取り扱う問題ではなかったので、SQLのチューニングとIOを減らすことを目標に取り組みました。
実際に進める時には横山にスローログを出してもらって、時間のかかっているリクエストを処理している箇所から改善を試みました。
geteventメソッドのN+1クエリでとにかくSQLの実行回数が多かったので、テーブルを結合するようにして解消しました。その後、テーブルにインデックスが設定されていなかったのでインデックスを設定しました。
他には/api/users/:idでget
eventの呼び出し回数が多く改善したかったのですが、力及ばずできませんでした。
普段RailsでActiveRecordを使っていると生のSQLが思ったように書けず、ActiveRecordの便利さと自分の実力不足を感じました。

まとめ

初めてのISUCON参加でしたが初期実装よりはスコアを上げることができて良かったです。
個人的には、普段の業務ではここまで時間に追われて対応することは少なく、非常に良い経験になりました。 また、周囲のエンジニアと自分の差分はなんなのかを考える意味でもたいへん有用だと思います。
予選問題が公開されているので、社内ISUCONもいずれ開催してみたいなーと思っています。
https://github.com/isucon/isucon8-qualify

この記事を読んで興味を持った方は是非来年参加してみてください!!