詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

ISUCON7本戦で3位でした(ソン・モテメン・マサヨシ)

いろいろあって、本戦からだいぶ時間が経ってしまいました。チーム全体としての流れはSongmuさんが書いてくれているので、自分の視点でどうだったかな〜というのを時系列を無視して思い出しつつ書きます。

チームは、会社(はてな)の同僚で組んだ Songmu, masayoshi, motemen の3人。全員の名前からとって「ソン(ムー)・モテメン・マサヨシ」です。おしゃれ。リポジトリはここ

本戦の問題は Cookie Clicker をモデルにしたもの。競技の開始まですこし時間の余裕があったので、その間にオリジナルをプレイして、アプリケーションの仕様を学習した。話題になったときに遊んでなかったので、このとき初めてやったんだけど、たしかに中毒性がありそう……。

Cookie Clicker のほうは放置しつつ方針の相談。まあルームごとにサーバを割り当てて、オンメモリでやってく感じだよね、というのですぐに落ち着いた。ソースコードを読んだところ、ゲームのコア部分がえらく複雑そうで、ここはあんまり触りたくないなあという気持ちになってしまった(これがよくなかった)。

ともあれ MySQL の仕事をなくしていこう、ということで、効果はとくに期待せず、まずは肩慣らしにアイテム情報をハードコード。たしかその間に Songmu さんがルーム名のハッシュ値から振り分け先のサーバを決定するロジックを書いてたと思う。このとき Songmu さんがなんか単語をド忘れしてたらしく、「サーバをアレにする」「アレですよね」みたいな会話をしたんだけど、ちゃんと意図が伝わってたので面白かった。

想定どおり振り分けでスコアはあがるんだけど、ベンチマーカの振り分けが偏ってしまうとスコアに大きく影響があるので、競技中はもっぱら1台構成でスコア測定を安定させ、最後に4台構成でバーンとスコアを上げるという作戦をとった。あとサーバの振り分けも最終的にはラウンドロビンになった。

さて MySQL やめてオンメモリにするか、と考えていたころに masayoshi がアプリケーションがボトルネックですねー、と教えてくれたので、ついに出番だ! ということで go-torch によるプロファイリング を仕込んだ。予選のときも pprof と go-torch だけは使い方を覚えておこう、と準備していたものの出番がなかったのだ。結局アプリケーションのボトルは解消できず、MySQL は最後まで残った。

プロファイリングしてみると calcStatus と、その中の math/big 周辺の処理の重いことが見てとれたんだけど、ここでけっこう停滞してしまった。calcStatus をなんとかしないことにはスコアが上がらないことはわかっているんだけど、時間のかかる取り組みになることも見えていて、躊躇する気持ちが勝ってしまっていたのだと思う。例えばキャッシュを入れたとして、ここでロジックを壊してしまったときに検証するのが大変そうだなーという思いが先にきてしまうという……。

結局有効だったのは、クライアントからのアクセスごとにいちいち getStatus するのじゃなく、ルームにつきひとつだけ getStatus 計算用の goroutine を用意して、それを各クライアントに配るような形にしたことだった。これで math/big 周りの呼び出し回数を少し減らすことができ、スコア増につながった。最初チャンネルの close など雑に書いていたらリークしまくってたけど、おおむねすんなり実装できたのでよかった。

ちなみにこの方法は methane さんにコメントをもらっていて(Songmu さんの記事に対して)、

なるほどたしかに。もうちょっと周辺のコードを見ておけばよかった……。そういうコード理解の低さが今回の伸び悩みの原因だったなと思う。

閑話休題。あらためてプロファイリングすると、今度は GC の占める割合も大きくなってきていた。この時点で残り時間も心もとなかったので、パラメータ調整だけで容易にスコアの伸びが狙える GOGC 調整に手をつけはじめた。これは最初 GC 切ってみたらめちゃくちゃスコアが下がって(だったか、リソースを異様に食うようになったのだったかで)大笑いしてしまった……。GC 頻度を減らすことで、これでもそれなりにスコアが伸ばせた。

再起動後、ベンチガチャをしていたらいい点数が出たので各自ブラウザを閉じてフィニッシュ。個人的には最高順位の3位だったけど、賞金獲得はならず。終わってみるとやはり calcStatus がキモで、そこに真正面から取り組む気持ちを持てたかどうかが勝敗の分かれ道だったなー、と思った。しかしキャッシュ入れて fail したチームも多かったみたいで、難しい選択には違いなかったのだと思う。

今回の ISUCON は予選からすごく楽しませてもらったし、そのぶん運営は大変だったと思います。こんなイベントが年一で体験できるのは運営の皆さんのおかげで、感謝しかない。お疲れさまでした。そして来年も100万円ほしいでしゅ!

はてなで一緒に働きませんか?