Skip to content

Instantly share code, notes, and snippets.

@shirai-suguru
Last active October 1, 2022 01:44
Show Gist options
  • Save shirai-suguru/770d30d16688a07ba78e0a188cd99f9f to your computer and use it in GitHub Desktop.
Save shirai-suguru/770d30d16688a07ba78e0a188cd99f9f to your computer and use it in GitHub Desktop.
本選当日マニュアル

本選当日マニュアル

スケジュール

  • 10:00 競技開始
  • 17:00 リーダーボードの更新停止
  • 18:00 競技終了
  • 翌 18:00 結果発表イベント開始

アプリケーション ISU CONQUESTについて

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

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

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

https://portal.isucon.net/contestant

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

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

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

Discordの利用について

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

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

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

質問について

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

主催者は質問された内容が競技の一環である場合は、回答できない旨を返答することがあります。

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

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

サポート対象外の事項

主催者が事前に Discord サーバー等で告知していた通り、下記はサポート対象外となります。

  • スポンサー各社が提供しているサービスについての質問/サポート依頼

競技環境について

本選では、競技に必要なすべてのサーバーを主催者が用意します。

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

主催者はチームに対してサーバーを 5 台ずつ提供します(以下、競技用サーバー)。選手は競技用サーバーに SSH 接続し、競技に参加します。 選手はポータルのサーバーリストページで割り当てられた競技用サーバーの情報を確認できます

サーバーへのSSHの方法について

サーバーリストページに記載にサーバーには、ポータルに登録したGitHubのアカウントに紐づく、鍵を用いてisuconユーザでログインできます 例)サーバーのIPアドレスが、192.168.0.1、鍵のファイル名がisucon.keyの場合

ssh [email protected] -i ~/.ssh/isucon.key

競技環境の再起動あるいは初期化について

選手自らが設定変更等により競技環境を破壊するなどして、主催者による再起動あるいは初期化が必要になった場合はポータルを通してサポート依頼してください。 初期化以前の競技環境上で変更を加えたソースコードや設定ファイル等の移行が必要な場合は、各チームの責任で行ってください

重要事項

  • 競技に利用できる計算機資源は主催者が用意した 5 台のサーバーのみです。
    • モニタリングやテスト、開発において外部の資源を用いても構いませんが(例: メトリクス計測サービス)、スコアを向上させるいかなる効果を持つものであってはいけません。
  • 競技終了後は、主催者が追試を行います。Discord サーバーにて主催者がアナウンスをするまで、競技環境の操作をしないでください。
    • 競技終了後、別途アナウンスがあるまでに作業を行ったチームは失格となります。
  • その他、主催者による追試を妨げる変更(例: サーバー上の isucon 以外のユーザーに関する、ユーザー削除や既存の公開鍵の削除)を行ってはいけません。

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

ISU CONQUEST は WebブラウザからHTTPのみ利用することができます。 サーバーのポートは 80番と SSH 接続用の 22 番以外開放されていません ブラウザからポータルのサーバーリストページで割り当てられた競技用サーバーのIPアドレスを指定してアクセスしてください

例)競技用のサーバーのIPアドレスが10.0.0.2の場合

http://10.0.0.2

実際にはサーバはAPIを提供するだけになります。次のWebフロントが必要になります。次のURLでブラウザにアクセスしてください

http://d3cy42pujai31r.cloudfront.net/index.html?host=http%3A%2F%2F10.0.0.2%3A

補足

localhostと通信したい場合は、上記方法だと確認できません

ngrokなど別なツールを利用して

CloudFront (HTTPS) => ngrok (HTTPS) => local (HTTP)

となるように設定してください

管理画面について

ISU CONQUESTの管理画面には次のIDとパスワードでログインできます

ID PASSWORD
123456 password

ISU CONQUESTの管理画面は競技用のサーバのIPアドレスになります

例)競技用のサーバーのIPアドレスが10.0.0.2の場合

http://10.0.0.2

こちらで管理画面にアクセス可能です

ベンチマーカーの実行

負荷走行はポータル上からリクエストします。 ポータル にアクセスし、「Job Enqueue Form」から負荷走行対象のサーバーを選択、「Enqueue」をクリックすることで負荷走行のリクエストが行われ、順次開始されます。 なお、負荷走行が待機中(PENDING)もしくは実行中(RUNNING)の間は追加でリクエストを行うことはできません。

参考実装

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

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

参考実装の切り替え方法

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

各参考実装は systemd で管理されています。 例えば、参考実装を Go から Ruby に切り替えるには以下のコマンドを実行します。

sudo systemctl disable --now isuconquest.go.service

sudo systemctl enable --now isuconquest.ruby.service

PHP への切り替え

ただし、PHP を使う場合のみ、systemd の設定変更の他に、以下のような nginx の設定変更が必要です。

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

データベースの全データのインポート

次のコマンドを実行して、データベースへ全データのインポートが可能です(時間がかかります)

$ ~isucon/webapp/sql/setup/setup.sh

初期化処理(POST /initialize)がデータが破損して失敗する場合は、上記コマンドで復旧を試してみてください

データベースのリカバリ方法

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

$ ~isucon/webapp/sql/init.sh

sql配下にあるファイルを使って初期化します

MySQLへのログイン方法

参考実装のMySQLに管理者権限で接続するには以下のようにします。

$ sudo mysql -uroot isucon

管理者権限が不要であれば、isuconユーザでもログイン可能です

$ mysql -uisucon -p isucon
Enter password:<isuconと入力>

アプリケーションのデータの初期化処理について

参考実装では、初期化処理(POST /initialize)においてデータベースを初期状態に戻します。 処理の変更・データ構造の変更などを行う場合は、動作に支障が無いように変更してください。

アプリケーションの特殊な仕様について

今回のアプリケーションは、競技用のための仕様が入っております

アプリケーションは、リクエストヘッダーの"x-isu-date"の日時を信頼して、その日時を基準にロジックが動きます

また、アプリケーションの特性上、1日の始まり、を意識した作りになっておりますが、JST 0時を基準となるようにロジックが組まれております

時刻に関するロジックを変更する際、注意ください

負荷走行について

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

  1. 初期化処理の実行 POST /initialize(最大 60 秒)
  2. 整合性チェック (数秒~数十秒)
  3. 負荷走行(60 秒)

初期化処理、、整合性チェックのいずれか 1 つでも失敗すると、負荷走行は即時失敗(fail)になります。

リダイレクトについて

ベンチマーカーは HTTP リダイレクトを処理しません。

データの更新の反映について

ベンチマーカーはデータの更新が即時反映されていることを期待して検証を行います。

タイムアウトについて

負荷走行において設定されているタイムアウト値は下記の通りです。

  • POST /initialize 60 秒以内にレスポンスを返す必要があります。これを超えた場合、負荷走行は即時失敗(fail)します。
  • 上記以外の HTTP リクエスト 10 秒以内にレスポンスを返す必要があります。これを超えた場合、後述のスコア計算に従い減点の対象となります。

スコア計算

整合性チェックを通過し負荷走行が開始されると、下記の通り加点・減点が行われます。 加点対象のリクエストは、負荷走行中に送信されたリクエストのみです。

  • 通常ユーザのログイン(POST /login)に成功した場合
    • 1回あたり3点
  • BANされたユーザのログイン(POST /login)の処理が正常だった場合
    • 1回あたり1点
  • ユーザの新規作成処理(POST /user)に成功した場合
    • 1回あたり3点
  • プレゼント一覧画面の表示(GET /user/:userId/present/index/:n)に成功した場合
    • 1回あたり3点
  • プレゼント受け取り処理(POST /user/:userId/present/receive)に成功した場合
    • 1回あたり2点
  • ガチャを引く処理(POST /user/:userId/gacha/draw/:gachaId )に成功した場合
    • 1回あたり2点
  • その他の処理に成功した場合
    • 1回あたり1点
  • ただし、/admin配下へのリクエストは加点されません
    • 整合性のチェックのみ行います

負荷走行時における減点、即時失敗(fail)について

下記のエラーは減点や即時失敗(fail)となります。fail となった場合、スコアは 0 点となります。

  • 初期化処理、整合性チェックのいずれかに失敗した場合
    • 1 回以上で fail
  • HTTP ステータスコードやレスポンス内容などに誤りがある場合、及びリクエストがタイムアウトした場合
    • 1 回あたり減点 15 点
    • 50 回を超えた時点で負荷計測終了
  • PUT /admin/masterのエンドポイントが成功していなかった場合
    • ベンチマーカーでチェックをしていますが、追試の時の目視チェックでも確認します

特別賞

競技中のスコアが、最初に 50,000 点に到達した 1 チームを特別賞とします。

追試と最終スコア

競技終了後、以下の手順で追試を行い最終スコアを決定します。

  1. 全チームのサーバーを再起動し、10 分以上待ちます。

    • 再起動は、主催者がサーバーに SSH 接続し sudo systemctl reboot による再起動を行います
    • したがって、競技時間中に再起動をテストする場合は sudo systemctl reboot 等で実施してください。
    • すでにシャットダウンされているなどの理由により、sudo systemctl rebootを実行できなかったサーバーが存在する場合は失格となります。
  2. 全チームに対してベンチマークを実行します。

    • 競技時間中に最後の負荷走行の対象となったサーバーに対して 負荷走行を行います。
    • 計測は各チーム 3 回ずつ実施します。
  3. (2)で実施した負荷走行が fail となっているチームに関しては、4回目の計測を実施します。

    • この際、再度 fail となったチームは失格となります。
    • つまり、4回のうち2回以上 failになったチームは失格となります
    • 1回目Fail、2回目Pass、3回目Pass、4回目Fail は、失格です
    • 1回目Fail、2回目Pass、3回目Pass、4回目Pass は、有効とみなします
  4. 全チームのサーバーを(1)と同手順で再起動し、ブラウザから動作確認を行います。

    • この際、正常な動作が確認できなかったチームは失格となります。
    • 負荷走行実行時にアプリケーションに書き込まれたデータが、サーバー再起動後にも取得できることが確認できなかった場合も失格となります。
    • 主催者の作業日程の都合上、(4)で実施する sudo systemctl reboot 以降の作業は翌日になることが見込まれています。つまり、シャットダウンから起動までに時間が大きく経過することがあります。
  5. (2)の負荷走行で計測したスコアのうち、最も高いスコアをそのチームの最終スコアとします。

    • fail は 0 点として数えます。
  6. 最終スコア(最も高いスコア)が同一だった場合は、3回追試した時の、平均スコアが高いチームを上位とする

その他

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

POST /initialize のレスポンスにて、本競技で利用した言語を出力してください。 参考実装はそのようになっています。 この情報は集計し ISUCON 公式Blog で公表する他、今後の運営の参考情報として利用させていただきます。

POST /initialize のレスポンスは以下のような JSON となります。

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

language の値が実装に利用した言語となります。 language が空の場合は初期化処理が失敗と見なされます。

禁止事項

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

  • 競技終了時間までに、競技の内容に関するあらゆる事項(問題内容・計測ツールの計測方法など)を公開・共有すること(内容を推察できる発言も含む)
    • 不特定多数への公開はもちろん、他チームの選手と連絡を取り、問題内容等を共有する事(結託行為)も禁止とする。
    • ただし主催者が Twitter, Web サイトにおいて公開している情報は除く。ポータルでログインを要するページ(選手が参加する Discord を含む)において記載されている内容は公開情報でない旨留意すること
  •  競技時間中、チーム外の人物と ISUCON12 問題にまつわる事項のやりとり(ISUCON12 選手であるかどうかを問わない、SNS での発言も含む)
  • 主催者の指示以外で利用が認められたサーバー以外の外部リソースを使用する行為(他のインスタンスに処理を委譲するなど) は禁止する。
    • ただしモニタリングやテスト、開発などにおいては、PC や外部のサーバーを利用しても構わない。
    • デプロイのために外部のコンテナレジストリ (Amazon ECRなど) を利用することも可能。ただし、競技終了まで他のチームに対して公開されないように注意すること
  • 選手が主催者からその選手が属するチームへ提供されていないサーバーについて直接のアクセスを試みる行為や、外部への不正アクセスを試みる行為。具体的にはベンチマーカーへのログイン試行等。(なお、例示のため、これに限らない)
  • 他チームと結託する行為(程度を問わず)
  • 主催者が他チームへの妨害、競技への支障となるとみなす全ての行為
  • 本マニュアルやレギュレーション、ポータルにおいて禁止とされた行為(禁止事項)への違反は、失格とします。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment