ISHOCON2に参加して来たよ!
ISHOCON2に参加して来ました!
ISHOCONとは、@showwinさんが個人で提供していらっしゃる、ISUCONライクなコンテストです!チームプレイ推奨な本家ISUCONやその他企業コンテストとは違い、ターゲットは個人プレイなので、問題量もかなりライトに作ってあって気軽に挑戦できる割に、かなり奥深く作られているので、どんどんやるべきことが出てくる、点数もどんどん上がるという、やってて楽しいかなり面白いコンテンツになっています!
結果
今年も去年のISHOCON1に引き続き二位でした!
方針選定
まずは言語選定ですが、今回はひたすら楽しむ、遊ぶってことを目標にしていたので、勝つ目的で選んでいるGolangを使わずに、Crystalで挑みました!
Crystalって、僕の中で今かなりアツい言語なんですよ!Ruby文法な点が実はそんなに好きではない、ってこと以外は、型の扱いとかとても面白い上に、とんでもなく早く動いてくれるので、超オススメの言語です!
問題文やベンチマーカーを事前に読んでいたので、方針は行く前から決めていました。それは、「GETが来たらそこでHTMLを生成してNginxから返す、POSTが来たら生成したHTMLを全部消す」って方針です。
今回のISHOCON2では、ベンチマーカーは主に三つのフェーズに分かれています。
一つ目は事前テストフェーズで、きちんと想定通りの動きをしているかチェックされます。
二つ目は投票フェーズで、ひたすらPOSTがくるので、情報の更新を捌ききることができるかを問われます。
三つ目は確認フェーズで、ひたすらGETが来ます。ここでは情報の更新は起きないので、どれだけ大量に返せるかが問われています。
なので、POSTを高速に捌いた上で、GETは一回だけ生成してあとは静的配信に任せるってことをしました。
当日
朝起きて、泊めてあげた大学の友達と一緒に会場に行きました。
いつの間にやらCTOになられていた@showwinさんと会えました!
問題文やベンチマーカーなどは、事前に読んでいたので読む必要はほとんどなく、競技開始した直後は、環境チェックなどをしていました。
ベンチマーカーの挙動をある程度知っているので、まずはNginxにHTTP2を喋らすようにしました。
それから、cssをNginxから返させるようにしました。
そのあとは、Cystalでファイルを生成する方法を調べたりして、indexに来るGETリクエストを静的に配信できるようにして6万点超えで一位に、workloadを20まで上げて9万点まで上がりました。
そこでお昼ご飯、今回もとても美味しいお弁当が支給されます!
workloadが20程度では、CPUを使いきれていなかったので、上げられるように申請しました。
正直ここで、かなり余裕を持って一位を取っていたので、ガンガンやるのもなーってナメた感じでいました。実は事前に自分でやった時、計18時間くらいかけて5万点超えして終わってたんですよね。初見だと気付けない点も多かったし、後から考えれば方針もミスってたっていうのはあったんですけど、そこそこ自信がありました。
なので、すでに事前にやった点数の倍取れていて、さらにworkloadの上限が解放されれば、(ベンチマーカーの実装や挙動を知っているので)さらに点数が上がることを知っていたので、少なくとも競技時間内に、他の参加者で勝てる人いないんじゃないかなーって思っていました。
お昼からworkloadをいじったり、ちょっとした点数にほぼ関係のない変更をして、誰も伸びて来なさそうに見えたので、Service化とかしてました。実は15時頃時点での僕のコードは、ちゃんとSystemctlで再起動とかできたり、再起動時にmysql.serviceより後に起きて来るようにしたりとかして、今回は求められていない再起動試験があったとしても実は通るっていう変更とか入れてました。
悲報として、workloadを上げるとベンチマーカーが完走しないという問題が運営側で発生しており、何も変更しなくても点数が上がるというのは無くなりそうってことが判明しています。
その後、少しだけやる気が出て来たので、bootstrap.min.cssのgzip配信するようにしてみたり、index以外の他のGETに対してHTMLファイルを生成してNginxから返すようにしたりしていました。その結果、13万点くらい取れて、流石に大丈夫だろうと思っていました。(フラグ)
投票数のループをちゃんと数でもつ変更を入れると19万点まで上がったりしたくらいで、比較的まったりと過ごしていました。
オフィスから山手線と湘南新宿ラインが見えるのが本当にいいと思いました!
そうしているうちに、takonomuraさんが14万点を記録し、一気に追いつかれ出しました。「あ、これはまずい」と思いました。
本格的にISUCONすることを決意(←遅すぎ)、とりあえず投票データをメモリに持たせる変更を入れようと思いましたが、集計あたりがめんどくさかったので、ユーザーの投票数だけをオンメモリ化、その他メモリに乗せられるところは乗せたりしてたんですけど、結局この辺りは一回静的ファイルとして生成した後は必要ないので、そこまで効果は出ず、またINSERTを消すところまで行けなかったので点数も本当にわずかしか伸びず、っていう中途半端ところで終わりになってしまいました。
最後の方はCrystalのコンパイルが終わらない、vimが起動しない、なぜかインスタンスから追い出されて再度ログインできない、という謎の問題に悩まされていました。まあ競技なんで、不測の事態は起きますよね・・・。結局再起動試験は通るのか落ちるのかを確認できなかったこと、それからGitに残していたログをプッシュできなくなってしまったことが心残りです。ISUCON本番ではこのような問題が起きないことを祈りつつ、また自分の操作ミスでこのようなことが起きないようにしたい・・・。
その間にもtakonomuraさんは順調に点数を伸ばして、一位でフィニッシュされていました。
敗因?としては、慢心とそれに伴うやる気のなさ、後はエンジョイしようとして勝つ気が強くなかったことが挙げられます。はぁ・・・。
めちゃくちゃ楽しかったし、Golang以外でも全然勝負になるんやで!ってことも示せて、当初の目標は完璧に達成しているので、いいんですけどね〜。
その後は懇親会でお酒を飲んで、いろんな人とお話しさせていただきました。やっぱり懇親会は、ISUCONのメインイベントの一つですよね!同じ問題に取り組んだという一体感がすごい楽しかったです!
懇親会の後は、一年越しの焼肉に行きました!美味しかったし、とても楽しかったです!
さらに焼肉の後は、ISHOCON参加者の大学時代の友達と二次会?三次会?に行って、たらふく飲んで帰って寝ました。
前日まで
今回のISHOCON2には、実は事前にいくつかプルリクを送っており、マージされています。(なのでその過程で問題文や、ベンチマーカーの挙動などを知っていました。)
大きなものとしては、言語実装にCrystalとPHPとNodeJSを追加したりしてました。前のエントリにも書きましたけど、仕様のわかっているWebアプリを知らない言語で実装してみることは本当に勉強になりますので、オススメです!
僕がCrystalを使って、後一人NodeJSで参加してくださった参加者さんがいらっしゃいました。とても嬉しかったです!ISUCONではあまり使われないようなマイナー言語ばかりを追加しているので、実際に使っていただけるとはあまり思ってなかったので。
他の言語実装も、どんどん増えることを期待しています!
それから大きいプルリクとしては、ベンチマーカーのHTTP2対応をするプルリクですね。
Issue建てた時点で説明が下手すぎて、なんのことか理解してもらえなかったので、実装してプルリクを送って、それを見て理解してもらうというエンジニアらしい力技を使いました。
このIssueを建てた理由は、事前にISHOCON2の問題に挑戦していた時、どうしてもSSLの認証で詰まってしまって点数が伸びなかったんですよね。事前にやっている時なので、競技時間内ではない、ので、実装をいくら早くしても点数伸びないならベンチマーカーを早くしてしまえ!っていう、こちらもかなり力技でチートみたいなことをして点数を伸ばしていました。
埋め込みで使っている定数(workload *5 の5の部分)の値を変えるだけで、競技性が大きく変わってしまうのですが、かなり適当に決めた割には、うまく機能していたように思います。
http2にするだけで序盤から点数が爆上がりすることもなく、終盤なら気づいた人はかなり点数が上がるという、理想的な調整に偶然なっていたような気がしています。もちろんこの部分のパラメータもプルリク受付していると思うので、もっとこういう値にした方が楽しいと思うよ!という値などがあればお待ちしております!
最後に
@showwinさん、株式会社scoutyさん、参加者の皆さん、その他関わってくださった皆さん、ありがとうございました!
来年も多分開かれると思うので、よろしくお願いします!
ISUCONチームメンバー、後一人欲しいんですけど、見つかるんでしょうか・・・?もしよければ、声かけてください!
【追記】
見つかりました!というわけで、ISUCON8もよろしくお願いします!
ISUCON8、相方の @bgpat_ に加えて、助っ人の @Owl_Works さんとチーム名「Bremen」として出ることになりました!よろしくお願いします!
— そのうち退院する組長☆馬 (@Goryudyuma) August 26, 2018
(それから、久々の投稿、ありがとうございました。早く退学エントリ書かないと・・・。)