ISUCON6予選に参加してやったことと反省と感想

ISUCON6予選に学生枠で参加して予選通過しました!!

isucon.net

この記事では主に自分がしたこととか思ったことを書くので、 全体の詳しい話は@pg_mot先輩のエントリを見てください

programmermot.hatenablog.com

当日までにやったこと

@pg_mot先輩がISUCON5の予選のインスタンスを作ってくれてたので、 プロファイラを仕込んで動かしてみたり、 実際にチューニングをしてみたりしてました。

ISUCON5の予選問題はN+1問題がメインで、 必然的にデータベースやSQLのチューニングをすることになったので、 非常にいい勉強になりました。

当日やったこと

当日は主に以下のことをしてました

  • プロファイラの仕込み
  • Nginxの静的ファイル配信設定
  • キーワードリストをredisで管理
  • AC法で作成する木の生成回数の削減

ISUCON6の予選問題のデータベースは非常にシンプルで、 あまりデータベースやSQLのチューニングをすることはありませんでした。 (そりゃ似たような問題はでないですよね)

今回の一番のボトルネックはhtmlifyで、 チームメンバーの@syusui_sくんがAC法の実装することになったので、 アルゴリズムダメダメマンな自分はhtmlifyのアルゴリズムに関係ない部分の高速化を頑張ってました。

やったこととしては、 毎回データベースからキーワードの一覧を取ってきていた部分をredisから取ってくるようにして、 キーワードが増減するまで一度構築した木を使いまわすようにしました。 ただ、終了間際になってから複数スレッドで動作することを全く考えていない実装になっていることに気が付きました。

最初にredisにキーワードのデータを入れる処理は、 それぞれのスレッドで実行されてしまって確実に無駄でした。 また、構築した木はそれぞれのスレッドで保持されており、共有されていませんでした。 そのため、キーワードが増減した時に木を再構築するように書いていましたが、 キーワードが増減したスレッドが持っている木だけ再構築してしまい、 他のスレッドが持っている木はそのままという問題もありました。

なんとか他のスレッドにも反映させようと試みましたが、 気づいたのが終了間際だったため、結局この問題は解決できませんでした。 そのため、「○○へのリンクがありません」というメッセージが大量に表示される結果となりました。 しかし、多少リンクがなくても減点にはならなかったことが幸いして、 なんとか予選を通過できるだけの点数を叩き出すことができました。

反省点

一番の反省点は上に書いたマルチスレッド考慮できてなかった問題で、 本当に反省すべき点でした。 うーん、なんで念頭になかったんだろう…

他にも2点ほど反省点があります。

プロファイラの仕込みに時間がかかった

何故か30分ぐらい使ってた気がします。 bundleコマンドのパスが通ってなかったとか、 BUNDLE_FROZENが有効になってて手間取ったとか、 出力先のディレクトリが無いぞとエラー吐かれたりとか、 わりとしょうもないことで時間を取ってしまいました。

けれども、プロファイラを事前に使ってみて、 ほぼコピペでプロファイラを仕込めるようにしてたのは良い事前対策だったとは思いました。 (結局ボトルネックがあまりにも明白だったので、あまりプロファイラの出番はなかったですが)

アプリの全体像をあまり把握できてなかった

開始直後はみんなでコードとか読んでいこうって話でしたが、 前述のようにプロファイラを仕込むのに手間取ってしまって、 あまり自分の目で全体像を把握することができませんでした。 チームメンバーからどんな感じかは聞きましたが、 やはり自分の目で見るのも重要だったかなと思いました。

基本的にボトルネックを探してそこを解消していけばいいだろうと考えていて、 さらにisutarのボトルネックを見抜けなかったため、isutarの改善は後の方になってしまいました。 それによって謎にリクエストが詰まる原因の発見が遅れてしまった気もします。 各自でコードとかを読んで、チーム内で情報共有や意見交換するのも重要だったのかなと思いました。

感想

ああすれば…こうすれば…とか散々書きましたが、 非常に楽しかったし、いい勉強になりました! リーダーボードに自チームの名前が乗った時はめちゃくちゃテンション上がりました!! AC法を実装した@syusui_sくん、 全体の指揮をしてさらにisutarボトルネックを見つけて解消した@pg_mot先輩、 感謝しかないです!

とにかく本戦に出場できることになったので頑張りたいです! 本戦対策の練習とかもしていきたいです。 あまりちゃんとredis使ったことなくて何ができて何ができないのかを知らないので、 そこら辺をちゃんと勉強して、本戦でささっと書けるようにしておきたいところです。 絶対役に立つはず、はず。 とにかく頑張ります。