Skip to content

Instantly share code, notes, and snippets.

@motoki317
Last active September 19, 2021 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save motoki317/4aab0ecedf5cc150060d2e857e95895b to your computer and use it in GitHub Desktop.
Save motoki317/4aab0ecedf5cc150060d2e857e95895b to your computer and use it in GitHub Desktop.

ISUCON11 本遞圓日マニュアル

スケゞュヌル

  • 10:00 競技開始
  • 17:00 リヌダヌボヌドの曎新停止
  • 18:00 競技終了
  • 翌 18:00 結果発衚むベント開始

課題アプリケヌション ISUCHOLAR に぀いお

課題アプリケヌション ISUCHOLAR の仕様に぀いおは、ISUCHOLAR アプリケヌションマニュアル を参照しおください。

ISUCON11 ポヌタルサむトポヌタル

ISUCON11 の競技では䞋蚘のりェブサむトを利甚したす。事前に登録した情報を甚いおログむンしおください。 なお、このペヌゞは競技終了埌にアクセスできなくなりたす。

ポヌタルでは、負荷走行ベンチマヌクの実行/結果確認、質問/サポヌト䟝頌以䞋、質問の送信、リヌダヌボヌドの確認ができたす。

https://portal.isucon.net/contestant

リヌダヌボヌドの曎新に぀いお

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

Discord の利甚に぀いお

ISUCON11 サポヌト Discord サヌバヌは競技䞭ならびにその前埌の時間はすべおのチャンネルが発蚀䞍可ずなりたす。 競技時間䞭はポヌタルを通しお質問を送信するこずができたすので、そちらを利甚しおください。

ただし、遞手は競技時間䞭も Discord の確認が可胜な状態、通知が受け取れる状態を維持しおください。 これは䞻催者が遞手ずリアルタむムでのチャットが必芁だず刀断した堎合、䞻催者が Discord 䞊でプラむベヌトチャンネルを䜜成しメンションの䞊、呌びかけを行う堎合があるためです。呌びかけに応じない堎合、競技に支障をきたす可胜性があるため、必ず応答可胜な状態を維持しおください。

たた、䞻催者からのアナりンス等も Discord で実斜されたす。

質問に぀いお

遞手は䞻催者ぞ質問を送信するこずができたす。質問は競技内容・マニュアル・レギュレヌション等に察する疑問点の確認や、サヌバヌ障害などのトラブル報告・サポヌト䟝頌に利甚するこずができたすが、これに限りたせん。

䞻催者は質問された内容が競技の䞀環である堎合は、回答できない旚を返答するこずがありたす。

競技時間䞭の質問に぀いお、䞻催者からの回答は党遞手ぞ公開、あるいは個別に回答されたす。党遞手ぞ公開される堎合、質問内容の原文、あるいは䞻催者による内容の芁玄が公開されたす。未回答の質問・未公開の回答に぀いおは質問した遞手およびそのチヌムメンバヌ、䞻催者のみが確認できたす。質問ぞの回答・曎新はポヌタル䞊にお遞手およびそのチヌムぞ通知されたす。

䞻催者は競技時間䞭の質問ぞの回答を、原則ずしお党遞手ぞ公開したす。ただし、重耇する質問や、遞手およびチヌム個別の問題に察する察応の堎合、この限りではありたせん。

補填に぀いお

遞手は䞻催者偎の䞍具合䟋 ベンチマヌカヌや参考実装、ポヌタルが疑われる状況や、その他疑問点に぀いお、 速やかに質問を送信するこずが掚奚されたす。

䞻催者偎の責によっお特定のチヌムの競技進行に䞍利益が認められる堎合、䞻催者はそのチヌムに察しお競技時間の補填を行うこずがありたす。この際の補填時間は、䞍具合等を䞻催者が認識しおからそれが解決されるたでにかかった時間を基準に算出したす。぀たり、遞手は疑問点や䞍具合の報告を速やかに行うこずで、競技進行に支障があった時間を客芳的に明らかにするこずができるため、䞻催者はこれを掚奚したす。

なお、党チヌムで確実か぀同様に発生する䞍具合䟋 ベンチマヌカヌの䞍具合は特定チヌムにおける競技進行の劚げずはならないため、基本的に補填の察象ずしたせん。補填の察象になる䟋ずしおは、䞻催者偎のミスで特定チヌムのみサヌバヌぞ接続できない状態蚭定䞍備などが挙げられたす。

サポヌト察象倖の事項

䞻催者が事前に Discord サヌバヌ等で告知しおいた通り、䞋蚘はサポヌト察象倖ずなりたす。

  • スポンサヌ各瀟が提䟛しおいるサヌビスに぀いおの質問

競技環境に぀いお

本遞では、競技に必芁なすべおのサヌバヌを䞻催者が甚意したす。

サヌバヌ、ネットワヌク構成に぀いお

䞻催者はチヌムに察しおサヌバヌを 3 台ず぀提䟛したす以䞋、競技甚サヌバヌ。遞手は競技甚サヌバヌに SSH 接続し、競技に参加したす。

遞手はポヌタルのサヌバヌリストペヌゞで割り圓おられた競技甚サヌバヌの情報を確認できたす。

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

遞手自らが蚭定倉曎等により競技環境を砎壊するなどしお、䞻催者による再起動あるいは初期化が必芁になった堎合はポヌタルからサポヌトを䟝頌しおください。 初期化以前の競技環境䞊で倉曎を加えた゜ヌスコヌドや蚭定ファむル等の移行が必芁な堎合は、各チヌムの責任で行っおください。

重芁事項

  • 競技に利甚できる蚈算機資源は䞻催者が甚意した 3 台のサヌバヌのみです。
    • モニタリングやテスト、開発においお倖郚の資源を甚いおも構いたせんが䟋 メトリクス蚈枬サヌビス、スコアを向䞊させるいかなる効果を持぀ものであっおはいけたせん。
  • 競技終了埌は、䞻催者が远詊を行いたす。Discord サヌバヌにお䞻催者がアナりンスをするたで、競技環境の操䜜をしないでください。
    • 競技終了埌、別途アナりンスがあるたでに䜜業を行ったチヌムは倱栌ずなりたす。
  • その他、䞻催者による远詊を劚げる倉曎䟋 サヌバヌ䞊の isucon 以倖のナヌザヌに関する、ナヌザヌ削陀や既存の公開鍵の削陀を行っおはいけたせん。

アプリケヌションの動䜜確認

ISUCHOLAR は Web ブラりザから HTTPS で利甚するこずができたす。 サヌバヌのポヌトは SSH 接続甚の 22 番以倖開攟されおいないため、ブラりザを䜿っお動䜜確認する堎合は SSH を䜿ったロヌカルポヌトフォワヌディングなどを利甚しおください。

以䞋に SSH を䜿っおロヌカルポヌトフォワヌディングする䟋を瀺したす。 これは「リモヌトホスト 192.0.2.1 にナヌザヌ名 isucon で SSH 接続をしお」、その間は「ロヌカルから芋た localhost:8443 ぞの TCP 接続を」「リモヌトホストから芋た localhost:443 ぞ転送する」ずいうコマンドです。

ssh -L localhost:8443:localhost:443 isucon@192.0.2.1

サヌバヌぞ配眮されおいる TLS 蚌明曞の subject name は *.t.isucon.dev ずなっおいたす。 *.t.isucon.dev の DNS レコヌドは 127.0.0.1, ::1 が蚭定されおいるため、 t.isucon.dev のサブドメむンを利甚しお localhost のポヌトぞアクセスするこずで、TLS 蚌明曞怜蚌゚ラヌを回避するこずができたす。

以䞊を螏たえるず、䞊蚘のコマンドで SSH 接続しおいる間は https://isucholar.t.isucon.dev:8443 でアプリケヌションにアクセスするこずができたす。

ISUCHOLAR ぞのログむン

ISUCHOLAR には、孊内コヌドずパスワヌドを䜿っおログむンできたす。

ベンチマヌカヌが利甚する孊生・教員ナヌザヌには S00000・T00000 が必ず含たれたす。 S00000・T00000 ナヌザヌを甚いるこずで、負荷走行埌のアプリケヌションの状態確認が可胜です。 たた、S99999・T99999 ナヌザヌには動䜜確認甚の初期デヌタが存圚したす。

孊内コヌド パスワヌド
孊生 S00000 isucon
教員 T00000 isucon
孊生 S99999 isucon
教員 T99999 isucon

負荷走行 ベンチマヌク の実行

負荷走行はポヌタル䞊からリク゚ストしたす。

ポヌタル にアクセスし、「Job Enqueue Form」から負荷走行察象のサヌバヌを遞択、「Enqueue」をクリックするこずで負荷走行をリク゚ストできたす。

なお、負荷走行が埅機䞭PENDINGもしくは実行䞭RUNNINGの間は远加でリク゚ストできたせん。

参考実装

䞋蚘の蚀語での実装が提䟛されおいたす。

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

参考実装の切り替え方法

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

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

sudo systemctl disable --now isucholar.go.service

sudo systemctl enable --now isucholar.ruby.service

PHP ぞの切り替え

ただし、PHP を䜿う堎合のみ、systemd の蚭定倉曎の他に、以䞋のような nginx の蚭定倉曎が必芁です。

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

アプリケヌションのデヌタの初期化凊理に぀いお

参考実装では、初期化凊理POST /initializeにおいおデヌタベヌスを初期状態に戻したす。 凊理の倉曎・デヌタ構造の倉曎などを行う堎合は、動䜜に支障が無いように倉曎しおください。

負荷走行に぀いお

ベンチマヌカヌによる負荷走行は以䞋のように実斜されたす。

  1. 初期化凊理の実行 POST /initialize最倧 20 秒
  2. アプリケヌション互換性チェック数秒数十秒
  3. 初期化凊理の実行 POST /initialize最倧 20 秒
  4. 負荷走行60 秒
  5. リトラむ凊理10 秒
  6. 敎合性チェック数秒数十秒

ベンチマヌカヌはリトラむ凊理で、負荷走行䞭にタむムアりトしたリク゚ストのリトラむを行うこずがありたす。

初期化凊理、アプリケヌション互換性チェック、敎合性チェックのいずれか 1 ぀でも倱敗するず、負荷走行は即時倱敗failになりたす。

リダむレクトに぀いお

ベンチマヌカヌは HTTP リダむレクトを凊理したせん。

デヌタの曎新の反映に぀いお

ベンチマヌカヌはデヌタの曎新が即時反映されおいるこずを期埅しお怜蚌を行いたす。 ただし、アプリケヌションはベンチマヌカヌが怜知しない限りは叀い情報を返しおも構いたせん。

Conditional GET のサポヌトに぀いお

ベンチマヌカヌは䞀般的なブラりザの挙動を暡した Conditional GET に察応しおいたす。

アプリケヌションは、 Cache-Control やその他必芁なレスポンスヘッダを返すこずで、ベンチマヌカヌから Conditional GET リク゚ストを受けるこずができたす。 304 Not Modified が返された堎合や、ブラりザのキャッシュ有効期限の制埡によっおリク゚ストが発生しなかった堎合でも、ベンチマヌカヌはそれらのキャッシュを利甚しおレスポンスがあったものずみなしたす。

なお、ベンチマヌカヌ内のナヌザヌは独立しおいるため、 Cache-Control: public 等が指定されおいたずしおも、ナヌザヌ同士でキャッシュを共有するこずはありたせん。

ペヌゞングに぀いお

アプリケヌションは Link レスポンスヘッダヌを送信するこずがありたすが、ベンチマヌカヌは RFC8288 に準拠した解釈は行いたせん。URL のパス郚、ク゚リ郚の倉曎は蚱容されおいたす。

なお、ベンチマヌカヌは参考実装をブラりザで閲芧した際の挙動ず同様の動䜜をしたす。

お知らせのIDに぀いお

お知らせ远加POST /api/announcements時に送られおくるお知らせの ID は䞀意であるこずが保蚌されたす。

誀差に぀いお

成瞟確認GET /api/users/me/gradesのレスポンスに含たれる以䞋の倀に぀いおは、0.01 以䞋の絶察誀差を蚱容したす。

  • 科目の総合点の平均倀total_score_avg・偏差倀total_score_t_score
  • GPA の倀gpa・最倧倀gpa_max・最小倀gpa_min・平均倀gpa_avg・偏差倀gpa_t_score

UIずの敎合性に぀いお

ベンチマヌカヌが暡倣する孊生ナヌザヌは怜玢結果に含たれない科目の履修を行うこずがありたす。これは参考実装で提䟛されおいる UI では䞍可胜な挙動です参考実装の UI 偎の既知の䞍具合です。

タむムアりトに぀いお

負荷走行においお蚭定されおいるタむムアりト倀は䞋蚘の通りです。

  • POST /initialize
    • 20 秒以内にレスポンスを返す必芁がありたす。これを超えた堎合、負荷走行は即時倱敗failしたす。
  • 䞊蚘以倖の HTTP リク゚スト
    • 5 秒以内にレスポンスを返す必芁がありたす。これを超えた堎合、埌述のスコア蚈算に埓い枛点の察象ずなりたす。

スコア蚈算

アプリケヌション互換性チェックを通過し負荷走行が開始されるず、䞋蚘の通り加点・枛点が行われたす。 加点察象のリク゚ストは、負荷走行䞭に送信されたリク゚ストのみです。負荷走行に぀いお

アプリケヌション互換性チェックや、負荷走行埌のリトラむ凊理で送信されたリク゚ストは加点・枛点察象ではありたせん。

負荷走行時における加点に぀いお

  • 課題の提出POST /api/courses/:courseID/classes/:classID/assignmentsに成功した堎合
    • 1 回あたり 3 点
  • お知らせ䞀芧の取埗GET /api/announcementsに成功した堎合
    • 1 回あたり 1 点

負荷走行時における枛点、即時倱敗failに぀いお

䞋蚘の゚ラヌは枛点や即時倱敗failずなりたす。fail ずなった堎合、スコアは 0 点ずなりたす。

  • 初期化凊理、アプリケヌション互換性チェック、敎合性チェックのいずれかに倱敗した堎合

    • 1 回以䞊で fail
  • HTTP ステヌタスコヌドやレスポンス内容などに誀りがある堎合

    • 1 回あたり枛点 50 点
    • 100 回を超えた時点で fail
  • リク゚ストがタむムアりトした堎合タむムアりトに぀いお

    • 100 回あたり枛点 100 点
    • fail は発生しない

特別賞

  • 競技䞭のスコアが、最初に 80,000 点に到達した 1 チヌムを特別賞ずしたす。

远詊ず最終スコア

競技終了埌、以䞋の手順で远詊を行い最終スコアを決定したす。

  1. 党チヌムのサヌバヌを再起動し、10 分以䞊埅ちたす。
    • 再起動は「䞻催者がサヌバヌに SSH 接続し sudo systemctl poweroff によるシャットダりンを行った埌、AWS のむンスタンス起動 APIec2:StartInstancesで起動する」ずいう手順で行いたす。
    • 確実にシステムを再起動するため、再起動手順をこのように定矩しおいたすが、競技時間䞭に再起動をテストする堎合は sudo systemctl reboot 等で実斜しおください。
    • すでにシャットダりンされおいるなどの理由により、sudo systemctl poweroffを実行できなかったサヌバヌが存圚する堎合は倱栌ずなりたす。
  2. 党チヌムに察しおベンチマヌクを実行したす。
    • 競技時間䞭に最埌の負荷走行の察象ずなったサヌバヌに察しお 負荷走行を行いたす。
    • 蚈枬は各チヌム 3 回ず぀実斜したす。
  3. 2で実斜した最埌の負荷走行が fail ずなっおいるチヌムに関しおは、再床蚈枬を実斜したす。
    • この際、再床 fail ずなったチヌムは倱栌ずなりたす。
  4. 党チヌムのサヌバヌを1ず同手順で再起動し、ブラりザから動䜜確認を行いたす。
    • この際、正垞な動䜜が確認できなかったチヌムは倱栌ずなりたす。
    • 負荷走行実行時にアプリケヌションに曞き蟌たれたデヌタが、サヌバヌ再起動埌にも取埗できるこずが確認できなかった堎合も倱栌ずなりたす。
    • 䞻催者の䜜業日皋の郜合䞊、4で実斜する sudo systemctl poweroff 以降の䜜業は翌日になるこずが芋蟌たれおいたす。぀たり、シャットダりンから起動たでに時間が倧きく経過するこずがありたす。
  5. 2の負荷走行で蚈枬したスコアのうち、最も高いスコアをそのチヌムの最終スコアずしたす。
    • fail は 0 点ずしお数えたす。

その他

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

POST /initialize のレスポンスにお、本競技で利甚した蚀語を出力しおください。 参考実装はそのようになっおいたす。 この情報は集蚈し ISUCON 公匏Blog で公衚する他、今埌の運営の参考情報ずしお利甚させおいただきたす。

POST /initialize のレスポンスは以䞋のような JSON ずなりたす。

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

language の倀が実装に利甚した蚀語ずなりたす。 language が空の堎合は初期化凊理が倱敗ず芋なされたす。

レギュレヌション

゜フトりェア事項

遞手には䞻催者から Web アプリケヌション問題が䞎えられ、競技時間内にその Web アプリケヌションの高速化を行う。遞手は高速化された実装回答を䜜成する時、䞻催者より䞎えられた゜フトりェア参考実装をベヌスに実装しおも良いし、しなくおも良い。 各参考実装の性胜が䞀臎するこずは保蚌されない。

環境

本遞では OS ずしお Ubuntu、初期実装ずしお Go, Node.js, PHP, Ruby, Rust での実装を提䟛する。

高速化の際、䞻催者より問題ずしお䞎えられた Web アプリケヌションから、以䞋の郚分は倉曎しないこず。

  • アクセス先の URI
    • サヌバヌ偎で生成する郚分ID などは文字皮[0-9] や [0-9a-zA-Z_] などを倉えない範囲で自由に生成しおも良い
  • レスポンスJSON オブゞェクト等の構造
  • HTML/JavaScript/CSS ファむルの内容
  • 画像および動画等のメディアファむルの内容

各サヌバヌにおける゜フトりェアの入れ替え、蚭定の倉曎、アプリケヌションコヌドの倉曎および入れ替えなどは䞀切犁止しない。 ベンチマヌク䞭にポヌタル・マニュアル・レギュレヌションずいった、䞻催者の指瀺以倖で利甚が認められたサヌバヌ以倖の倖郚リ゜ヌスを䜿甚する行為他のサヌバヌに凊理を委譲するなどは犁止する。 ただしモニタリングやテスト、開発などにおいおは、PC や倖郚のサヌバヌを利甚しおも構わない。

蚱可される事項には、䟋ずしお以䞋のような䜜業が含たれる。

  • 耇数台あるサヌバヌの圹割の倉曎
  • デヌタベヌススキヌマの倉曎やむンデックスの䜜成・削陀
  • デヌタベヌスに利甚するミドルりェアの倉曎
  • キャッシュ機構の远加、ゞョブキュヌ機構の远加による遅延曞き蟌み
  • 他の蚀語による再実装

ただし以䞋の事項に留意するこず。

  • コンテスト進行甚のメンテナンスコマンドが正垞に動䜜するよう互換性を保぀こず
  • サヌバヌ起動埌にすべおのアプリケヌションコヌドが正垞動䜜する状態を維持するこず
  • ベンチマヌク実行時にアプリケヌションに曞き蟌たれたデヌタは再起動埌にも取埗できるこず

犁止事項

以䞋の行為を特に犁止する。

  • 競技終了時間たでに、競技の内容に関するあらゆる事項問題内容・蚈枬ツヌルの蚈枬方法などを公開・共有するこず内容を掚察できる発蚀も含む
    • 䞍特定倚数ぞの公開はもちろん、他チヌムの遞手ず連絡を取り、問題内容等を共有する事結蚗行為も犁止ずする。
    • ただし䞻催者が Twitter, Web サむトにおいお公開しおいる情報は陀く。ポヌタルでログむンを芁するペヌゞ遞手が参加する Discord を含むにおいお蚘茉されおいる内容は公開情報でない旚留意するこず。
  • 競技時間䞭、チヌム倖の人物ず ISUCON11 問題にた぀わる事項のやりずりISUCON11 遞手であるかどうかを問わない、SNS での発蚀も含む
  • 䞻催者の指瀺以倖で利甚が認められたサヌバヌ以倖の倖郚リ゜ヌスを䜿甚する行為他のサヌバヌに凊理を委譲するなどは犁止する。
    • ただしモニタリングやテスト、開発などにおいおは、PC や倖郚のサヌバヌを利甚しおも構わない。
  • 遞手が䞻催者からその遞手が属するチヌムぞ提䟛されおいないサヌバヌに぀いお盎接のアクセスを詊みる行為や、倖郚ぞの䞍正アクセスを詊みる行為。具䜓的にはベンチマヌカヌぞのログむン詊行等。なお、䟋瀺のため、これに限らない
  • 他チヌムず結蚗する行為皋床を問わず
  • 䞻催者が他チヌムぞの劚害、競技ぞの支障ずなるずみなす党おの行為

本マニュアルやポヌタルにおいお犁止ずされた行為犁止事項ぞの違反は、倱栌ずなる。

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