この記事は K3 Advent Calendar 2024 24 日目の記事です。
皆さん、くりぼっち楽しんでいますか?やることがないならISUCONというプログラミングコンテストで遊んでみませんか?
ISUCON とは
I
いいかんじに
SU
スピードアップ
CON
コンテスト
です。(マジ)
カスWebアプリを高速化する
ISUCON は問題としてWebアプリが与えられます。毎年多種多様なテーマで作られており、今年行われた ISUCON14 ではタクシーの配車アプリがテーマでした。
見た目は良いように思えますが、実装に致命的な問題をいくつも抱えています。
問題とは何か?処理がクソ遅いのです。APIが叩かれるたびにDBアクセスしていたり、一時的な情報まで全部DBに投げていたり…
これらの問題を解決して、Webアプリを最も高速化できたものが勝利する、そんなコンテストです。
ユーザーはほんの少し動作が遅いだけで不快になる
現代人の間隔は肥えています。Akamai社の調査 によると、モバイルアプリにおいて、100ms(0.1s)の読み込み速度低下がコンバージョン率(購入者数/訪問者数)を 7% も下げたという結果が出ています。Webアプリにおいて速度低下は実務においても致命的なのです。
やってみよう
高速化の重要性がわかったところで、実際に ISUCON の過去問を解いてみましょう。
今回は去年の問題である ISUCON13 を採用します。
お金がかからず、割と手軽な方法として、 Windows の機能である WSL(Windows Subsystem for Linux) を使った環境構築方法を紹介します。(Mac の人ごめんなさい)
注意
WSL だけでメモリを 4GB ほど使います。貸与 PC では厳しいかもしれません。
1. WSL をインストールする
スタートボタンを右クリックして、「ターミナル(管理者)」を起動し、以下のコマンドを実行します。
wsl --install
再起動とか求められたらそのまま指示に従ってください。
2. インストールスクリプト実行
https://github.com/matsuu/wsl-isucon/tree/main/isucon13 を使います。
1 と同じ手順で PowerShell を開き、以下のコマンドを実行します。
# ダウンロード
git clone https://github.com/matsuu/wsl-isucon.git
# ディレクトリに移動
cd wsl-isucon/isucon13
# 一時的にPowerShell実行を許可
Set-ExecutionPolicy RemoteSigned -Scope Process
# 構築スクリプト実行(引数はDistro名、インストールパス)
.\build.ps1 isucon13 .\isucon13
かなり時間がかかります。気長に待ちましょう。
3. インスタンスに入る
wsl.exe ~ -d isucon13 /bin/bash
を実行することで、起動した WSL インスタンスに入れます。
4. ベンチマーク実行
インスタンス内で以下のコマンドを実行することで、Webアプリの性能を測るベンチマークを実行できます。
./bench run --dns-port 1053 --enable-ssl
ベンチマークを実行して出たスコアが現時点での得点です。
いい感じに動いてれば以下のように表示されるはずです。
...
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:323 [失敗シナリオ streamer-cold-reserve-fail] 1 回失敗
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:323 [失敗シナリオ streamer-moderate-fail] 1 回失敗
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:323 [失敗シナリオ viewer-fail] 4 回失敗
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:323 [失敗シナリオ viewer-report-fail] 3 回失敗
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:329 DNSAttacker並列数: 9
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:330 名前解決成功数: 22202
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:331 名前解決失敗数: 0
2024-12-13T16:53:06.777Z info staff-logger bench/bench.go:335 スコア: 2451
実装を切り替える
初期状態だと Go で書かれた実装が動いています。(~/webapp/go/
にコードがあります)
例えば Python(コードは ~/webapp/python/
) に切り替えたいとしましょう。
$ sudo systemctl disable --now isupipe-go.service
$ sudo systemctl enable --now isupipe-python.service
これで OK です。また、コードを書き換えたときにはサービスを restart しないと反映されないので注意しましょう。
どう攻略するのか
全然攻略してない身ですが、一般的なアプローチを書いておきます。
ドキュメントをよく読む
今年初参加した僕はこれをきちんとやらなかったので、何もわからず爆死しました()
当日マニュアル と アプリケーションマニュアル というのがあります。この2つをよくよくよく読むことで、アプリがどういう動きをするのか、何をして良くて何をしてはダメなのか、どこが得点アップの肝になってくるのかを知ることができます。
全体を把握してから作業に取り組みましょう。
とりあえず DB インデックス張る
ISUCON の問題は絶対に DB が関わってきます。DB インデックスを適切に張るだけで得点が 1 万点まで伸びるらしいです。今回だと ~/webapp/sql/
に初期化用の SQL が入っていて、各実装は最初にこの SQL を実行することになっています。つまり、ここを編集してインデックスの設定をしてあげれば良いわけです。
オンメモリキャッシュできるところがないか探してみる
特にリアルタイムの一時データみたいなものはキャッシュできることが多いです。根気強く探しましょう。
まとめ
- くりぼっちは ISUCON やろう
- 普通に勉強になるし将来に役立つよ
- ドキュメントはよく読もう(一敗)
みなさんも ISUCON で楽しいクリスマスを!!!!!!!