ISUCON公式Blog

WINNER'S PRIZE \1,000,000



   

ローカル環境でISUCON9予選のアプリケーションとベンチマーカーはGoとMySQLとDockerがあれば、Macなどローカル環境で動かすことができます。

ソースコードの取得

まず、ソースコード一式をもってきます
$ go get -d github.com/isucon/isucon9-qualify
$ cd $GOPATH/src/github.com/isucon/isucon9-qualify


初期データの作成

ベンチマーカー、アプリケーション両方が使う初期データの生成をします。
$ cd initial-data
$ make

makeを実行するとDocker コンテナの中で初期データの作成を行い、
initial-data/result
に結果が出力され、
webapp/sql
以下へのコピーも行われます。
パスワードの生成があるため、時間がかかります。

画像データの展開

初期データの画像とベンチマーカーが使う画像をダウンロードする必要があります。
ファイルは github releaseからダウンロードできます。1.5GB程度のファイルが2つとなりますので、回線状況のよいところでのダウンロードをおすすめします。

https://github.com/isucon/isucon9-qualify/releases

初期画像データダウンロード
$ cd webapp/public
GitHub releases から initial.zip をダウンロード
$ unzip initial.zip
$ rm -rf upload
$ mv v3_initial_data upload

ベンチマーク用画像データダウンロード
$ cd initial-data
GitHub releases から bench1.zip をダウンロード
$ unzip bench1.zip
$ rm -rf images
$ mv v3_bench1 images


データベースの作成と初期化

isucariデータベースとユーザの作成をします。
$ cd webapp/sql
$ cat 00_create_database.sql | mysql

mysqlのポート、ユーザとパスワードは環境に合わせて指定してください。
初期化はinit.shを実行します。
$ cd webapp/sql
$ ./init.sh

環境変数によってMySQLのホストやポート番号を変更できます。詳しくはinit.shの中をご覧ください。

アプリケーションの実行

Goの参考実装を起動してみます。
Goのバージョンは1.12以上で確認しています。
$ cd webapp/go
$ GO111MODULE=on go run api.go main.go

この状態で、ブラウザで http://localhost:8000/ をみるとISUCARIのログイン画面がでてくるはずです。
MySQLのホストやポート番号を変更する場合は、
webapp/sql/init.sh
を参考に環境変数を指定してください。試せるログインユーザは
docs/manual.md
に書かれています。

外部サービスの起動

アプリケーションは起動してますが、外部サービスがないため、購入時などにエラーになります。

payment service、shipment service の起動が必要です。

まず、各サービスをbuildします。
$ cd $GOPATH/src/github.com/isucon/isucon9-qualify
$ make

payment service、shipment service とベンチマーカーのバイナリができます。

それぞれ別ターミナルにて、
$ ./bin/payment

port 5555でpaymentが
$ ./bin/shipment

port 7000 で shipmentが起動します。
これでISUCARIが使えるようになるはずです。

ベンチマークの実行

ベンチマーカーがpayment、shipmentサービスを内包しているので、立ち上げた両サービスは停止する必要があります。

アプリケーションのみが起動していることを確認したら
$ ./bin/benchmarker

とすると、initializeのフェーズからベンチマークが動き始めます。

ベンチマーカーとアプリケーションを別ホストで動かす場合は、benchmarkerの起動時にURLを設定する必要があります。詳しくは
README.md
か ヘルプ
benchmarker -h
を参考にしてください。

参考までに MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) Intel Core i5 4 CPU モデルでの初期スコアは
2019/09/13 00:12:29 main.go:180: === final check ===
2019/09/13 00:12:29 main.go:212: 3020 0
{"pass":true,"score":3020,"campaign":0,"language":"Go","messages":[]}

これぐらいになりました。httpsでの通信がないためか予選時よりスコアは高くなっています。

なお上記の環境でベンチマークを実行すると、ファンがうねり、バッテリーが1-2%減ります。用法用量を気をつけて実行してください。よいスコア出ましたら、以下のissueに実行した環境と変更点など報告してもらえると、嬉しいです。

https://github.com/isucon/isucon9-qualify/issues/569

どうぞお試しください。
Read more...

9/12 22:00 自己申請による失格について再度検討を行った結果を追記しました
9/12 18:00 平文での格納について一部表現を変更しました
9/11 21:38 本選出場の取り消し無効にする対応を追記しました
9/11 17:30 bcrypt についての一部表現を訂正しました
9/11 17:09 経緯についての追記を行いました

ISUCON9 予選においてレギュレーション違反があり、本選出場者の繰り上がり対応を行いました。

経緯としては、マニュアルの制約事項にあった「パスワードを平文で保存すること禁止する」が該当しました。パスワードの保存の規定については、ISUCONの競技の性質上すべてをチェックすることは難しく、参加者の申告に基づき判断をしております。そのため、競技終了後すぐに判断することは出来ずこのタイミングとなりました。

[9/11 17:30 追記]
運営の対応についていくつかのポイントで説明責任があると考え、追記いたします。

◾️ 問題作成の経緯について
課題アプリケーションのパスワード保存にbcryptを採用した経緯ですが、参考実装を提供する各言語で実装があり、saltの付与やストレッチングが可能であり安全なアルゴリズムとして広く利用されていると判断し、採用しました。

ベンチマークの試行中において、キャンペーン機能による大量の購入リクエストを行うため、ログインが多く発生するようになっています。その結果として課題アプリケーションに問題作成者自ら取り組んだところでも、bcryptによるCPU使用率が目立つことは認識しておりました。

bcryptによる負荷の対処方法として、サーバを追加、軽量なハッシュ関数での代替、あるいは平文での保持を開発チームにおいて想定しましたが、現実の問題として、パスワードなどの情報流出などの事件が発生しており、安全性の高くないアルゴリズムの利用、平文での格納は一般的に推奨されない実装方法だという認識を同時に持ちました。
※9/12 18:00 一部表現を変更しました

ISUCONの課題アプリケーションとして、bcrypt の負荷を解決し高いスコアを出す方法がサーバの追加の一つだけであることは避けたく、bcryptの変更禁止ではなく軽量なハッシュ関数での代替を可能とする、「平文での格納を認めない」という文言をマニュアルに追加しました。例え、bcryptの維持であってもそれを検証することは難しく、参加者からの申告をもって失格の判定を行えば十分であろうと想定しておりました。
※bcryptについて、一部表現を訂正しました

■競技中に繰り返し質問をしたにも関わらず回答が得られなかった内容で失格とするのは問題があるのではないかという意見について
当日のサポートチャットのログを掲載しながら説明いたします。このサポートチャットはそれぞれの日に参加している参加者全員が見ることができるもので、 #general という参加者全員が参加しているチャンネルでのやりとりです。該当のレギュレーションについては何度かサポートチャットで話題にあがりました。

12:12 表記について指摘があり説明を行いました
dis02


14:34 表現について指摘があり修正をすることになりました
dis01


14:41 #announce  という運営からのお知らせのみを発信するチャンネルにて、マニュアルの更新を行ったことを案内しました
dis05


15:16 該当チームより質問がありましたが回答しませんでした
dis03


16:00 再度、該当チームより質問がありましたが回答しませんでした
dis04


当日、2度に渡りメンションがありましたが、回答がされていないことを確認しました。未回答となったことについては不親切であり、参加者の方には不満と感じる点であったかと思います。申し訳ありません。

背景を説明させていただきますと、競技の前提条件をまとめた予選マニュアルにこのように記載しています。
サポートは事前に連絡のあったDiscord のチャンネルにて行いますが、基本的に、予選環境の構成・操作方法やベンチマーカーの処理内容については返答しません。 また、以下のURLにこれまで返答された質問などがまとめられています。 何かある時には一度ご覧ください。
ISUCONでは基本的にマニュアルに記載があることについての質問には未回答としたり「マニュアルを読んでください」という回答を行うことが多くあります。

マニュアルに記載があること以上の情報を提供することは1日目と2日目の情報量に差が出てしまうため慎重に行いたいというのが運営側の姿勢です。競技中もDMにて質問が寄せられることが多いため「個人情報やアカウント情報のやりとり以外の、問題に関するお問い合わせはDMではなく #general にお願いします」といったアナウンスも行っています。

とはいえ、全ての質問に答えないということはもちろんなく、マニュアルの記載ミスやバグと思われる挙動についてはサポートチャットにて回答を行っていました。該当チームより質問があった際は「明確に定義して回答するべきものではない」「マニュアルに書いてある以上のことは答えようがないから未回答でよい」という運営側の判断がありましたが、参加者にとっては不親切であったかと思います。答えられません、といった回答をするべきであったと考えます。

■ ブログに書いてあったことを根拠として処理するのは問題があるのではという意見について
書いてあることが全てではないと考えますので、該当チームの方へ連絡する際にはこのような文面でありました。事実でない場合は失格処分の取り消しを行う体制でした。
ブログに書かれているパスワードの保存の実装が事実であれば、運営チームで
協議した結果としては失格に相当だと判断いたしました。



■ レギュレーション確認が出来ないポイントについて、ブログで情報を公開したことにより後出しで失格となるのは問題があるのではないかという意見について
ブログについては運営から「是非ブログを書いてください」と促しているように、積極的に情報を共有していただき次回の参加者やご自身の振り返りのためにお願いしていることですので問題としては切り分けて考えていただきたいと思っています。ブログを書くと失格になるというのは間違いであり、内容に問題があれば対処を行うというだけですので誤解のないようお願いいたします。

イベントのハッシュタグがついた状態でブログエントリが公開された段階で運営側で協議を開始し対応を行った形ですが、他の参加者の方から「不正行為にあたるのではないか」「データベース上の領域に平文の文字列はそのままの形で保存されるのは平文で保存ではないか」「平文がそのまま保存されているのは明確にルールに違反する」といった連絡が運営側に寄せられました。

前述したように「参加者からの申告をもって失格の判定を行う」というスタンスであったため、公開された情報を元に別のチームの参加者からの問い合わせに応えるという形で失格という判断にいたりました。



追記は以上となります。これまでに9回開催した全てのISUCONの運営窓口を担当していますので、参加者の皆さんが本気で問題と向き合っていることや、一年に一度の楽しみとして参加していただいているのは実感しています。参加者の皆さんには出来るだけ公平な状況で競技に臨んでいただきたいという運営側のスタンスが強く出てしまった点があったかと思いますが、今回のような望まない形で話題になってしまうのは本意では有りません。

これまでにISUCONの運営に関わってきていただいた多くの皆さん、楽しいと言ってくださる参加者の皆さんに対して誠意を持って運営を行ってきたと思いますので、これからも楽しく、挑戦しがいのある問題や環境を作っていけるよう、皆様のご協力をいただければ幸いです。


ISUCON9 運営実行委員会 櫛井

[9/11 21:38 追記]
運営チームで協議をおこない、本選出場者の繰り上がり対応が適切ではないと判断したため本選出場の取り消しを無効とすることとしました。なお、繰り上がりとなったチームについてはそのまま本選出場できるものとします。
自己申告により本選出場辞退されたチームについては意向を確認中で、希望されれば本選出場できるものとします。特にレギュレーションなどで定義していませんが、運営判断ということでご理解いただければと思います。

[9/12 22:00 追記]
チーム「H::W::A::Abyss::Abyss::Abyss」は競技後にレギュレーション違反の自己申請があり失格とさせていただきました。レギュレーション違反対応の再検討の際、自己申請による失格についても再度検討を行い、運営の方針変更による失格とさせていただきました。
Read more...

9/13 20:30 追記:無事にお手伝いいただける方が集まりました。ご協力いただきありがとうございました。

---
惜しくもISUCON9で予選敗退された皆様へお知らせです。9月25日(水)の午後12時から19時くらいで、オンラインにてご参加いただきます。午後にオンラインで「ISUCON9 本選の事前テスト回答」を開催し、協力を募る予定でおります。当日は本選問題の難易度やボリュームの確認も行いたいので、該当時間中は集中して回答をお願いいたします。

ご参加いただけそうな場合、以下をご確認いただき全て問題なければ応募フォームからお申し込みください。なお、謝礼は出ない予定ですが本選当日に運営が見るポータルサイト閲覧権限を付与する予定です。
  • 過去にISUCONに参加した方に限定します
  • 事前回答時の参考実装はGoを予定しています
  • 2人または3人チームで参加してください
  • ISUCON9 オンライン予選時と違うメンバー構成でもOKです
  • 3組程度の募集とします
  • 応募が多数となった場合は過去のISUCON参加時の成績を参考に、運営側で選考させていただく予定です
  • 9月25日(水)の午後12時から19時まで他の予定が入らないようご調整ください
  • 本選当日、会場にお越しいただけません


  • 応募締切は 9月13日(金) 20:00まで。お手伝いいただくか否かは締切後すぐにご連絡いたします。宜しくお願いします!

    応募はこちらからお願いいたします。
    ISUCON9 本選問題 事前回答協力フォーム

    Read more...

    ↑このページのトップヘ