Skip to content

Instantly share code, notes, and snippets.

@mirakui
Last active April 7, 2019 02:51
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mirakui/e394ed543415852d34a6 to your computer and use it in GitHub Desktop.
Save mirakui/e394ed543415852d34a6 to your computer and use it in GitHub Desktop.
ISUCON4 予選当日マニュアル

ISUCON4 予選当日マニュアル

当日の流れ

  • 10:00 競技開始
  • 18:00 競技終了
  • 2014年9月29日 10:00 (JST) までに AMI を提出

ISUCON4 予選ポータルサイト

http://isucon4-portal.herokuapp.com/

上記リンクを開き、チームの API キーを入力してログインしてください。 benchmarker(後述)で測定したスコアはこのポータルに送られ、集計結果を見ることができます。

競技終了後、AMI の提出もこのポータルから行います。

Getting Started

はじめに以下の操作を行い、問題なく動くかを確認して下さい。

1. 指定された AMI で EC2 インスタンスを起動する

AWS のクーポンコードを利用する場合、EC2 インスタンスを起動する前に以下の URL からコードを入力してください。

https://console.aws.amazon.com/billing/home#/credits

以下の設定で EC2 インスタンスを1台起動してください。

  • Instance Type: m3.xlarge

  • EBS Optimization: なし

  • Root Volume: 8GB, Magnetic

    • General Purpose (SSD) は使わないでください。 必ず Magnetic を使ってください。

    • AWS Management Console を利用して起動する場合、"Step 7: Review Instance Launch で Storage volume type が standard になっている事を確認してください。

      vol_standard

      • もし gp2 などになっている場合は、Edit Storages から Magnetic を選択してください。
      • 以下のようなダイアログが出ることがありますが、 Magnetic を選択してください。
        • use_magnetic
  • Security Group: TCP 22 (SSH)TCP 80 (HTTP)Inbound 0.0.0.0/0 から利用できるようにしてください。

2. 起動したEC2インスタンスに ec2-user ユーザで SSH ログインする

例:

ssh -i ~/.ssh/your_private_key.pem ec2-user@xx.xx.xx.xx

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

EC2インスタンスのパブリック IP アドレスにブラウザでアクセスし、動作を確認してください。以下の画面が表示されるはずです。

top_ss

例として、ここで求められる「お客様ご契約ID」は isucon1、 「パスワード」は isuconpass1 を入力することでログインが行えます。

その他の利用可能な ID・パスワードについては、 /home/isucon/sql/dummy_users.tsv に記載されています。 この TSV ファイルの第2カラムと第3カラムが、それぞれ「お客様ご契約ID」と「パスワード」です。

# dummy_users.tsv
1	isucon1	isuconpass1	salt1	6d7de4d284887f04c5a1d9e3431e9d7865a88bb6a7eab73ea6a22ac2d51d4db0
2	isucon2	isuconpass2	salt2	70f91bb24f94f2da37aeaeef0727a350190ce2a765d589da33d7c5f29b0039cc
3	isucon3	isuconpass3	salt3	6a303e306193775296190f831418784a59a281a3fae688d0aea0ae546a93e6c2
...

なお、ブラウザでアクセスできない場合、EC2 インスタンスの Security Group の 80 番ポートが開いていることを確認してください。

4. 負荷走行を実行

EC2 インスタンス上で以下の操作を行ってください。

[ec2-user@ip-xxx ~]$ sudo su - isucon
[isucon@ip-xxx ~]$ ls
benchmarker  env.sh  gocode  init.sh  sql  webapp
[isucon@ip-xxx ~]$ ./benchmarker bench --api-key あなたのチームのAPIキー

この操作後、ポータルにて、あなたのチームのスコアが反映されているか確認して下さい。

ディレクトリ構成

参考実装のアプリケーションコードおよび、スコア計測用プログラムは /home/isucon ディレクトリ以下にあります。

/home/isucon
  ├ benchmarker  # スコア計測用プログラム
  ├ init.sh      # 初期化スクリプト
  ├ env.sh       # アプリケーション用の環境変数
  ├ sql/         # データベース初期化用SQL (benchmarker および init.sh で利用)
  └ webapp/      # 各言語の参考実装

参考実装の言語切り替え方法

参考実装の言語は Ruby, Python, PHP, Perl, Go, Node.js が用意されており、初期状態では Ruby の実装が起動しています。

80番ポートでアクセスできるので、ブラウザから動作確認をすることができます。

起動する実装を Ruby 以外に切り替えるには、まず supervisord を終了させます。

sudo /etc/init.d/supervisord stop

その後、 /etc/supervisord.conf において希望の言語を autostart=true にし、 [isucon_ruby]autostart=false したうえで、

sudo /etc/init.d/supervisord start

を実行することで切り替えることができます。

PHP の場合

なお、PHP を利用する場合のみ、上記に加えて、以下の操作を行ってください。

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
sudo mv /etc/nginx/nginx.php.conf /etc/nginx/nginx.conf
sudo /etc/init.d/nginx restart

benchmarker

benchmarker の help は以下のコマンドで見ることができます。

[isucon@ip-xxx ~]$ ./benchmarker help bench
(ヘルプが表示される)

benchmarker のおもな仕様は以下のとおりです。

  • --api-key を指定すると、負荷走行の成功時には、ポータルにスコアが送信される。
  • ポータルが受理したスコアのうち最後のスコアが、そのチームのスコアとして採用される。
  • --workload N オプションで負荷走行の並列度を指定することができる。並列度は1以上の整数で、どのような値を指定してもよい。
  • --init FILE オプションで負荷走行開始前に実行される初期化スクリプトを指定できる。デフォルト値は /home/isucon/init.sh であり、このスクリプトではデータベースの初期化を行っているので、参考のこと。なお、初期化スクリプトは1分以内に完了しなければならない。
  • AMIの提出時には、最終スコアが計測された時の benchmarker の起動オプションもあわせて提出する。
  • 負荷走行の最後に、 benchmarker は5秒の待ち時間をおいた後、 /report にリクエストを行う。この /report は1分以内にレスポンスを返さなければならない。
  • benchmarker は /home/isucon/sql/dummy_users.tsv/home/isucon/sql/dummy_users_used.tsv を利用しているため、これらのファイルの中身を編集してはならない。
    • 初期状態のチェックサムと異なる場合、benchmarker は起動しない。
  • benchmarker は X-Forwarded-For リクエストヘッダを変えながらアプリケーションに対しリクエストを行うので、アプリケーションではこれをリモート IP アドレスとして解釈する必要がある。

MySQL

3306 番ポートで MySQL が起動しています。初期状態では以下のユーザが設定されています。

  • ユーザ名: isucon, パスワード: isucon
  • ユーザ名: root, パスワードなし

なお、 /home/isucon/init.sh を実行することで、データベースおよびテーブルのデータを初期状態に戻すことができます。

ルール詳細

ISUCON4(2014) オンライン予選レギュレーション : ISUCON公式Blog

なお、予選レギュレーションと本マニュアルの記述に矛盾がある場合、本マニュアルの記述が優先されます。

スコアについて

スコアは加算方式であり、いかなるレスポンスにおいても減点は行われません。

  • 静的ファイルが期待通りのレスポンスを返す: 0.01点/req
    • ただし、MD5ハッシュ値が初期状態から変化していた場合は得点に加算されない
  • HTML が期待通りのレスポンスを返す: 1点/req
    • ただし /report のレスポンスは得点には加算されない
  • 負荷走行の完了時、スコアの小数点以下は切り上げられる

なお、以下の場合はスコアはポータルに送信されず、最終スコアとして採用されることはありません。

  • /report が1分以内にレスポンスを返さない
  • /report のレスポンスの内容が間違っている
  • API キーが設定されていないか、間違っている

以下の場合は、負荷走行は実行されず、スコアは送信されません。

  • /home/isucon/sql/dummy_users.tsv/home/isucon/sql/dummy_users_used.tsv が編集されている (初期状態のチェックサムから変化している)
  • --init オプションで指定したスクリプトが1分以内に完了しない

許容される行為

以下の行為は違反ではありません。

  • 見た目が変化しない程度に静的ファイルを変更する行為
    • なお、減色や圧縮などの最適化は許されるが、MD5ハッシュ値が変化するため、スコアには加算されなくなるので注意
  • 作業用に複数のEC2インスタンスを起動する行為
    • 提出したAMIを用いて、1台でスコアが再現できない場合は失格となるので注意
  • 作業用にEBSボリュームを追加する行為
    • 提出したAMIを用いて、ルートボリューム(8GB)のみでスコアが再現できない場合は失格となるので注意
  • その他、レギュレーションで許可されている行為

AMIの提出と審査について

競技終了後にポータル画面をリロードすると、AMI の提出画面へのリンクが表示されます。そこに表示されている指示に従い、期日までに AMI を提出してください。

審査員は、提出された AMI から EC2 インスタンス(m3.xlarge、ルートボリュームは Magnetic EBS 8GB)を1台起動したうえで、AMI 提出時に指定された起動オプションで benchmarker を実行し、スコアの再現性などについて確認を行います。

以下のいずれかに当てはまる場合は、失格にすることがありますので、十分に気をつけてください。

  • 期日までにAMIを提出できなかった場合
  • アプリケーションの見た目や挙動が著しく変化していた場合
  • 最終スコアより著しく低いスコアしか再現できなかった場合
  • インスタンス起動時に自動的にアプリケーションが立ち上がらなかった場合
  • その他、レギュレーションで規定された反則行為が確認された場合

当日サポートについて

競技中、別途アナウンスされる Idobata のチャットルームにて、サポートを行います。 ルールについてや、基本的なトラブルの質問にはお答えできますが、benchmarker およびアプリケーションに関する質問には原則として回答しません。予めご了承ください。

よくある質問

チャット等で問い合わせのあった質問と、その回答は以下に掲載しています。随時更新するので、質問する前に確認してみてください。

https://gist.github.com/sorah/08a26cc9ea3214365c82

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