ISUCON7予選参戦記

今年もISUCON予選参加したよ!

isucon.net

 

結果は「73位 49,956 kstm[学生]」でした!

isucon.net

学生枠での予選突破です!三年連続!!

 

チーム紹介

去年までと全く同じです。

馬(Goryudyuma) : DBとアプリケーション担当

ふぉの(fono09) : インフラ担当

あーちゃん(bgpat_) : アプリケーションと全体指揮

 

やったこと

前日まで

Pixiv-isucon,ISHOCON1を個人で、ISUCON4予選をチームでやった。

今年は前日に練習会やるなんて暴挙はしないで、ちゃんと時間を取ってやったので、その時に得た知見を深掘りして調べることができたので、本番に活かせたと思う。

前日

大学の学園祭だったので、終わってから打ち合わせ。

今年も不測の事態を除いてGolangを使うこと、誰がどこを担当するかを改めて確認した後、やることリストを作っていった。

やることリスト、去年まではTrelloを使っていて、あれはあれで便利だったが、今年はGitHubのProjectを使うことにした。僕たちのチームで使う用途であれば、どちらを使ってもそんなに変わらないので、コードの管理まで含めてGitHubに任せてしまうことにしました。ちょうどサークルのGitHubのチームが、Privateリポジトリ無制限に使えるしね!一応公開してあるので、参考になるかも?

github.com

全部Issueとして立ててあり、それぞれ仕事ごとに担当者に紐づける的な感じでやってます。

もう大体Doneに移っていますが、ほとんどmustかshouldに入ってる状態でスタートしました。

それから、マイルストーンを使っての管理もできればってあーちゃんの提案により、一応全部どこかに所属するようにしました。これはあんま使わなかったな。

結論から言うと、このリスト、あんま活用できませんでした。

後で書きますが、みんなかなり慌ててしまって、更新をあまりしないで突っ走ってしまったため、Doneに入っている多くが、競技終了後に更新したものです。

この方法自体が悪いと言う訳ではなく、もっと冷静にやれば、きちんと活用できたのかなあと。

去年までの知見になりますが、本番中は「あれ、この後どーするんだっけ」ってなることが結構あったりして、そんな時に事前にやることリストを作っておくことで、スムーズに次にすることを始められたりします。しかし、今回みたいにやることがすでにわかっている(ができない)場合は、あまり活用できなさそうだな〜ってなりました。あるに越したことはないので、本戦もこれ作ります。

それからふぉのさんとあーちゃんに買い出しにいってもらい、モンスターを仕入れてもらった。ご飯炊いた。

当日

開始前

あんま寝れなかった。まあ仕方ないね。

朝から雨だった。台風の影響。

ジュースとお菓子などを買い出しで仕入れて、ご飯と鯖缶食べながら本番まで待機。

開始

三台構成にちょい慌てる。

サーバー3でDBが動いていたので、僕が担当することにした。mysqlだったので、slow logを入れる。とりあえず遅いところから順にインデックス貼る。そんなに点数伸びなかった。

ふぉのさんがfail2banに引っかかって、ログインできないとか言ってた気がする。なんとかしたあと、fail2ban消した。

画像がDBから配信されていることに気づく。サーバー1に入り、画像をファイルに書き出す。僕の仕事は書き出すスクリプトを書くまで。あーちゃんに渡す。

画像をgzipで配信するなど、やってたらしい。でもまさかCDN的なものが前段にいて、Cache-Controlに publicをつけなければいけなかったとは最後まで気付かなかった。

SQLでIFNULLが使われてて、ここどうにかしようと頑張っていたが、結局最後までできなかった。見た目上動いているように見えるまでは行ったけど、ベンチマーカー曰くなんか数字がおかしかったらしい。

帯域が明らかに足りてなかったので、サーバー構成を変更し、サーバー1とサーバー2でapp、サーバー3でDBと言う構成にした。少し早くなったが、キャッシュ関連がうまく設定できてないので、ブレイクスルーにはならなかった。

画像が投稿されたら、gzip圧縮して静的ファイル保存場所に保存するように変更。とにかく重たい画像をDBに保存させないようにした。

この辺でgitの歴史を戻した際に、コミットしていなかったソースコード大部分が損失。全てを一つのgitで管理していた(/配下をgitに沈めて全てをignore,必要なものだけgitに入れていく方針を試していた)のだが、別のところで歴史を戻そうとすると、全てに影響があると言う状態の上で、コミュニケーションエラーがおきた。仕方ないので、もう一度書き直した。方針自体は(三人程度の小さいチームで全員顔合わせてる状況でしか使わないのなら)悪くないので、うまく運用時のトラブルが無いようにしていきたい。

最後はガチャ回す。6万点弱から3万点弱の間でめっちゃぶれてた。5万点弱のスコアが出て、時間もなかったので終了した。もちろんふぉのさんが間違ってEnqueueしないように、PCから離れる、キーボードやマウスから手を離させるなど、万が一が起きないように徹底した。

終了

ISUCONの時間が後ろに移ったので、休憩なしでコドフェス予選C開始。あんま解けなかった。D問題の考察思いついて、実装でバグってる時にISUCON本戦出場が決まって、コドフェス本戦がISUCON本戦と同じ日にやるので離脱した。仮にコドフェス通ってもISUCON行くので、行けない上に、8時間フルで頭動かしててとても疲れてたからだ。結局後から見ると考察はあってたっぽくて、頭がきちんと働いて入ればDまで行けたかも?って感じだった。

選挙解説見ながら(もちろん期日前投票済み)ビール飲んで、朝方家に帰って、今回のISUCON予選を終了した。とても楽しかった!

(今回はきっちりログを残していなかったので、かなりアバウト。今まではコミットにやったことを残していたのが、今回から運用方針が変わったのでちょっとやりづらくなった。でも今まで通りコミットにメッセージとして残していても問題は多分起きないので、本戦はきっちり残すと思います。)