Home

Awesome

ISUCON14 当日マニュアル

スケジュール

ISURIDEの仕様

ISURIDEの仕様についてはISURIDE アプリケーションマニュアルを参照してください。

ISUCON14 ポータルサイト(ポータル)

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

https://portal.isucon.net/contestant

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

リーダーボードの更新

ポータル上のリーダーボードは、競技終了1時間前に他チームの情報が更新されなくなり、自チームの情報のみ更新されるようになります。

Discordの利用

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

ただし、競技参加者(以下「選手」といいます)は競技時間中もDiscordの確認が可能な状態、通知が受け取れる状態を維持してください。 これは主催者が選手とリアルタイムでのチャットが必要だと判断した場合、主催者がDiscord上でプライベートチャンネルを作成しメンションの上、呼びかけを行う場合があるためです。呼びかけに応じない場合、競技に支障をきたす可能性があるため、必ず応答可能な状態を維持してください。

また、主催者からのアナウンス等もDiscordで実施されます。

質問

選手は主催者へ質問を送信することができます。質問は競技内容・マニュアル・レギュレーション等に対する疑問点の確認や、サーバー障害などのトラブル報告・サポート依頼に利用することができますが、これに限りません。

競技時間中の質問について、主催者からの回答は全選手へ公開、あるいは個別に回答されます。 全選手へ公開される場合、質問内容の原文、あるいは主催者による内容の要約が公開されます。 未回答の質問・未公開の回答については質問した選手およびそのチームメンバー、主催者のみが確認できます。 質問への回答・更新はポータル上にて選手およびそのチームへ通知されます。

主催者は競技時間中の質問への回答を、原則として全選手へ公開します。 ただし、重複する質問や、選手およびチーム個別の問題に対する対応の場合、この限りではありません。

送信された質問に対する回答が、競技性に影響を与えるものと主催者が判断する場合、回答できない旨を返答することがあります。

サポート対象外の事項

下記はサポート対象外となります。

競技環境の構築と接続

競技に参加するにあたり、各チームが用意したAWSアカウントで競技環境を下記の手順に従って構築してください。

1. テンプレートのダウンロード

まず、環境構築にはAWS CloudFormationを利用するため、チームはポータルのサーバーリストからAWS CloudFormationのテンプレートをダウンロードします。 テンプレートはチームごとに固有のものとなっているため共有厳禁です。

このテンプレートでは以下のリソースを作成します。

テンプレートから作成されるIAMロールは、EC2サーバーおよびLambda関数で上記リソースの情報取得を行うために利用します。 許可されているアクションはAWSの仕様上、アカウントに存在する他のリソースの情報も閲覧できる設定になっていますが、主催者は不要な情報の取得は行いません。

2. スタックの作成

  1. AWSマネジメントコンソールのCloudFormationを開き、ページ右上に表示されている リージョン名がアジアパシフィック(東京)(ap-northeast-1) になっていることを確認します。
  2. 「スタックの作成」をクリックします。 既存のスタックがある場合は「スタックの作成」から「新しいリソースを使用(標準)」を選択します。
  3. 「ステップ1 - スタックの作成」では、「前提条件 - テンプレートの準備」で「既存のテンプレートを選択」、「テンプレートの指定」で「テンプレートファイルのアップロード」を選択し、上記でダウンロードしたテンプレートファイルのアップロードを行い「次へ」をクリックします。
  4. 「ステップ2 - スタックの詳細を指定」では、任意のスタック名 (例:isucon14) を設定し、「次へ」をクリックします。
  5. 「ステップ3 - スタックオプションの設定」では、変更を行わず「次へ」をクリックします。
  6. 「ステップ4 - 確認して作成」では、ページ最下部「スタックの作成」ボタンの上に表示されている「AWS CloudFormationによってIAMリソースが作成される場合があることを承認します」にチェックを入れた上で、「スタックの作成」をクリックします。
  7. 作成したスタックの状態が CREATE_COMPLETE(作成完了)になるまで待機します。(数分かかります)

上記はAWSマネジメントコンソールが「日本語」の場合の手順です。他の言語の場合も同様の手順に従ってください。

3. サーバーへの SSH 接続

スタックの作成完了後、数分程度でSSH接続できるようになります。サーバーには選手がGitHubに登録しているSSH鍵を利用して、ユーザー名isuconでSSH接続ができます。 サーバーのIPアドレスはポータルか、AWSマネジメントコンソールのEC2サーバーページから確認できます。

また、AWSマネジメントコンソールからEC2 Instance Connectを使用して接続することもできます。 EC2 Instance Connectを使用する場合、ユーザー名は isucon としてください。

サーバー起動後にポータルのサーバーリストに表示されない場合は、EC2 Instance Connectでログインして競技環境の確認を実行し、問題が無いか確認してください。

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

ISURIDEには、WebブラウザからHTTPSでアクセスできます。 初期状態では、アクセス時のホスト名を元にルーティングする設定となっているため、下記の通りhostsファイルを編集しhttps://isuride.xiv.isucon.netにアクセスしてください。

動作確認のためのhostsファイル設定

MacやLinuxは /etc/hosts に、 Windowsは C:\Windows\System32\drivers\etc\hosts に以下の行を追記します。 ${サーバーのIPアドレス} は、ポータルのサーバーリストから確認できるパブリックIPアドレスに読み替えてください。

${サーバーのIPアドレス} isuride.xiv.isucon.net

上記変更の反映にはブラウザの再起動が必要な場合があります。

競技環境

競技環境の変更

選手が競技を進めるにあたって新たなポート解放が必要な場合、セキュリティグループの変更を行なっても構いません。

ただし、SSH(TCP/22)、HTTPS(TCP/443)については競技に影響があるため変更しないでください。

上記セキュリティグループの変更により、追試が実施できない場合は失格となりますのでご注意ください。

変更してはいけない点

下記は追試に利用するため、変更した場合は失格となります。

競技環境の確認

サーバー起動(再起動を含む)時に競技環境が主催者の指定した環境で構築されているかを確認(envcheck)し、サーバーのIPアドレスを含む競技環境の情報をポータルに送信する処理が実行されます。

送信された競技環境の情報を元に、ポータルのサーバーリストの情報(サーバーIPアドレス等)を更新します。なお、これはサーバー単位で更新されます。

この処理はサーバー起動時以外に、以下のコマンドで選手自ら行うことができます。

$ sudo /opt/isucon-env-checker/envcheck

競技環境に主催者の指定と異なる設定がある場合、エラーメッセージが表示されます(競技環境の確認の失敗)。 エラーメッセージを確認し、修正を行ってください。

なお、追試において競技環境の確認に失敗した場合、失格となります。 本項に記載の方法に従って、競技環境の確認を行うことをお勧めします。

競技環境の再構築方法

選手自らが操作により競技環境への接続性を失った場合など、競技環境を初期状態に戻す必要がある場合は上記競技環境の構築と接続を参考に、AWS CloudFormationで新たに競技環境の構築を行ってください。 再構築以前の競技環境上で変更を加えたソースコードや設定ファイル等の移行は、各チームの責任で行ってください。

なお、サーバーインスタンスの起動・停止・再起動はAWSマネジメントコンソールやAPIから選手が行っても構いません。 ただし、競技終了時に全てのサーバーが起動した状態でないと、追試が実施できず失格となりますので十分ご注意ください。

複数スタックの問題を回避するため、再構築作業の完了後は以前のAWS CloudFormationスタックを削除することをおすすめします。

複数スタックの問題

ポータルからダウンロードしたテンプレートを利用してAWS CloudFormationスタックを複数作成しても構いません。ただし、以下の点に留意してください。

競技環境の確認に記載の通り、サーバー情報の更新はサーバー単位、かつサーバーインスタンスが起動(再起動を含む)するたびに実施されます。 そのため、複数のスタックで作成されたサーバーが同時に存在している時、選手の操作によっては、ポータルのサーバーリストに複数のスタックのサーバー情報が混在してしまう可能性があります。 混在しているかの判断はポータルとスタックのリソースに表示されているIPアドレスを元に行ってください。

競技時間中は混在した状態になっていても問題ありませんが、競技終了時点でポータル上のサーバー情報が混在していた場合は失格となりますのでご注意ください。

主催者はポータルに登録された環境以外のサポートや、複数スタックが混在した状態でのサポートは行いません。

リファレンス実装

下記の言語での実装が提供されています。

リファレンス実装の切り替え方法

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

各言語実装はsystemdで実行・管理されています。 リファレンス実装をGoから他の言語に切り替えるには以下の手順を実行します。

1. isuride-go.service を停止、無効化します

sudo systemctl stop isuride-go.service
sudo systemctl disable isuride-go.service

以下のコマンドでstopとdisableを同時に行うことができます。

sudo systemctl disable --now isuride-go.service

2. isuride-{言語名}.service を起動、有効化します

sudo systemctl start isuride-{言語名}.service
sudo systemctl enable isuride-{言語名}.service

{言語名} には以下の言語名を指定してください。

言語{言語名}
Gogo
Node.jsnode
Perlperl
PHPphp
Pythonpython
Rubyruby
Rustrust

以下のコマンドでstartとenableを同時に行うことができます。

sudo systemctl enable --now isuride-{言語名}.service

PHPへの切り替え

ただし、PHPのリファレンス実装を使う場合のみ、systemdの設定変更の他に、次のようなnginxの設定変更が必要です。

sudo ln -s /etc/nginx/sites-available/isuride-php.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx.service

データベース(MySQL)

リファレンス実装ではデータベースとしてMySQLを利用しています。

MySQLへのログイン方法

リファレンス実装のMySQLに管理者権限で接続するには以下のようにします。

sudo mysql isuride

データベースのデータの初期化

リファレンス実装では、初期化処理(POST /api/initialize)においてデータベースのデータをベンチマーカーが想定している状態に戻します。 以下のコマンドでもデータベースのデータを初期化できます。

~/webapp/sql/init.sh

初期状態において、初期化処理はベンチマーカーが要求する範囲の整合性を担保します。 競技に伴って処理の変更やデータ構造の変更などを行う場合、初期化処理が行っている内容を漏れなく提供してください。

isurideデータベースのスキーマ

isurideデータベースのスキーマはリファレンス実装に含まれています。

SQLファイル内容
webapp/sql/0-init.sqlデータベースおよびユーザーの作成
webapp/sql/1-schema.sql各種テーブルの作成
webapp/sql/2-master-data.sqlマスターデータの作成
webapp/sql/3-initial-data.sql.gz初期データ

isurideデータベースを初期化するにはデータベースをDROP DATABASE isurideおよびCREATE DATABASE isurideで再作成し、以下のコマンドでテーブルの作成を行ったのち、データの初期化を行なってください。

cat webapp/sql/1-schema.sql | sudo mysql isuride

TLS証明書

サーバーには *.xiv.isucon.net のTLS証明書が設定されています。

このホスト名でHTTPS接続を行うとTLS証明書の検証エラーは発生しません。ベンチマーカーはこれを期待します。

ベンチマーカーの実行

ベンチマーカーによる負荷走行はポータル上からリクエストできます。

ポータルにアクセスし、「Job Enqueue Form」から負荷走行対象のサーバーを選択した後、「Enqueue」をクリックすることで、選択したサーバーに向けての負荷走行がリクエストされます。リクエストされた負荷走行は順次実行されます。 負荷走行が待機中(WAITING)もしくは実行中(RUNNING)の間は新しい負荷走行をリクエストできません。

負荷走行

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

初期化処理もしくはアプリケーション整合性チェックに失敗すると、負荷走行は即時失敗(FAIL)になります。

負荷テスト終了時点でHTTPレスポンスの処理を打ち切ります。未完了のリクエストなどは強制的に切断されます。負荷テスト終了以降に強制的に切断されたリクエストはスコア、検証には影響しません。

負荷テスト終了時点で行われていた決済処理は負荷テスト終了後5秒以内に完了する必要があります。5秒以内に完了しなかった場合、ベンチマーカーの期待する決済金額と一致せずFAILになります。

ベンチマーカーのタイムアウト

ベンチマーカーからのリクエストのタイムアウトはそれぞれ以下のように設定されています。

リクエストタイムアウト
POST /api/initialize30秒
GET /api/app/notification60秒
GET /api/chair/notification60秒
それ以外のリクエスト10秒

負荷走行の打ち切り

ベンチマーカーによる負荷走行は以下の状況で打ち切られます。 打ち切られた場合はその負荷走行はFAILとして記録されます。

負荷走行中のクリティカルエラーは以下の種類があります。

猶予時間

スコアの計算

以下に示す要素の合計がスコアとなります。

最終スコア

競技中に最後に行った負荷走行の結果を、最終スコアとします。 最後に行った負荷走行がFAILしている場合や、追試において失格となったチームについては、最終スコアがないものとして、受賞の対象となりません。

受賞の条件

受賞

最終スコアが上位の3チームに賞を授与します。

学生賞

学生チームのうち最終スコアが上位の2チームに学生賞を授与します。

特別賞

競技中にスコアが一番最初に32,767点を超えた1チームに特別賞を授与します。

企業賞

各企業賞は、最終スコアが上位の30チームのうち、さらに下記条件を満たすチームに授与します。

言語賞

POST /api/initialize のレスポンスで出力された言語情報を元に、Go/PHP/Python/Rubyで参加したチームのうち最終スコアが上位のチームに言語賞を授与します。 確認のため、該当チームにソースコードの提出を求める可能性があります。

受賞の対象となるためには、競技中に最後に行った負荷走行の POST /api/initialize レスポンスのJSONの language フィールドに実装に利用した言語が出力されている必要があります。 言語賞の対象言語と判定される language の条件は下記の通りです。この設定は、リファレンス実装に含まれています。

言語language フィールド
Gogo
PHPphp
Pythonpython
Rubyruby

追試

競技終了後、主催者による確認作業(追試)を行います。 追試は下記の手順で実施され、失格した場合は最終スコアがないものとして扱います。

追試手順

禁止事項

以下の行為を特に禁止とします。

本マニュアルやレギュレーション、ポータルにおいて禁止とされた行為(禁止事項)への違反は、失格とします。

また、競技環境の確認に記載されている通り、追試において競技環境の確認に失敗した場合にも、失格となります。 記載の方法に従って、環境情報の確認を行うことをお勧めします。