ISUCON 11 に参加しました

8 月 21 日に開催された ISUCON 11 にチーム「夕張メロンNo.1」で参加しました(一人だけど・・)。 ブログを書くまでが ISUCON ということで大昔に書いていたアメブロ以来のブログを書きます。 ISUCON ってなに?という方はこちら

寿命が縮まる、人生が変わる…8時間耐久でインフラ技術競い合うISUCONの魅力とは?過去優勝者・主催者に聞く - エンジニアtype | 転職type

成績発表!

画面をずーっとスクロールして・・・ありました。 順位は書いてませんが数えたら 183 位でした!! 終了直前の順位表では 100 位前後だったので、100 位切れるかという期待もあったのですが甘かったですね。

isucon.net

参加したきっかけ

私は AtCoderアルゴリズムを競うコンテストにはまっているのですが、ISUCON 10 についてつぶやいた kenkooo さんのツイートを見て、どうやら WEB の技術を競うコンテストがあるらしいぞ!と ISUCON の存在を認識します。

その数カ月後、技術書典で本を漁っていて 「ISUCON のススメ」 という本を見つけ、購入してみることに。

techbookfest.org

この本からWEB アプリケーションのパフォーマンスを測ってボトルネックを見つけ、改善していくという ISUCON の基本のキを知って、これめっちゃ仕事の役に立つやつじゃんと思い、あとは勢いで参加登録をポチっとしました。

準備したこと

まず、前提となる私の WEB 経験はこんな感じです。

  • エンジニア歴は 4 年だけど WEB の経験はほとんどない

  • N 予備校のプログラミング入門で NodeJS を使った WEB アプリを作ってみたことがある

ISUCON 9 予選を解く

ISUCON に関する情報はいろんな方がブログなどで発信されていますが、ISUCON 素人の私の一番役に立ったのはなによりもこの本「ISUCON ススメ」です。 「ISUCON のススメ」では ISUCON 9 予選を題材に環境構築からパフォーマンス改善まで一通りの流れがコマンド、ソースコード (Go) つきで解説されています。 この本をそのままなぞって ISUCON 9 予選の環境を作ってからは、公式解説やブログなどを参考に実装してみました。

ISUCON 10 予選を解く

ISUCON 9 予選で雰囲気はつかめたので、10 予選も解きます。 一番得意なのは C# なのですが、C# の実装はないので一番やってみたかった Rust に挑戦することにしました。

ISUCON 9 予選を Rust に移植する

Rust の練習をするために ISUCON 9 予選の Rust 移植をしてみました。 全 API を実装するまでには至りませんでしたが、だいぶ Rust に慣れました。 この本を参考にしました。

www.shuwasystem.co.jp

うまくいったこと

あらかじめ用意したログ分析用のサーバーが役に立った

アクセスログの解析に alp、スロークエリの分析に pt-query-digest を使いました。 これらは競技用マシンにインストールすることもできますが、なにせ一人で時間がないのであらかじめ自前のサーバーにインストールして競技用マシンからログを集めるようにしました。 直前まで競技用マシンで分析もしていたのですが、どなたかのブログでスコアが上がりリクエストが増えるとログも大きくなるので分析に時間がかかるようになるというのを読んでまねしました。

Azure Pipelines でベンチ前後の作業をいい感じに自動化できた

作業の自動化というと ansible なんかが紹介されていることが多いと思いますが、私は業務で使い慣れている Azure Pipelines を使いました。 自動化した作業はざっくりとこんな感じです。

ベンチ前

  • git pull で最新のコードを取ってくる

  • ビルドする

  • サービスを再起動する

  • ログを削除する

ベンチ後

  • ログをアップロードする

  • 分析用サーバーでログをダウンロードして分析結果を主力する

Azure Pipelines の Environment という機能で複数サーバーにまとめてジョブを実行できるのがとても快適でした。

うまくいかなかったこと

MySQL マスター・スレーブ構成にしてバグらせた

更新クエリをマスターで処理して参照クエリをスレーブで処理すればいいと安易に考えてしまったのですが、ベンチが通らなくなってしまいました。

WEB の実装に手をつけられなかった

せっかく覚えた Rust でしたが、アプリのコード直すところまで手をつけられませんでした。 今年の練習も無駄ではないので、来年またがんばります。

まとめ

チームメンバーがほしい(切実)