読者です 読者をやめる 読者になる 読者になる

ISUCON6予選 negainoido 参加記

チームnegainoidoで参加して二日目の一位、全体三位で予選通過できました。

isucon.net

チームメイトは自分とflowlightさん, tailedさんで出ていました。

我々のチームは型チェックがあり、速度も速そうという理由でgo実装を選択しました。

事前にpixivの準備イスコンで練習したりしてましたが、その時はflowlightさんが環境のセットアップ直後に寝落ちするハプニングもあり、なかなか心配でしたが、今回は大丈夫でした。

時系列

まずはインスタンスをセットアップして、ルールやアプリケーションの内容を確認しつつ、既存実装をリポジトリに放り込みつつ、goのpprofとnginxのログをかませてベンチマークを走らせるということを目指しました。

最初のベンチマークを投げるまでに、emacs、goのインストール、goの初期実装を修正するパッチが公開されていたのでそれの適用(手動でやったら一箇所間違っていたため後になってtailedさんに怒られました)、既存実装をbitbucketのリポジトリに突っ込む、go 1.6だとcontextがないとかでコンパイルが通らなかったので

GitHub - kaneshin/goenv: Golang Version Management

で1.7.1を入れる、自動起動するアプリケーションを切り替える設定をするスクリプトを書くなどやっていました。

起動したインスタンスの挙動を探るのと前準備で1時間くらい使い、最初のプロファイラを取ったのが11時くらいで、その時点で順位表には4000点ぐらいのチームがすでにいたように思います。

goの初期実装ではベンチマークでポジティブスコアが出ていないようだったので、ベンチマーカーのメッセージとプロファイラ結果を頼りに直す必要がある部分を探すと、htmlifyがものすごく遅いということだったので、それをまずgo上にキャッシュしようという話になりました。

 

正規表現結果を自分がキャッシュしようとしているあいだに、tailedさんがstrings.Replacerというものを見つけてきたので、それに置き換えた所、トップページを表示するパフォーマンスがかなり改善し、その時点(13:30くらい)で11991点を取れていました。

その後Replacerをentryの変更が合った時だけ更新することで、一気に75310にまでスコアが伸びました。ただ、ベンチマーカーがエラーメッセージっぽい出力を出しており、そのへんは大丈夫なのかどうなのか運営に質問したりしていました。(14:12くらい) 

また、キーワードをエスケープされたURLに変換している場所もそこそこ時間を使っていたので、その部分もキャッシュするようにして87149点(15:05くらい)

starテーブルのkeywordにindexをはって、98248(15:46くらい)

topページでreplacerをループの中でキャッシュから引っ張りだそうとしている部分を外にだして104482(16:22くらい)

 

このへんで、いったん再起動のテストをしていたと思います。

 

keywordを取る前にキャッシュをチェックしていたのですが、keywordを取ってきた後、strings.NewReplacerをする前にもキャッシュをチェックすることで116164(17:14くらい)

他にもいろいろとreplacer部分を速くできないかいろいろ試してみたのですが、そこまで早くならず、一番効いたのは、チームメイトが行ったentryを変更するpostがきたらsleepを入れてreplacerの構築回数を減らすというようなことでした。1秒sleepを入れて164224(17:31くらい)になった時は全員声がでかくなっていたと思います。

その後sleep2秒を入れて173451(17:33くらい)。

 

その後2回くらいベンチを回して再起動後のインスタンスで172427が出た時点でお祈りフェイズに入っていました。

この変更によってhtml/template がボトルネックになっていたようなので、text/templateに置き換えて早くしようとしたのですが、コンパイルエラーが出て、バグったら時間内にロールバック出来ないかも知れないと思い、自分は断念しました。

 

予選終了後、我々は参加場所がバラバラだったので、チーム内打ち上げをやっている人達をうらやましく思いながら、自分は一人で祝杯をあげてました。

感想

3人とも別々の場所に居たのでハングアウトとslackを使ってやり取りしていたのですが、距離の問題なのかマシンスペックの問題なのか、時々音声が途切れて厳しい感じでした。

10回に1回くらい「すいません、聞こえなかったんですけどなんですか」とか言いあっていたように思います。画面共有が無かったら死んでました。

ベンチマークはpassと表示されていてもwarningのようなメッセージが出ていて、それは許されているのか、ベンチマークの意図せざる挙動なのか分からず、対策すべきか否か自分は結構悩みました。運営に質問したのですが、すぐに返事がもらえずにもんもんとしていたように思います。

 

去年は学生枠で本選に行かせてもらったのですが、今年は社会人枠で、その枠も減ってしまったので、予選前は本選に行けたら上出来くらいの気持ちだったのですが、蓋を開けてみたらチームメイトが的確な改善をしてくれたお陰でとても良い結果が出て、参加してよかったなと思いました。

去年の本選では改変を加えたがためにシステムテストに通らず、座るだけだったほうがマシな感じでしたが、今年は本選でもポジティブスコアを取れたらいいなと思います。

 

ISUCONの運営は毎年なかなか大変そうですが、楽しませてもらいました。ありがとうございました。