ISUCON 2021 予選 に出場してみて

所感とか(書き殴りです。)

結果は、初期スコアから変わらず笑

ちゃんと systemd の起動コマンドの中身まで見たのに、ビルド+実行されてるように空見してしまって、永久に初期ビルドで戦ってました汗

試合終盤、ベンチマーカーに不具合が発生し、そのまま試合終了時刻を過ぎたので、終わったものと考え夕食に出かけるも、ラーメン出された辺りに延長のお知らせが。

食って帰ったら丁度終わりの時間で、最後にちゃんと測っておきたかった、悔しい気持ちが残りました。ヒイ。

とにかく、やるべきことはいくつか拾えたので、次回に活かせるよう、武器の調達リストを作っておくことにする。

今回のアプリケーション構成

一般的なWebアプリケーションと捉えました。

Nginx <-> App <-> DB といった初期構成でした。

またAWSのECサービス上で1インスタンスに上記の3者が内包され、3台立ち上がっているような状態でした。

そしてベンチマーカーはそのいずれか1台を指定する方式でした。

AWSで使える25ドルクレジット(ほとんどのサービスで利用可能)は配布されていたので、初期構成から大きく変わっても全然良いよという雰囲気を感じました。 (ただしRDSは有料枠でした泣)

対策

ここでスコアを上げるためには、どういう攻め方があるのかを考えると、

  • 3者それぞれチューニングする

    • Nginxのチューニング方法
    • Appの改善(言語特性としてGo, Rust辺りに親しむ、N+1問題やアプリ内キャッシュ等、ビルド方法の切り替え)
    • DBのスロークエリ改善やスキーマ変更等
  • ロードバランシングで負荷分散を行う

  • DBの構成を変える

    • Read系, Write系で分離
    • NoSqlの部分適用
  • ボトルネックの可視化

    • alpや、New Relic等
    • アプリケーションログ出力設定
  • 各種オペレーションスクリプトの用意

    • 環境構築(ISUCONの環境ではなく、ツールの用意や設定ファイルの書き換え等)
    • 自動デプロイ(ローカルで開発し、本番にスムーズに反映できるフローを構築する)
    • ログ抽出、ボトルネック特定のための指標の自動出力
    • ベストスコア計測(ログ出力の停止、各種ツールの停止、本番用ビルド等)
  • チェックリスト!(座談会でご教授頂いた)

    • 本番、まずなにをやるべきかをリスト化したもの。
    • きまりきった作業は予め手順書化しておき、戦う土壌が出来るまでは少なくとも脳死でリラックスして取り組めるように。

などが考えられるかなぁ...

これらを地道に用意し、当日はチームで分担した動きでそれぞれの役割を果たせば自ずとスコアは伸びるのではないでしょうか。

ぼやき

言語色々と用意されてましたが、デフォでGo版が建ってました。 そのままベンチで2500程でましたが、Node.jsに切り替えると1200程。 言語特性は避けられないね。

とわいえ、スケーリングや負荷分散などで大きく伸ばすと言語特性は無視できるとの声もちらほら。

完全に最適化された場合にのみ差が出るようなイメージでしょうか? それならむしろエンジニアとしての知見勝負になりますね!

UUIDを発行してSELECTしてるのを見ると広告配信を思い出しました。 DynamoにUUID辺りを移植してみたらスコア上がってたりしたんだろうか。

MariaDBのチューニングの仕方とか知らなくてググりながら進めてました。 コネクション数が最大150なのは驚いた。

さいごに

今回は一人での参加となりました。

チーム移動やら何やらで、一切事前準備出来ず、また10時開始なのに14時に寝坊して参加するも、ソースコード的にはかなり改善点を見つけられたし、Nginxログを解析して改善の優先順位付けしてからの動き出しなど、冷静に進めることができました。

まあ流石に準備なしはアレなので、次回は普通に挑みたいと思います。