Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

クリスマスはISUCONしよう

Last updated at Posted at 2024-12-13

この記事は 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 をインストールする

スタートボタンを右クリックして、「ターミナル(管理者)」を起動し、以下のコマンドを実行します。

PowerShell
wsl --install

再起動とか求められたらそのまま指示に従ってください。

2. インストールスクリプト実行

https://github.com/matsuu/wsl-isucon/tree/main/isucon13 を使います。

1 と同じ手順で PowerShell を開き、以下のコマンドを実行します。

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. インスタンスに入る

PowerShell
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 で楽しいクリスマスを!!!!!!!

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?