Skip to content

Instantly share code, notes, and snippets.

@941
Last active December 24, 2023 11:36
  • Star 14 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save 941/8c64842b71995a2d448315e2594f62c2 to your computer and use it in GitHub Desktop.
ISUCON7予選 当日マニュアル.md

ISUCON7 予選マニュアル

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

スケジュール

22(日)のスケジュールは以下の時間帯で実施いたします。下記時間は遅れを反映済です。

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

ISUCON7 予選ポータルサイト

予選進行は以下のポータルからベンチマーク走行のリクエスト・結果チェックを行って進行します。事前通知されているidとパスワードを用いてログインしてください。

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

https://portal.isu.k0y.org

ポータルサイトでは負荷をかける対象となるサーバーを選択することができます。後述する追試でもこの設定を利用します。追試が実行できない場合は失格になるので、競技終了までにこの情報が正しいことを確認しておいてください。

このページではベンチマーク走行の処理状況も確認できます。緑が走行中のベンチマークジョブを示し、灰色が待機中のジョブを示します。自チームのジョブには * マークが付きます。 ベンチマークが待機中もしくは実行中の間はリクエストは追加できません。

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

競技者には3台のサーバーが与えられます。サーバーには連番の名前がついており、初期構成では先頭の2つがWebサーバー、残りの1つがDBサーバーになっています。

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

ベンチマークはグローバルIP側に対して実行されます。初期構成でWebサーバーとDBサーバー間の通信にローカルIP側のネットワークが利用されています。

ローカルIP間の通信にはスイッチによる帯域制限 (500Mbps) がかけられています。詳細は下記のマニュアルを参照してください。グローバルIP側の帯域は100Mbpsです。

(参考) スイッチに帯域制限はありますか?

Getting Started

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

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

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

なお、 fail2ban サービスが有効になっています。繰り返しログインに失敗すると接続できなくなるので注意してください。

(参考) 不正アクセスからサーバを守るfail2ban。さくらのクラウド、VPSで使ってみよう!

サーバーには予選終了後の主催者による確認作業(追試)のため、 ubuntu ユーザーのアカウントがあります。ubuntu ユーザーのアカウントに関して、アカウントの削除や既存の公開鍵の削除を行ったことにより主催者による追試をおこなうことができない場合、失格とします。

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

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

3. 負荷走行

ベンチマーク走行は予選ポータル上からリクエストします。リクエストの際には対象となるサーバーの設定が必要です。初期構成では先頭の2台がWebサーバーになっています。1台以上のWebサーバにチェックを入れて設定を保存してください。

リクエストはキューイングされ、主催者が用意したベンチマーククラスタノードにより順次処理されます。詳細については後述します。

参照実装の切り替え方法

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

$ sudo systemctl stop    isubata.python.service
$ sudo systemctl disable isubata.python.service
$ sudo systemctl start  isubata.golang.service
$ sudo systemctl enable isubata.golang.service

PHPを使う場合は systemd の設定変更の他にnginxの設定変更が必要です。

$ sudo -s
# cd /etc/nginx/sites-enabled/
# unlink *.conf
# ln -s ../sites-available/nginx.php.conf
# systemctl restart nginx.service

リカバリ方法

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

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

$ cd db
$ sudo mysql -e 'DROP DATABASE IF EXISTS isubata; CREATE DATABASE isubata;'
$ sudo mysql isubata < ./isubata.sql
$ zcat isucon7q-initial-dataset.sql.gz | sudo mysql --default-character-set=utf8mb4 

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

ルール詳細

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

ベンチマーク

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

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

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

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

スコア計算

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

成功したGETリクエスト数+成功したPOSTリクエスト数×3+受信したメッセージ件数

しかし、以下の注意事項があります。

  • GET /fetch へのアクセスには点数が加算されません。
  • 静的ファイルに対するアクセスは、ステータスコードが304の場合は100件で1点とします。
  • 「受信したメッセージ件数」とは、 GET /message が返したJSON内のメッセージ数です。 GET /history/* が返すHTML中のメッセージ件数は加点されません。
  • ベンチマーカーはリダイレクト先URIをチェックしますが、リダイレクト先にアクセスするとは限りません。リダイレクト先にアクセスする場合はそれにも独立して加点されます。

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

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

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

制約事項

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

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

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

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

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

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

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

予選終了後の主催者による確認作業などのため、予選終了までに以下を必ず実施しておいてください。

  • ポータル画面の「運営向け情報」から負荷走行を実行するサーバを選択しておく

時間内に登録作業が行われない場合には失格となりますのでご注意ください。

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

予選通過

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

一般枠 (計18チーム)

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

学生枠 (12チーム)

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

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

その他

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

https://gist.github.com/941/300fb47c4016d32fa4d6291c1a61364d

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