Skip to content

Instantly share code, notes, and snippets.

@progfay
Last active July 3, 2022 23:18
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save progfay/25edb2a9ede4ca478cb3e2422f1f12f6 to your computer and use it in GitHub Desktop.
Save progfay/25edb2a9ede4ca478cb3e2422f1f12f6 to your computer and use it in GitHub Desktop.
ISUCON10 予選マニュアル

ISUCON10 予選マニュアル

かならず、 ISUCON10 予選レギュレーション も併せてご確認ください。レギュレーションの内容と本マニュアルの内容に矛盾がある場合、本マニュアルの内容が優先されます。

はじめに

スケジュール

(時刻はすべて JST)

  • 12:20 競技開始
  • 20:00 ポータルサイト リーダーボードの更新停止
  • 21:00 競技終了
  • 以後主催者により結果チェックと追試

課題アプリケーション ISUUMO について

ISUUMO は ISUCON 社が提供する「イスに似合う不動産を検索できる」総合情報サイトです。

リモートワークの普及によって、自宅のイスが生産性に直結することがわかった。 その調査結果を受けて、よりよい座環境を求め郊外に住むことを考えるユーザーが増加。 また、注目度が増したことで bot からもアクセスが急増し、機会損失が発生している。 結果として ISUUMO にアクセスが集中し、負荷に耐えられないことが目立ってきた。

社長「なんか最近遅いみたいだから、いいかんじに早くしといてくれる? 21 時にバーンと新しい CM 打つしさ!」

ISUCON10 予選 ポータルサイト

ISUCON10 予選の競技は下記ポータルサイトを利用します。 事前に登録した情報を用いてログインしてください。 なお、このページは競技開始時刻までアクセスすることはできません。

ポータルサイトでは、ベンチマークの実行・結果確認、質問/サポート依頼の送信、リーダーボードの確認ができます。

https://portal.isucon.net/contestant

Discord の利用について

ISUCON 10 サポート Discord サーバは競技時間前後はすべてのチャンネルが発言不可となります。 ポータルサイトを通して質問やサポート依頼を送信することができますので、そちらを利用してください。

ただし、選手は Discord の確認が可能な状態、通知が受け取れる状態を維持してください。 これはポータルで送信した質問/サポート依頼の内容を運営が確認した上で、リアルタイムでのチャットが必要だと判断した場合、こちらから Discord 上でプライベートチャンネルを作成し、mention の上よびかけを行う場合があるためです。

また、アナウンス等も Discord で実施されます。

サーバ、ネットワーク構成について

事前に用意されたサーバは3台あり、これらのサーバに SSH を用いて接続し競技を行います。 ポータル右上に表示されているチーム ID を元に、以下の gist より割り当てられている「踏み台用IPアドレス」と「チームサブネット」を確認してください。

https://gist.github.com/whywaita/df089fd75af4741f1b905de30a075203

競技に用いる 3 台のサーバはチームのサブネットに対してそれぞれ 101 ~ 103 が第 4 オクテットとなります。具体的な IP アドレスはポータルにて確認することができます。

上記のサーバに接続するために踏み台を経由して SSH 接続を行います。 ssh_config(5) の例を以下に示します。なお、あくまで例示であり必ず以下の設定を利用する必要はありません。

 Host isucon-bastion
   HostName <踏み台用IPアドレス>
   Port 20340
   User isucon

 Host isucon-server
   ProxyJump isucon-bastion
   User isucon
   HostName <自チームサーバのIPアドレス>

なお、踏み台用のサーバはポート番号 20340 でログインすることができます。

重要事項

競技終了後は、ベンチマーク走行成績の追試を行いますので、Discord サーバ および http://isucon.net/ にて運営からお知らせをするまで、サーバの操作はしないでください (競技終了後の作業は禁止行為にあたります)。お知らせは当日夜あるいは翌日夜までに行います。

競技に利用できる計算機資源は主催者側が指定した3台までのインスタンスのみです。 外部のメトリクス計測サービスの使用のみ特例として許可しますが、スコアを向上させるいかなる効果も持つものであってはいけません。

作業手順

以下の順序で作業を開始してください。

1. サーバーへのログイン

上記に記載したサーバーに対して SSH 接続してください。 ログインには参加登録に利用した ( = ポータルのログインに利用している) GitHub アカウントに登録されている SSH 公開鍵を利用します。

SSH ログインのユーザ名は isucon です。

[重要]isucon ユーザーの以外のアカウントに関して、アカウントの削除や既存の公開鍵の削除を行ったことにより主催者による追試をおこなうことができない場合は、失格とします。

2. アプリケーションの動作確認

ブラウザからアクセスするとアプリが表示されます。 踏み台を経由したブラウザアクセスには、 SSH におけるローカルポートフォワーディング などを用いて表示することができます。 これ以外の方法で動作確認してもかまいません。

以下に Team001 におけるローカルポートフォワーディングを実行するコマンドを例示します。 これは「リモートホスト 10.160.1.103 に SSH 接続をした上で」「ローカルの localhost:8080 への TCP 接続を」「リモートホストを通して 10.160.1.101:80 へ転送する」というコマンドです。 以下のコマンドを実行したままブラウザで localhost:8080 にアクセスすることで、 10.160.1.101:80 にて動作しているアプリケーションが表示されます。

$ ssh -L localhost:8080:10.160.1.101:80 10.160.1.103

GET / へアクセスすることで、トップページにアクセスすることができます。

3. 負荷走行 (ベンチマーク)

負荷走行はポータルサイト上からリクエストします。 ポータルサイトの 競技参加者向けページ にアクセスし、 "Job Enqueue Form" から負荷走行対象のサーバーを選択、"Enqueue" をクリックで実行が開始されます。

なお、負荷走行が待機中もしくは実行中の間は追加の Enqueue を行うことはできません。

ベンチマークからのリクエストは、 API に対してのみ行われます。 画像や HTML などの静的ファイルに対するリクエストは行われませんが、追試にてブラウザ上でアプリケーションが動作するかを確認します。 詳細は 制約事項 を参照してください。

参考実装

参考実装として下記の言語が提供されています。

  • Go
  • Ruby
  • Perl
  • PHP
  • Python
  • Rust
  • Node.js
  • Deno

ただし、 Deno は初期状態でアプリケーション互換性チェックに失敗することに注意してください。

参考実装の切り替え方法

初期状態では Go による実装が起動している状態になります。

各言語実装は systemd で管理されています。 例えば、参考実装を Go から Ruby に切り替えるには次のようにします。

$ sudo systemctl stop    isuumo.go.service
$ sudo systemctl disable isuumo.go.service
$ sudo systemctl start   isuumo.ruby.service
$ sudo systemctl enable  isuumo.ruby.service

ただし、PHP に切り替える場合には以下のコマンドを実行する必要があります。

$ sudo unlink /etc/nginx/sites-enabled/isuumo.conf
$ sudo ln -s /etc/nginx/sites-available/isuumo.php.conf /etc/nginx/sites-enabled/isuumo.php.conf
$ sudo systemctl restart nginx

リカバリ方法

データベースを初期状態に戻すには、次のコマンドを実行します。

$ /home/isucon/isuumo/webapp/mysql/db/init.sh

競技内容

競技者はアプリケーションのチューニングを行い、それに対するベンチマーク走行のスコアで競技を行います。 競技用サーバーのみでアプリケーションの動作が可能であれば、どのような変更を加えても構いません。

ベンチマーカーとブラウザの挙動に差異がある場合、ベンチマーカーの挙動を正とします。

負荷走行プロセス (ベンチマークの流れ)

負荷走行は以下のように実施されます。

  1. 初期化処理の実行 POST /initialize (30 秒以内)
  2. アプリケーション互換性チェックの走行 (10 秒以内)
  3. 負荷走行 (60 秒)

各ステップで失敗が見付かった場合にはその時点で停止します。 ただし、負荷走行中のエラーについては、タイムアウトや 503 エラーを含む幾つかのエラーについては無視され、ベンチマーク走行が継続します。

また負荷走行が 60 秒行われた後、レスポンスが返ってきていないリクエストはすべて強制的に切断されます。 強制的に切断された時のエラーの内容は評価の対象外です。

スコア計算

スコアは イスの購入件数物件の資料請求件数 をベースに以下の計算式で計算されます。

スコア = (イスの購入件数 + 物件の資料請求件数) - 減点

以下の条件のエラーが発生すると、失格・減点の対象となります。

  • 致命的なエラー
    • 1 回以上で失格
    • メッセージの最後に (critical error) が付与されます
    • 例: イス・物件の CSV 入稿に失敗・タイムアウトした場合は失格となります
  • HTTP ステータスコードやレスポンスの内容などに誤りがある
    • 1 回で 50 点減点、 10 回以上で失格

また、一定時間内にレスポンスが返却されない場合はリクエストが中断され、最後に (タイムアウトしました) の付いたメッセージが表示されます。 これによるイス・物件の CSV 入稿以外の API での失格・減点はありません。

HTTP ステータスコードは、基本的に参考実装と同一のものを想定しています。

また減点によりスコアが 0 未満になった場合は失格となります。

制約事項

以下の事項に抵触すると失格 (fail) となり、点数が 0 点になります。

  • POST /initialize へのレスポンスを30秒以内に返さない場合
  • アプリケーション互換性チェックに失敗した場合
  • その他、ベンチマーカーが失敗を検出したケース

最初に呼ばれる初期化処理 POST /initialize は用意された環境内で、チェッカツールが要求する範囲の整合性を担保します。 サーバーサイドで処理の変更・データ構造の変更などを行う場合、この処理が行っている内容を漏れなく提供してください。

予選終了後に行われる主催者による確認作業 (追試) において下記の点が確認できなかった場合は失格となります。

  • アプリケーションは全て保存データを永続化する必要があります
    • ベンチマーク実施後に再起動が行われた場合、直前まで行われていた内容が保存されている必要があります
  • アプリケーションはブラウザ上での表示を初期状態と同様に保つ必要があります

POST /initialize での実装言語の出力

POST /initialize のレスポンスにて、本競技で利用した言語を出力してください。 集計し blog での公表や、参考情報として利用させていただきます。

POST /initialize のレスポンスは次のような JSON 形式になります。

{
    "language": "実装言語"
}

language の値が実装に利用した言語となります。 language が空の場合はベンチマーカーに失敗と見なされます。

bot からのリクエスト

bot からのアクセスはコンバージョンに繋がらないため、弾くことが仕様として決定しましたが、まだ実装されていません。 bot は User-Agent が以下の正規表現にマッチする形式であり、このリクエストに対して 503 Service Unavailable を返すことが許可されています。 これに対するベンチマーカーからの減点は発生しません。

/ISUCONbot(-Mobile)?/
/ISUCONbot-Image\//
/Mediapartners-ISUCON/
/ISUCONCoffee/
/ISUCONFeedSeeker(Beta)?/
/crawler \(https:\/\/isucon\.invalid\/(support\/faq\/|help\/jp\/)/
/isubot/
/Isupider/
/Isupider(-image)?\+/
/(bot|crawler|spider)(?:[-_ .\/;@()]|$)/i

その他

リーダーボードの更新について

ポータルサイト上のリーダーボードのスコアは、競技終了前の 1 時間は表示の更新がされなくなり、自チームのスコアのみ確認が可能になります。

予選終了後の作業について

予選終了後は、運営が追試を行うため、サーバーに対して一切の操作を行わないでください。 予選参加日終了後、主催者からベンチマーク走行成績の追試、ならびにデータ永続化、画面表示に関するチェックが行われます。 作業完了は当日夜、もしくは翌日夜を予定しています。 http://isucon.net/ における予選の結果発表をもって、この保存期間を終了するものとします。

質問・サポートについて

レギュレーションの通り、サポート依頼や質問はポータルから受け付けます (競技中は Discord の全体チャンネルは書き込み不可となります)。 質問については運営が回答するまで他チームへ公開されることはありません。また必要に応じ運営により質問原文が修正され全体公開となるため、質問内容について他チームのことを気にする必要はありません。

必要に応じて運営から Discord で mention の上チャットによるサポートを開始する場合があります。詳細はレギュレーションを確認してください。

なお運営は原則として、予選環境の構成・操作方法やベンチマーカーの処理内容については回答しません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment