プログラミング

ISUCON10予選にGoで参加した(敗退)

昼ごはん

こんにちは、ISUCON10予選に さんぽしさん とささん と参加してきました。ISUCONに参加するのは初めてで、結果として敗退してしまいましたが終わってから考えると惜しいポイントがいくつもあり非常に悔しいです。

リポジトリは こちら

さんぽしさんのブログは こちら

とささんのブログは こちら

事前練習

7月から月に1回くらいチーム練習をしました。環境構築がめんどくさかったのでConohaのAMIを使ってISUCON7,8に取り組みました。

初回はalp,pt-query-digestの設定やgit管理・取り組む流れなどを確認しました。2回目で少し問題にも取り組み,スコアが上がることに喜んでいました。3回目ではISUCON7の学生枠で突破できるほどのスコアを出すことができて「これはISUCON10でも予選突破ありえるぞ」とワクワクしていました。

ISUCON10予選

使ったツール

こちらのブログを参考にMakefileなどを準備していました。

当日の流れ

10:00

予選開始時刻が2時間遅れるとの事だったので様々なISUCON参加ブログを読み漁っていました。

12:00 チームで集まる

さらに20分開始時刻が遅れたのでレギュレーションを読み合わせながら昼ごはんを食べていました。

12:20 競技開始

競技開始したもののベンチが回らない・接続先IPがわからないなどでしばらく待機していました。

12:35(?) 実働開始

まずは ssh競技用サーバーにsshできるようにしてgit管理できるようにしたあと当日マニュアルを読みました。例年とディレクトリ構成が違ってどこでgit initするか迷いました(これがあとで効く)

13:10頃 ブラウザから動作チェックを試みる

当日マニュアルに記載されていたようにブラウザからサーバーにアクセスしたかったのですがなぜかエラーが出てしまい接続できませんでした。sshdの設定を見るとtcpPortFowardingがコメントアウトされておりyesでもnoでもない状態だった気がします。必須じゃないので早めに諦めました。

13:30頃~15:30頃 改修を始める

環境がある程度整ったので改善に取り組み始めました。なぜか「pt-query-digestの結果が出力されなかった&ベンチが安定して回せなかった」ことからとりあえずalpとpprofの結果をみて進めることにしました。

pprofを見る感じjsonを返す処理とsearchEstatesが遅いようでした。まずはsearchEstatesのページングをlimit,offsetを用いるのではなくシーク法を用いるように回収しました。 その時のプルリク

15:30頃~16:20頃 indexを貼る

原因はわかりませんが1回だけpt-query-digestが走ったそうなのでそれを見てindexを追加しました。 プルリク

100点くらいは上がった気がしますが対して上がらずうーんとなる。

16:30頃~18:30 jsonをeasyjsonを用いて返すようにしていく

searchEstatesを改修したのにもかかわらず全くスコアが伸びないどころか少し落ちていました。この時はチーム内でsearchNazotteがボトルネックぽいからここが治らないと上がらないのでは?と言っていましたsearchNazotteはとささんが継続的に取り組んでくださっていたので任せていました。

まだベンチが安定して回せず十分な分析が出来ていませんでしたがおそらくJSONを返すのが遅いだろうということでechoのデフォルトではなくeasyjsonを用いて返すようにしました。具体的な手順はQiitaにまとめたのでみてください -> 記事

JSONにしてるのがどこかわからないほど改善されたっぽいです。これは間違いなく上がっただろwって思ってたのに微々たる上昇しかありませんでした。とささんがsearchEstatesNazotteをバグらせずに実装してくれたのに流石にこれはおかしい。ベンチも回せるようになっていたのでベンチを回しながらtopコマンドで見ていたところDBのCPU使用率が100%に張り付いている。これじゃん!!って思いDBの負荷を減らす方向へチームが動き始めました。

この辺りでさんぽしさんがapp1 db1の複数台構成をやってくれていたのでまぁcpu使用率も下がるだろって思ってました。

18:45頃 〜19:30頃 chairsのページネーションも改善する

getEstatesと同様にgetChairsもページネーションの効率が悪かったので改善しました。しかし全く効果が出ませんでした。DBへの負荷は多少なりとも減っているとは思うのですがほぼ効果が出なかったのは精神的にキツかったです。

19:30頃 サーバーを消し飛ばす

今までデプロイはさんぽしさんに任せていたのですが複数台作業中だったので3番目を使って僕が入れようとしました。git管理を/home/isuconでしていたためgit pullできずどうしたものかと悩んだ末に /home/isuconをmvして/home/isuconにcloneしました。(最悪) これにより .sshフォルダがホームディレクトリから消え去りログインできなくなってしまいました。これに気付いたのはログアウトしてからでした・・

20:00頃〜終了まで MysqlやNginxのパラメータチューニング

そういえば秘伝のタレをまだ突っ込んでないことを思い出したので入れました。しかしほぼスコアが上がらず困惑していました。後から確認するとquery_cacheをコメントアウトしていました(本当に何で)これさえonになっていればワンチャン学生枠での出場はありえました・・・

とささんが無駄なクエリを消してくれたりさんぽしさんがchair関連を全てメモリに乗っけたりしてくれたんですがギリギリ実装が間に合わず750点くらいで終了しました。

終了後

終わった瞬間に chairとestatesのテーブルごとにDBサーバー分ければいいじゃん!!ってことに気づいてマジで後悔しました。DBを分けるという発想は出ていたものの実装が複雑そうな気がしたので深く考えず逃げてしまっていました・・

悔しいポイント

  • DBのクエリキャッシュをonにしてたらわんちゃんあった
  • DBを複数台構成にしてたらかなりあった

最後に

とても悔しい部分が多くて昨日に戻ってやり直したいです。一緒に参加してくれた さんぽしさん、とささんにはいっぱい迷惑をかけましたがすごく楽しかったです!! 来年は絶対リベンジする(来年とは言わず今年中にどこかの企業さん開いてくれないかな)