Skip to content

Instantly share code, notes, and snippets.

@rkmathi
Last active September 16, 2018 01:08
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rkmathi/1d08e17671d3952e8d2e873e686b7ea6 to your computer and use it in GitHub Desktop.
Save rkmathi/1d08e17671d3952e8d2e873e686b7ea6 to your computer and use it in GitHub Desktop.
ISUCON8予選 (日曜日) 当日マニュアル

ISUCON8 予選マニュアル

ISUCON8 予選レギュレーション も併せてご確認ください。

はじめに

スケジュール

  • 10:00 競技開始
  • 18:00 競技終了
  • 以後主催者により結果チェックと追試

ISUCON8 予選 ポータルサイト

予選は以下のポータルサイトからベンチマーク走行のリクエスト・結果チェックを行って進行します。 競技の開始時間になりましたら、事前に通知されているIDとパスワードを用いてポータルサイトへログインしてください。

このページは18:00を過ぎると即座に閲覧不可能になります。ご注意ください。

https://isucon8q-portal.karupas.org/

ポータルサイトでは、ベンチマーカーが負荷をかける対象となるサーバーを1台選択することができます。 後述する競技後の追試でもこの設定を利用します。

追試が実行できない場合は失格になるので、競技終了までにこの情報が正しいことを必ず確認してください。

ポータルサイトでは、ベンチマーク走行の処理状況も確認できます。 ベンチマーク走行が待機中もしくは実行中の間はリクエストは追加できません。

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

競技者には、同一スペックの3台のサーバーが与えられます。 サーバーには連番のプライベートIPが割り振られており、初期構成では第4オクテットが1のサーバーがWeb & DBサーバー、残りの2つのサーバーは何もしないサーバーになっています。

各サーバーにはNICが3つ接続されていて、それぞれグローバルIPとプライベートIPとベンチマーカーIPが割り振られています。 各IPアドレスはポータルサイトから確認することができます。

競技者がサーバーに接続して作業を行う際や、Webブラウザ等で動作確認を行う際は グローバルIP を使用することができます。 サーバー間で通信を行う際は プライベートIP を使用することができます。 ベンチマーク走行は ベンチマーカーIP に対して実行されます。

グローバルIP側の帯域制限は、50Mbpsです。 プライベートIP側、ベンチマーカーIP側の帯域制限は、それぞれ1Gbpsです。

作業開始

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

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

ポータルサイトに書かれてるグローバルIPアドレスに対して ssh してください。 サーバーはパスワード認証になっていて、ユーザー名は isucon 、パスワードはポータルサイト上で確認できます。

サーバーには予選終了後の主催者による確認作業(追試)のため、 isucon-admin ユーザーのアカウントがあります。

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

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

初期状態ではWebサーバーのグローバルIPアドレスに、ブラウザからアクセスするとアプリが表示されます。

GET / へアクセスすることで、トップページにアクセスすることができます。 画面右上の「サインアップ」から、ユーザを作成することができます。

GET /admin/ へアクセスすることで、管理者用ページにアクセスすることができます。 管理者用ページにログインするための初期データとして、ID: admin, パスワード: adminが用意されています。

3. 負荷走行

ベンチマーク走行を行う際はポータルサイト上からリクエストします。 リクエストの際には対象となるサーバーの設定が必要です。

ポータルサイト上のServersタブにアクセスして、ベンチマーク走行を実行したいサーバーにチェックを入れて、設定を保存してください。

ポータルサイト上のDashboardタブにアクセスして、Enqueueをクリックすると、ベンチマーク走行リクエストがキューイングされ、主催者が用意したベンチマークサーバにより順次処理されます。 詳細については後述します。

参照実装の切り替え方法

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

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

$ sudo systemctl stop    torb.perl
$ sudo systemctl disable torb.perl
$ sudo systemctl start   torb.go
$ sudo systemctl enable  torb.go

ただし、PHPを使う場合のみ、 systemd の設定変更の他に、次のように h2o の設定ファイルの変更が必要です。

$ sudo rm /etc/h2o/h2o.conf
$ sudo ln -s /etc/h2o/php-h2o.conf /etc/h2o/h2o.conf
$ sudo systemctl restart h2o

# PHP以外の実装用のh2o.confは、 /etc/h2o/default-h2o.conf です。

リカバリ方法

~isucon/torb/db ディレクトリに、スキーマを定義した schema.sql ファイルと、初期データセットが入った isucon8q-initial-dataset.sql.gz ファイルがあります。

DBを初期状態にもどすには、DBサーバーにログインして、次のコマンドを実行します。

$ ~isucon/torb/db/init.sh

~isucon/torb/db ディレクトリと ~isucon/torb/webapp ディレクトリは競技用の全サーバーに存在するので、間違って重要なファイルを消してしまっても他のサーバーからリカバリすることができます。

ルール詳細

指定された競技用サーバー上のアプリケーションのチューニングを行い、それに対するベンチマーク走行のスコアで競技を行います。 与えられた競技用サーバーのみでアプリケーションの動作が可能であれば、どのような変更を加えても構いません。 ベンチマーカーとブラウザの挙動に差異がある場合、ベンチマーカーの挙動を正とします。 また、初期実装は言語毎に若干の挙動の違いはありますが、ベンチマーカーに影響のない挙動に関しては仕様とします。

ベンチマーク走行

ベンチマーク走行は以下のように実施されます。

  1. 初期化処理の実行 GET /initialize (10秒以内)
  2. アプリケーション互換性チェックの走行 (適宜: 数秒〜数十秒)
  3. 負荷走行 (60秒 - 2.の互換性チェックにかかった時間)
  4. 負荷走行後の確認 (適宜: 数秒〜数十秒)

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

負荷走行中は、毎秒負荷レベルが増えていきます。 ただし、過去5秒以内に何らかのエラーが発生していた場合は負荷レベルが上昇しません。 終了時の負荷レベルや、負荷レベルが上がらない原因になったエラーについてはポータルサイトから確認することができます。

スコア計算

スコアはベンチマーク走行時間内に成功したリクエスト数をベースに計算されます。 リクエスト当たりの点数は以下のルールで計算され、その合計がベンチマーク走行のスコアとなります。

  • 予約( POST /api/events/\d+/actions/reserve ) : 10点/1リクエスト
  • 予約のキャンセル( DELETE /api/events/\d+/sheets/\s/\d+/reservation ) : 10点/1リクエスト
  • トップページ( GET / ): 5点/1リクエスト
  • イベント詳細( GET /api/events/\d+ ): 5点/1リクエスト
  • 静的コンテンツ: 1点/100リクエスト
  • その他: 1点/1リクエスト

以下を満たした場合リクエストが成功したと判定します。

  • タイムアウトせずにレスポンスを返却する
  • HTTPステータスコードが想定と一致する
  • コンテンツの内容チェックを通過する

HTTPステータスコードは、基本的に参照実装と同一のものを想定しています。 ただし、静的コンテンツに関しては、HTTPの規則の範囲内でステータスコード200の代わりに304を返すことができます。

なお、問題ページの内容はできるだけ最新の状態を反映させる必要がありますが、1秒以内の遅延は許されます。

制約事項

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

  • GET /initialize へのレスポンスが10秒以内に戻らない場合
  • アプリケーション互換性チェックに失敗した場合
  • 負荷走行後の確認へのレスポンスがそれぞれ下記の規定秒数以内に戻らない場合
    • POST /admin/api/actions/login: 20秒以内
    • GET /admin/api/reports/sales: 60秒以内
  • その他、ベンチマーカーのチェッカが失敗を検出したケース

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

アプリケーションは全て、保存データを永続化する必要があります。 つまり処理実施後に再起動が行われた場合、再起動前に行われた処理内容が再起動後に保存されている必要があります。 また、アプリケーションは、ブラウザ上での表示を初期状態と同様に保つ必要があります。 予選終了後に行われる主催者による確認作業(追試)においてこれらの点が確認されます。

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

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

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

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

予選通過

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

各チームの終了時スコアに基づき予選通過者を決定します。 最後に提出したスコアがfailしていたチームは失格となります。

一般枠 (計18チーム)

  1. 予選各日の終了時スコアにおける上位3チーム
  2. 予選両日を通し、1の該当チームを除いた中での上位12チーム

学生枠 (計12チーム)

  1. 予選両日を通し、学生枠参加チーム内における上位12チーム

ただし、学生チームが一般枠の基準で通過した場合、学生枠はそのチームを含めずに12チームを選出するものとする。

既知の不具合

管理画面から新規イベントを作成する際に、ベース金額を初期値から変更した場合、金額を数値型ではなく文字列型で POST してしまう JS のバグがありました。 初期実装を確認したところ、このバグに影響を受けるのは go 実装のみでした。また、ベンチマークには影響がないことが分かっているため、JS の修正は見送りました。 なお、JS を書き換えるとベンチマークが fail しますので JS の改修はお勧めしません。

その他

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

ISUCON8faq.md

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