Skip to content

Instantly share code, notes, and snippets.

@sota1235
Last active September 6, 2020 01:10
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sota1235/a7356a5909af264c1c1c840dd216c98f to your computer and use it in GitHub Desktop.
Save sota1235/a7356a5909af264c1c1c840dd216c98f to your computer and use it in GitHub Desktop.
ISUCON9予選マニュアル

ISUCON9 予選マニュアル

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

はじめに

スケジュール

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

ISUCON9 予選 ポータルサイト

予選進行は以下のポータルからベンチマーク走行のリクエスト・結果チェックを行って進行します。事前に登録した情報を用いてログインしてください。

このページは競技終了時間になると即座に閲覧不可能になります。ご注意ください。

https://portal.isucon.net/contest/

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

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

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

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

Alibaba Cloud上のサーバーインスタンス(ECS)を指定したOSイメージから起動し、利用します。インスタンスは最大3台まで起動することができます。

[確認] インスタンスの作成の時にセキュリティリスクなどでエラーが出て身分証明書の提出を求められる場合は、ISUCON運営側で対応しますので「Alibaba Cloudにログインしているメールアドレス」と「Alibaba Cloud Account ID(数字16桁)」を運営宛にご連絡ください。都度対応します。

[重要]競技終了後は、ベンチマーク走行成績の追試を行いますので、http://isucon.net/ にて運営からお知らせをするまで、インスタンスは終了しないでください。お知らせは当日夜あるいは翌日夜までに行います。

[重要]競技に利用する以外のインスタンスを起動していた場合は、競技終了までに停止するかリリースしてください。3台より多くのインスタンスが起動している場合、失格となります。やむを得ず、停止できないインスタンスがある場合は速やかに運営まで連絡してください

[重要]競技に利用できる計算機資源は主催者側が指定した3台までのインスタンスのみです。外部のメトリクス計測サービスの使用のみ特例として許可しますが、スコアを向上させるいかなる効果も持つものであってはいけません。

http://isucon.net/ において、運営から追試の終了と結果発表のお知らせが出たあとは、インスタンスを停止・リリースできます。料金が発生することもありますので、忘れずに対応お願いします。

作業開始

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

1. 予選用イメージファイルを利用したインスタンスの起動

予選用イメージファイル isucon9-qualify-v1 を用いてインスタンスを起動してください。 予選用イメージファイルはこのマニュアルの公開と共に、ポータルに登録されたAlibaba Cloudのアカウントに対して共有が開始されます。

起動するインスタンスのスペック

インスタンスのスペックは以下を指定してサーバーを起動してください。

  • 「エキスパート向け(Custom Launch)」

  • 価格モデル「従量課金(Pay-As-You-Go)」

  • リージョン「日本(東京)」、「アジア東北 1 ゾーンA」

  • インスタンスタイプ ecs.sn1ne.large と指定

  • 共有イメージ「共有イメージ」を指定、 「ポータル上で指定されるイメージ名」を指定

  • システムディスク「Ultra クラウドディスク」「40GiB」

  • ネットワークはVPC「デフォルトVPC」「デフォルトSwitch」を選択

    • 「イメージファイル展開の確認」を行なっている際は、その際に自動で作られたデフォルトVPC・Switchを使います
  • ネットワーク課金タイプで「トラフィック課金」で「100M」を入力

  • セキュリティグループは、HTTPポート80,HTTPSポート 443,ポート22を選択

    • 「イメージファイル展開の確認」を行なっている際は、その際に自動で作られたセキュリティグループを使います
  • ログイン認証は「キーペアの作成」を押してキーペアを作り、もどってから「更新」を押して選択する

    • 「イメージファイル展開の確認」を行なっている際は、その際に作成したキーペアも使えます
  • インスタンス名・ホストは自由に設定してください

  • RAMロールから「ISUCON9」を選択

    • 「イメージファイル展開の確認」の際に作成しています。作成していない場合は以下のblogを参考にしてください

事前にイメージの展開の確認をした際のインスタンススペックと同一になります。以下のblogも参考に予選用のイメージを指定して起動してください

http://isucon.net/archives/53665373.html

[確認] インスタンス起動後 /usr/local/bin/isucon-instance-checker を実行し、起動したインスタンスのスペックに誤りがないか確認できます

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

起動したインスタンスのグローバルIPアドレスに対して ssh してください。ログインにはインスタンス作成時に指定したキーペアを使います。sshログインするユーザ名は root です。

サーバーには予選終了後の主催者による追試のため、 isucon_admin ユーザーのアカウントがあります。

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

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

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

GET / へアクセスすることで、トップページにアクセスすることができます。 画面の「新規会員登録」から、ユーザを作成あるいは以下のテスト用ユーザが利用できます

id password
isudemo1 isudemo1
isudemo2 isudemo2
isudemo3 isudemo3

また、WebサーバーのグローバルIPアドレスにアクセスするとTLS証明書に関するエラーが表示されます。 このエラーを回避するにはWebサーバーのグローバルIPアドレスが198.51.100.200だった場合、MacやLinuxであれば/etc/hostsに以下の行を追加する必要があります。

198.51.100.200 isucon9.catatsuy.org

後述するベンチマークはこちらの証明書を使用します。

4. 負荷走行

ベンチマーク走行を行う際はポータルサイト上からリクエストします。 リクエストの際には対象となるサーバーの設定が必要です。 ポータルサイト上のServersタブにアクセスして、ベンチマーク走行を実行したいサーバーを追加してください。

その後、追加したサーバーをベンチマークの対象として設定を保存してください。

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

詳細については後述します。

参照実装の切り替え方法

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

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

$ sudo systemctl stop    isucari.golang.service
$ sudo systemctl disable isucari.golang.service
$ sudo systemctl start   isucari.perl.service
$ sudo systemctl enable  isucari.perl.service

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

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

リカバリ方法

DB(isucari)を初期状態にもどすには、次のコマンドを実行します。

$ /home/isucon/isucari/webapp/sql/init.sh

[開発用]shipmentおよびpayment serviceの利用について

アプリケーションを開発・確認する際に、利用可能なshipmentおよびpayment serviceを用意しています。以下の手順で利用することができます。

またAPIの詳細は「外部サービスAPIの仕様」 webapp/docs 以下の EXTERNAL_SERVICE_SPEC.md を参照してください。

利用方法

アプリケーションを利用する際はアプリケーションを起動した後、以下のように手動で POST /initialize を叩いて設定を反映してください。

$ cat initialize.json
{
  "payment_service_url":"https://payment.isucon9q.catatsuy.org",
  "shipment_service_url":"https://shipment.isucon9q.catatsuy.org"
}
$ curl -XPOST http://127.0.0.1:8000/initialize \
-H 'Content-Type: application/json' \
-d @initialize.json

またベンチマーク走行時にこの値は書き換わるので、ベンチマーク走行後に確認したい場合も都度実行する必要があります。

ISUCARIについて

ストーリー

ISUCARIは椅子を売りたい人/買いたい人をつなげるフリマアプリです。

  • 日々開発が進められ、先日もBump機能がリリースされたばかり
  • 世界的な椅子ブームを追い風に順調に成長を続け
  • さらなる成長を見込み社長は自腹による「イスコイン還元キャンペーン」を企画
  • しかし「イスコイン還元キャンペーン」の驚異的な拡散力により負荷に耐えられないことが発覚
  • 社長「緊急メンテナンスをいれていいので18時までに改修しろ。18時にプロモーション開始だ」

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

ISUCARIの使い方、紹介は「ISUCARI アプリケーション仕様書」 webapp/docs 以下の APPLICATION_SPEC.md を参照してください。

ルール詳細

指定された競技用サーバーインスタンス上のアプリケーションのチューニングを行い、それに対するベンチマーク走行のスコアで競技を行います。 利用が認められた競技用サーバーのみでアプリケーションの動作が可能であれば、どのような変更を加えても構いません。

ベンチマーカーとブラウザの挙動に差異がある場合、ベンチマーカーの挙動を正とします。

また、初期実装は言語毎に若干の挙動の違いはありますが、ベンチマーカーに影響のない挙動に関しては仕様とします。

商品取得APIと更新の反映について

ISUCARIには以下の商品取得APIがあります。

  • 新着一覧
  • カテゴリ毎新着一覧
  • ユーザ毎一覧
  • 取引一覧
  • 商品詳細

商品が出品・編集された場合は、カテゴリ毎新着一覧、ユーザ毎一覧、取引一覧、商品詳細APIに即座に反映してください。 編集・購入された商品については、全ての商品一覧・詳細取得APIで即座に情報を更新してください。 古いデータの削除、非表示はベンチマーク上で許可されません。各商品一覧取得APIが一度に返す商品数は初期実装と同じ状態を保つ必要があります。 新着一覧については、上記の制限を満たした上でよりユーザにあわせた商品の一覧を返すことで、購入の機会を増やすことができます。

キャンペーン機能

POST /initialize のレスポンスにて、イスコイン還元キャンペーンの「還元率の設定」を返すことができます。この還元率によりユーザが増減します。

POST /initialize のレスポンスは JSON 形式で

{
    "campaign": 0,
    "language": "実装言語"
}

campaignが還元率の設定となります。有効な値は 0 以上 4 以下の整数で 0 の場合はキャンペーン機能が無効になります。

languageについては別の項目で説明しています。

なお、イスコイン還元の費用が下で説明するスコアから引かれることはありません。

ベンチマーク走行

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

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

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

また負荷走行が60秒行われた後、レスポンスが返ってきていないリクエストはすべて強制的に切断されます。 その際にnginxのアクセスログにステータスコード499が記録されることがありますが、これらのリクエストについては減点の対象外です。

スコア計算

スコアは取引が完了した商品(椅子)の価格の合計(イスコイン) をベースに以下の計算式で計算されます。

取引が完了した商品(椅子)の価格の合計(イスコイン) - 減点 = スコア(イスコイン)

以下の条件のエラーが発生すると、失格・減点の対象となります。

  • 致命的なエラー
    • 1回以上で失格
    • メッセージの最後に (critical error) が付与されます
  • HTTPステータスコードやレスポンスの内容などに誤りがある
    • 1回で500イスコイン減点、10回以上で失格
  • 一定時間内にレスポンスが返却されない・タイムアウト
    • 200回を超えたら100回毎に5000イスコイン減点、失格はなし
    • メッセージの最後に (タイムアウトしました)(一時的なエラー) が付与されます

HTTPステータスコードは、基本的に参照実装と同一のものを想定しています。またベンチマーカーのメッセージは同一のメッセージを1つにまとめます。表示されているメッセージの数とエラー数は一致しないことがあります。

また減点により0イスコイン以下になった場合は失格となります。

制約事項

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

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

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

予選終了後に行われる主催者による確認作業(追試)において下記の点が確認できなかった場合は失格となります。

  • アプリケーションは全て保存データを永続化する必要があります
    • 処理実施後に再起動が行われた場合、再起動前に行われた処理内容が再起動後に保存されている必要があります
  • アプリケーションはブラウザ上での表示を初期状態と同様に保つ必要があります
  • 以下に示す改変を行ってはなりません
    • パスワードを平文で保存する

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

POST /initialize のレスポンスにて、本競技で利用した言語を出力してください。集計しblogで公表したり、参考情報として利用させていただきます。

POST /initialize のレスポンスは次のような JSON 形式になります。

{
    "campaign": 0,
    "language": "実装言語"
}

languageの値が実装に利用した言語となります。languageが空の場合はベンチマーカーは失敗と見なされます。

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

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

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

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

予選通過

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

各チームの終了時スコアに基づき予選通過者を決定します。 最後に提出したスコアがfailしていたチームは失格となります。 終了時スコアが同一だった場合、最高スコアが高かったチームを選出します。 最高スコアも同一だった場合は、最高スコアを出した時間が早いチームを選出します。

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

※9月7日 12:50 本選の選出方法を一部変更(終了時スコアが同一だった場合の選出基準を追加)

その他

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

ISUCON9faq.md

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