🐍

ISUCON14 Python 1位取りました!(チーム:紙の保険証)

2024/12/25に公開1

ISUCONとは、大会用に作られたWebサイトをスピードアップする
「いい感じにスピードアップコンテスト」-> Iikanjini Speed Up Contest -> ISUCON だ。
どんなサイトかは当日にならないと分からないし、制限時間は8時間しかない。
毎年熱いバトルが繰り広げられているのだぜ。

ちなみに今回のISUCON14は、参加チーム数:834組。参加者合計:1920名だったそうな。

参加にあたり

私は去年初参加してある程度流れは理解していた。そこそこちゃんと準備したことだし、社内の人に伝授したいなと思っていた。

ちなみにISUCONのデフォルト言語はGoで、Goを選ぶのがスタンダードなのだが、今回は慣れ親しんでいるPythonで参加したかった。OKしてくれた人たちとチームを組んだ。

チーム名は、今回の作問を担当されたポケットサイン株式会社様がマイナンバーカード関連の事業をされてると知ったので、何かとホットな「紙の保険証」と命名した。

チーム構成

ベテランエンジニア2名+わたくしの構成
私だけ経験者だったのでISUCONの先輩(笑)として、勉強方法やツールやISUCONならではの注意点など共有した。

ツール類は去年から引き続きほぼ私が担当(といっても使いまわしだけど)。
個人としてはセミナーでおすすめ過去問と言われてたISUCON11予選で練習。ちなみにこの時ベンチマーク実行の度にDROP TABLEされる、通常のアプリでは考えられない挙動があることを知った。※去年は違った

使用したツール

使用したツールは去年の記事とほぼ同じ
https://zenn.dev/sakojun/articles/20231212-isucon13

前回Ansibleで書いたセットアップ・デプロイツールがあり、リプレースしたいなぁという気持ちもありつつ結局流用した。

追加で使用したのはPythonプロファイラのpy-spy[1]
以下コマンドをターミナルで起動しつつ、ベンチ実行後にCtrl+cで終了させるとファイル出力されるので、PCにダウンロードしてspeedscopeで可視化すると良い感じの出力が得られる。

py-spy record -f speedscope --subprocesses --pid $(systemctl show --property MainPID \
--value <isucon app name>.python.service) -o <file path>

また、リソース監視ツールとしてNetDataをワンコマンドで導入できる事を知ったので、インストールはしたがほとんど使わず。ベンチ実施中は基本htopを見ていた。

当日やったこと

  • 初期設定ツール実行(ログ設定、ツールインスコ)
  • Pythonに切り替えて初回ベンチ
    • アプリもDBも同じくらいCPU使ってた記憶(前回はDBが恐ろしく重かったハズ)
  • DBインデックス係だったので、前回みたく劇的改善はなさそうだなと思いつつ、クエリとpt-query-digest見ながら貼る
    • 一番重いクエリはインデックスだけでは解決できないなと思ったので後回し
    • 今回はベンチのたびにDROP TABLEされるパターン。進研ゼミでやったやつだ。
  • DBサーバー分割が上手くいかないと相談があったので助言(ISUCONだと大体決まったファイル[2]に環境変数が書かれててそこでハマってた)
  • インデックス貼りがだいたい終わる。アプリで特別負荷が高いPATHがあったのでアプリサーバー分割を提案。クエリで重いのは前述のものしか残ってないし
    • 過去問見るとアプリを分ける場合、重いPATHだけ逃がすのがISUCONでは常套っぽい。ラウンドロビンじゃダメな理由はイマイチ分かってない
  • 他で負荷高めのPATHは改修終わってたようなので、マニュアル読んでポイント稼げそうな改修見つけてケロという話をした
  • 先の一番重いクエリはPOINT型を使わないと改善できなそうと思って私が担当
    • クエリ単体で見れば重いとはいえ、DBのCPU使用率はまだ余裕ある(アプリサーバー分けてもPythonの方が使ってる)
      なのでこれをやってポイントを稼げるか不明と思い、あえてアプリ経験が薄い私がやってみていくらか稼げればラッキーと考えてた。
    • 実装誤りで何度かエラーを出しつつ、あと1個エラーを取り除けばマージできそうなところで時間切れ
  • 最後にお手製のクリンナップツールを流して終了

感想

個人としてはあまり大きな改善はできず。
結果的に後方腕組みおじさんな感じになった。
でもチームが力を発揮できたならOKでーす

結果発表ぉぉぉー!

Python TOPに燦然と輝く「13033 紙の保険証」やはり紙、紙は全てを解決する!!
https://isucon.net/archives/58847106.html

ちなみにマイナ保険証はロックされると使えない等[3]の風説も流れています。情報の信頼性には気を配りましょう。
厚労省FAQ

脚注
  1. 少し調べてメジャーそうなものにしただけで深い意味はない(ツール選定に時間を掛けすぎないという去年からの反省)。Flame Graph(が良いらしい)が出力できれば何でも良さそう。
    ターミナルで起動させたり、出力したファイルをダウンロードするのが不便で、使用方法を変えるなり別のツールにするなりで改善したかった。 ↩︎

  2. ~/env.sh に書かれている事が多い(と思う)。 ↩︎

  3. https://x.com/hodanren/status/1841023158960443428 ↩︎

FLINTERS BLOG

Discussion