ISUCON 11 に参加して予選落ちした。

updated: 2021-08-22

  • ISUCON 11 の予選に参加して予選落ちした
  • やったこと・やりたかったこと一覧
  • 感想

ISUCON 11 の予選に参加した

ISUCON 11 の予選に参加した。

アプリや DB 内容にいくつか変更をしたが、効く箇所ではなかったようで初期実装から伸びなかった。 Python のアプリを変更していたけれど最終的にスコアが伸びていなかったので、初期実装の Rust を提出した。

初期実装なので当然だけれど、残念ながら予選突破ならず。

やったこととか

GitHub repository: https://github.com/zfhrp6/isucon11_qualify

やったこと

  • 初期実装でのベンチマーク実行
    • Python と Rust のアプリで実行した
      • Python が 2600, Rust が 4200 くらいだったような気がする
  • NGINX のログ形式を LTSV にする
    • alp ltsv で処理するため
    • このブログで使ってる nginx.conf からコピペ
    • commit/4eb67964
  • alp のインストール
  • netdata のインストール
    • AWS EC2 で SecurityGroup に Inbound port 19999 を許可するルールを追加
    • レギュレーションの確認不足 + ルールの削除忘れで、 SG のルール追加失格にも該当した
  • DB から 1 行だけ取得する select_rowselect_one として書き替え
    • select_row は全行取得してから最初の 1 行だけを抜き出すので無駄が大きい
  • アプリと NGINX の再起動などのスクリプトを作成
    • アプリ、 NGINX の再起動
    • NGINX, journalctl のログ消去
    • NGINX のログを alp に入れて出力するコマンド
    • commit/35f8e48e
    • commit/fe666bb7
  • 画像を DB の LONGBLOB カラムから実ファイルに出力・画像のファイルシステムからレスポンスする変更
    • 画像が DB に入っていたので、実ファイルへ書き出し
    • DB へ INSERT するとことは NULL を INSERT するように変更
      • 初期化スクリプトを触りたくなかったので、テーブル定義の変更と初期化スクリプトはそのままにしている
    • commit/6c13ce84
    • commit/0212267f
    • commit/55e3fc1c
    • commit/dd35d5f0
  • POST /api/isu/condition/ の INSERT をまとめる
    • 1 リクエストで 10 件の INSERT が必要になり 10 件を for 文で実行していたので、リクエストごとにまとめて INSERT するようにした
    • commit/970590f7
  • index.html を返すエンドポイントに max-age: 30000 を追加
    • だいぶ終了時刻に近づいていて大きなことはできないので思いついたことを雑にやった
    • commit/418e1df7
  • select_one として実装していたものがうまく動いてない気がしたので、クエリに LIMIT 1 をつけていく
  • ユーザーテーブルをメモリに持つ
    • だいぶ終了時刻に近づいていて雑に
    • メモリの余裕があったのでとりあえず入れてみたけれど意味はなさそう
  • drop_probability を下げる
    • POST /api/isu/condition/ をどれだけ受け入れられるかでスコアが大きく変わりそうだと気付いたので、 drop_probability を下げてみた
    • commit/0207e3da
  • 1 時間に 1 回程度の再起動試験
  • 終了 30 秒前くらいに諦めて Rust 初期実装のベンチマークをスタート
    • Python 初期実装からスコアが上がってないはずなので、開始時に測定したとおり高かった Rust 実装に切り替え
    • ベンチマーク中に競技終了となったけれど、運営テストスコアを見る限りでは Rust 初期実装で最終スコアとなっている

やっていたけれど間に合わなかったこと

  • /get/isu/ の 1+N クエリを JOIN に変更
    • isu 一覧の取得後に各 isu に対して isu_condition を取得していたので JOIN にしたかった
    • クエリを書き換えていたけれど、最新の isu_condition を取得する箇所がバグっているようで、ベンチマークをパスできなかった
    • commit/f3c4146b

やってないこと

  • DB の index が効いているかの確認
  • DB 初期化スクリプトの変更
  • isu.image COLUMN の DROP
  • その他たくさん

感想

今年も楽しかった。

予習・練習では Rust(actix-web, warp) を使ってみていたけれど、まだまだググりながらになってしまって時間がかかるので Python で参加した。 型チェックは欲しいので次回(来年)は Rust か Go かそのあたりで参加できるように慣れておきたい。

初めて 1 人での参加をしてみて、圧倒的に時間不足となった。手が遲いということでもあるけれど、簡単に 3 倍の稼働時間を確保できるので 3 人チームで参加したい。 1 人参加なのでメンバーとのコミュニケーションコストが無いのはとても良かった。チームを組んで以心伝心に成れるまで訓練するしかないのか。