ISUCON7本戦で人権を失いました(1年ぶり2度目)

こちらは RCC OBOG Advent Calendar 2017 - Adventar の1日目の記事です。

このadvent calendarは1, 2, 3日目が空席の状態で始まってしまう悲しい立ち上がりとなってしまいそうだったので急遽昼休みの時間を使って記事を書いています。 @pg_mot です。

今日はISUCON7本戦参加してきた話を書こうと思います。

予選突破の様子はこちら

programmermot.hatenablog.com

本戦問題については本家にて公開されているのでこちらを参考にしてください

github.com

競技としては、某クッキークリッカーのマルチ対応したゲームで、クリックする対象は椅子という感じです。Chair Construct Online。 Websocketによる通信が常時行われており、各クライアントは椅子のクリックイベント、自動で椅子を生み出すアイテムの購入情報を送ってきます。 それをサーバサイドでうまく計算してWebsocket越しにクライアントに返すというゲームでした。

競技開始直後

最初は気軽にWebsocketね〜と思っていましたが、ゲームについて説明がなされた際に気になるボタンがありました。 f:id:programmerMOT:20171201122412p:plain はて5000兆って何ビットで入るっけ? 🤔、、、、エッ完全に嫌な予感がするぞ。となる。

とりあえず落ち着いてドキュメントを読んだりコードを読んだりプロファイラを仕込んで様子を見たりするところからはじめました。

プロファイラ編

いつもどおり abcang くんがプロファイラを仕込んだところうまくプロファイリングができないという問題にあたりました。 クライアントとサーバはWebsocketでつながりっぱなしなのでHTTP一発の通信などを想定して行うプロファイラがうまく動かずここでチームは早くも動揺してしまいます。

一部のプロファイルは取れなくもない状態だったので、そこから重いところに手を付けながら作業開始となりました。

アプリにやったこと

  • アイテム定義を毎回DBから読んでいたのをアプリ側に直接書いて読むようにした
  • Websocketを処理するサーバを分散するように最初のロビーサーバの実装を変えた
  • 現在時刻の取得をDB介していたのをアプリでやるようにした
  • むだなeach loopの削減(abcang)
  • 計算した椅子の数の結果をDBで保持するように(syusui)
  • Redis導入してそこにデータを置く(syusui)

結果

12009点で30組中18位という結果になりました。結果としては残念なものになってしまいましたが、昨年の本戦ではなんと初期実装点数を下回るという最悪の状況になってしまっていたので、少なくとも改善ができるようになったというのは成長できたのかなと思っています。

リポジトリはこちら gitlab.com

感想

今回の問題は基本的にアプリ側に課題が集中しており、nginxやMySQLなどのチューニングに一切手を出さずに終わってしまいました。 そうなるとミドルウェアとかそのあたりが得意な僕とabcangくんはかなりやることが減ってしまい、syusuiくんにはかなり負担をかけてしまったと思います。 この辺はアプリ実装力をもっと固めていく必要がありますね。

当初からRuby一本でやっているチーム新卒ですが、競技開始時に今回の課題的にもしかしてRubyがきついのではないかという議論が発生しました。 NodeやGolangに切り替えるという方針もあったのですが、 我々のチームはRuby以外の経験があまり多くなく、ここで言語を変えるのは危険すぎるという判断と、 メタ推理として言語に差のある競技はしてこないであろうというところから今回もRubyを選択しました。

ISUCON7 本選の利用言語比率 : ISUCON公式Blog

終わってみて使用比率を見ると半分以上がGolangになっているのをみて、Golangもちゃんと勉強しようなという気持ちになりました。

競技後の講評で、まずガッとオンメモリ化するという解法が示されていました。 これまでチームの戦略として必要になるまでオンメモリ化はしないという戦略を多く取っていました。 オンメモリ化にはかなりの労力を要することから、これは必要だというプロファイルが取れるまで取らない戦略でした。 しかし今回プロファイラがうまく動かずに動揺してしまいかなり保守的に競技を進めてしまいました。この点ドラスティックにやっていける胆力と経験をもっと積まなくてはなと思いました。 また当初危惧していた5000兆脚ボタンについて、危惧していたにも関わらずここの多倍長整数が足を引っ張るぞ!と思い至れなかったのは本当に実力不足だと思っていて本当に悔しいです。

今年の本戦も昨年に引き続き自らの新たな課題を見つけることができました。 全体としてアプリ実装力がとても低いということに気がつけたので地道にコードを書いていきたいと思います。

来年も開催されるのであれば本戦出場したいです。ちなみにチーム二年目は未定でそろそろ人も変えませんかという話をしているので、一緒に出てくれる人を募集しています。

最後になりますが、ISUCON7運営の皆様、本当にありがとうございました。

RCC OBOG Advent Calendar 2017。明日の2日目は asakuraくんが書いてくれました

あさくら日記 — マストドンを改造してアンケ機能を付け加えた話