Create a gist now

Instantly share code, notes, and snippets.

@tagomoris /isucon5_manual.md Secret
Last active Jun 17, 2017

What would you like to do?
ISUCON5予選マニュアル

ISUCON5 予選マニュアル

主催者よりお詫び

当初参考実装を準備するとしていた実装の準備がが都合により不完全な状況となっています。用意できたのは以下の言語による参考実装となります。

  • Ruby
  • Perl
  • Python
  • PHP

以下3言語については概ね動作するものの、バグがあり初期状態でベンチマークのチェックを通過しません。

  • Java
  • Golang
  • Scala

Node.js実装については準備自体ができなかった状態です。

ユーザの方には本当に申し訳ありません。お詫びいたします。 (tagomoris)

イメージURL

  • gs://isucon5-images/isucon5-qualifier-4.image.tar.gz

スケジュール

  • 10:00 競技開始 (26日(土曜) は 11:00 に延期)
  • 18:00 競技終了 (26日(土曜) は 19:00 に延期)
  • 以後主催者により結果チェック

ISUCON5 予選ポータルサイト

予選進行は以下のポータルからベンチマーク走行のリクエスト・結果チェックを行って進行します。登録されている代表者のメールアドレスと事前通知されているパスワードを用いてログインしてください。 このページは18時を過ぎると即座に閲覧不可能になります。ご注意ください。

http://isucon5q.tagomor.is/

開始時刻になるとこのポータル上でGCEイメージURLが表示されます。これを用いて作業を開始します。参加日の予選終了時刻を過ぎると即座にアクセスが拒否されますのでご注意ください。

また競技に使用した以下の情報を、競技時間のうちに必ず「チーム情報」ページから登録してください。これを登録するとベンチマーク走行リクエスト時にIPアドレスを入力せずに行えるようになります。

  • 使用GCPプロジェクトID (プロジェクト名ではなくIDです。Developer Consoleの "Home" で確認できます。)
  • 使用インスタンスの起動ゾーン (例: asia-east1-a)
  • 使用インスタンス名

このページではベンチマーク走行の処理状況も確認できます。赤もしくはオレンジが走行中のベンチマークを示し、青もしくは水色が待機中のものを示します。 ベンチマークが待機中もしくは実行中の間はリクエストは追加できません。

Getting Started

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

1. イメージからインスタンスを起動

Google Cloud Platform Developer Console (https://console.developers.google.com) を開き、メニューの "Compute" から "Compute Engine" を開きます。 更にその下の "Images" を開いて使用可能なイメージの一覧を表示します。

画面上部の "New Images" ボタンをクリックし、新規イメージ登録画面にて主催者から提供されているイメージを登録します。

  • Name: 自分でわかる名前を決めて入力します (例: isucon5q-1)
  • Encryption: Automatic
  • Source type: Cloud Storage object
  • Cloud Storage object path: (gs:// は除いた) 提供されたURL

完了したら続けてメニューの "VM Instances" を開きます。ここの "New Instance" ボタンをクリックし、以下の通りインスタンスを作成、起動します。

  • Name: 適当に入力してください (例: instance-1)
  • Zone: asia-east1-a, asia-east1-b, asia-east1-c のいずれか
  • Machine type: n1-highcpu-4
  • Boot disk: "Your image" から登録したものを選択、画面下の "Boot disk type" で "Standard Persistence type" を選択し容量は 16GB としてください
  • Firewall: "Allow HTTP Traffic" にチェック
  • 以上で "Create"

ここの Name および Zone は後で登録作業する際に必要となります。なおZoneはどれを選んでも実質的にスコア差はありません。

2. 起動したインスタンスにログイン

gcloud compute --project PROJECT ssh --zone ZONE INSTANCE_NAME

上記コマンドで操作しているユーザのユーザ名でログインしますが、実際には各ファイルは isucon ユーザのホームディレクトリ /home/isucon 以下にあります。必要であれば sudo もしくは sudo su - isucon などで各ユーザにスイッチして作業してください。

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

起動したインスタンスのPublic IPアドレス(External IP)にブラウザからアクセスするとログイン画面が表示されます。 ユーザはすべてメールアドレスとパスワードでログインしますが、データベースにデフォルトで登録されているユーザは全て、パスワードはアカウント名と同じです。 例えば、以下のペアが使えます。

  • メールアドレス: edwardo3657@isucon.net
  • パスワード: edwardo3657

4. 負荷走行

ベンチマーク走行は予選ポータル上からリクエストします。リクエストの際には対象IPアドレスの入力が必要です。(チーム情報を更新した場合を除く。後述)

リクエストはキューイングされ、主催者が用意したベンチマーククラスタノードにより順次処理されます。 待ち時間が不公平に・長過ぎるようにならないよう適宜ノード数は調節します。

なおベンチマークは以下のように実施され、各ステップで失敗が見付かった場合にはその時点で停止します。

  1. 初期化処理の実行 /initialize (30秒以内)
  2. アプリケーション互換性チェックの走行 (適宜: 数秒〜数十秒、固定リクエスト数)
  3. 負荷走行 (60秒)

参考実装の切り替え方法

各言語実装は systemd で管理されています。基本的には systemctl stop/start ならびに systemctl enable/disable で制御します。

PHPの場合

systemd での切り替えのほか、nginxの設定変更が必要です。nginx.php.conf が置いてあるのでそれを使用してください。

ルール詳細

基本スコアは以下のルールで算出されます。

成功レスポンス数(status 2xx) + 成功リダイレクト数(status 3xx) x 0.1 - ( サーバエラー(error)レスポンス数 x 10 + リクエスト失敗(exception)数 x 20 + 遅延POSTレスポンス数 x 100)

POSTリクエストに限り、3000ミリ秒(3秒)以内にレスポンスを返す必要があり、遅れたリクエストについては大きく減点されますのでご注意ください。

予選通過

予選は以下のルールで通過者が決定します。

  • 1日目、2日目、それぞれで3000点に最も早く到達したチーム (ただし予選終了後の追試の対象には含まれます)
  • それぞれの日で最後に提出した有効なスコアの上位4チーム
  • 上記10チームを除き、1日目と2日目を通した上位10チーム

またこれとは別枠で、1日目と2日目を通した学生枠の上位5チーム

制約事項

以下の事項に抵触すると失格(fail)となり、点数が無効として扱われます。

  • GET /initialize へのレスポンスが30秒以内に戻らない場合
  • スコアが0点
  • リクエスト失敗(通信エラー等)が全リクエストの 1% 以上存在する
  • サーバエラー(Status 5xx)が全リクエストの 1% 以上存在する
  • クライアントエラー(Status 4xx)が全リクエストの 10% 以上存在する
  • 更新をともなうアクセスののち、1000ミリ秒経過後にそれが参照リクエストの結果に反映されていない
  • 存在するべきDOM要素がレスポンスHTMLに存在しない
  • 存在するべきファイルへのアクセスが失敗する
  • 他、ベンチマークツールのチェッカが検出したケース

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

またアプリケーションは全て、保存データを永続化する必要があります。つまり処理実施後に再起動が行われた場合、再起動前に行われた処理内容が再起動後に保存されている必要があります。 予選終了後に行われる主催者による確認作業においてこれらの点が確認されます。

プロジェクト情報の登録、予選日終了後の作業

予選終了後の主催者による確認作業などのため、参加者は主催者のGCPアカウント tagomoris@gmail.com を予選参加に使用しているGCPプロジェクトに招待する必要があります。 また予選ポータルの「チーム情報」から、予選参加に使用しているGCPプロジェクトのプロジェクトID、ゾーン名、インスタンス名が登録できます。

主催者の招待(および主催者側による確認処理)とチーム情報登録が正しく行われていると、ポータル画面上にその旨が表示され、その後IPアドレスの入力を行わなくてもベンチマーク走行がそのインスタンスに対して行えるようになります。またこの作業は予選作業時間終了後の主催者確認に必要です。時間内に登録作業が行われない場合には失格となる場合がありますのでご注意ください。

予選参加日終了後、主催者からベンチマーク成績の追試、ならびにデータ永続化に関するチェックが行われます。これは主催者が予選用プロジェクトに招待されているアカウントを経由して行います。 このため、チーム情報に登録したサーバインスタンスはそのまま残しておいてください(停止しても構いませんが削除しないでください)。作業完了は27日(日曜)夜、もしくは28日(月曜)夜を予定しています。

http://isucon.net/ における予選の結果発表をもってこの保存期間を終了するものとします。

その他

サポートは事前に連絡のあった idobata のチャンネルにて行いますが、基本的に、予選環境の構成・操作方法やベンチマークの処理内容については返答しません。 また以下のURLにこれまで返答された質問などがまとめられています。何かある時にはいちどご覧ください。

https://gist.github.com/941/f11e4c85ebca0cb3d307

なお不具合のある参考実装のユーザについては、他参加者に不都合のない範囲で便宜をはかります。何かあればご相談ください。

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