ISUCON公式Blog

WINNER'S PRIZE \1,000,000



   

こんにちは、櫛井です。
過去、二度に渡って開催いたしました ISUCON が再び開催です!

isuconlogo_2


ISUCONとは

お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。

というやつです!
今回もLINE株式会社にてイベントの企画・運営・会場・賞金提供などを行いますが、株式会社データホテルには今回もサーバ提供を、過去二度のディフェンディングチャンピオン「面白法人カヤック」の皆さんにはアプリ提供をご協力いただく事となりました。というわけで、今回はLINE株式会社、株式会社データホテル、面白法人カヤックの三社共催という形となります。

過去二回の様子はこちらをご覧ください
第二回 2012年11月03日(土)開催
livedoor Techブログ : #isucon2 リアルタイムフォトレポート 更新終了
第一回 2011年8月27日(土) 開催
livedoor Techブログ : 写真と動画で振り返る #isucon オフィシャルレポート

そして、前回の優勝賞金30万円も「相当すごいぜ」という盛り上がりでしたが、なんとなんと今回の優勝賞金は、大台ドーン!100万円です!がんばりました!皆様、ふるってご参加ください。



開催概要

今年も2〜3名1チームでの参加制としますが、より多くの方にISUCONへご参加いただきたいので予選を設定させていただきます。9月にオンライン上での予選、11月に LINE株式会社 渋谷ヒカリエにて本選実施という予定です。

本選への出場枠ですが、
・オンライン予選 TOP20チーム
・学生枠 3チーム
・共催枠 2チーム(LINE選抜チーム、カヤック選抜チーム)
の合計25チームを予定しています。

学生枠はチームメンバーが全員学生であること(休学中でもOK)を条件とさせていただきますが、オンライン予選にはご参加いただく必要がありますのでご注意ください。

本選会場は第二回会場となったLINE株式会社ヒカリエオフィスのカフェとなります。前回は少し狭かったので同フロアの別会場も提供予定です。なお、本選参加は当日渋谷ヒカリエにお越しいただける方のみとします。オンラインでの参加は不可とします。

また、予選と本選でチームメンバーの交代は出来ません。予選を3名で参加、本選を2名で参加するといった形はOKです。


よくありそうな質問

順次追加しますので、質問などは Twitter @941 までお願いします。DMでのやりとりがよければフォローいたしますのでMentionを飛ばしてください。

Q.予選は渋谷まで行く必要ありますか?
A.オンライン上で完結しますのでお越しいただく必要はありません

Q.1社あたり何チームまでとか制限ありますか?
A.ありません

Q.前回のチャンピオンと対決したいのですが
A.今回は出題側なので残念ながら参加されません

Q.予選はどんな問題ですか?本選はどんな問題ですか?
A.予選については随時お知らせします。過去問はこちらをどうぞ。
 livedoor Techブログ : 自家製 #isucon2 のつくりかた
 livedoor Techブログ : 自家製 #isucon のつくりかた
 本選の問題は当日まで秘密です。


予選の告知は改めて行いますので、参加しようかと思っている方はチームメンバー予定の方にお声がけし準備をしておいてください!
Read more...

2012/11/06 15:05にTech Blogにて公開された過去エントリです。
livedoor Techブログ : 自家製 #isucon2 のつくりかた

--
こんにちは、tagomorisです。ISUCON2 というイベントで主にレギュレーションを考えたりベンチマークツールを作ったりしていました。普段はNHN Japan ウェブサービス本部というところで働いています。
先日ISUCON2は幸いにも大好評のうちに終了しましたが、このお題および関係する話題をぜひ多くの人にも知っていただきたい! というかこのまま捨てるとかちょっともったいない! ということもあり、作業対象のアプリケーションコード、およびベンチマークツール一式を公開しています。
このエントリでは、これを用いて一式を動作させ、ご家庭でもISUCON2を再現できるよう、いくつかの手順をご説明していきます。ぜひみなさんも楽しいISUCON2ライフを満喫してください。


ざいりょう


今回は初期データはすべてWebアプリケーションのコードから投入されるため、このソースコード一式があればすべて本番時と同じように動作します。

ベンチマーク設定が本番時と同じ設定になっているため、たとえばノートPC1台ですべて動作させようと思うとかなり重いでしょう。その場合にはベンチマーク設定を変更します(後述)。

したごしらえ

ISUCON2環境を作成するPCですが、以下のものが動作する環境が必要です。カッコ内のバージョンはISUCON2本番環境で選択したものです。
  • ベンチマークツール
    • Node.js 0.8.x (0.8.12)

    • MySQL 5.x (5.5)

    • http_load

  • 対象アプリケーション(言語についてはどれかひとつ)
    • MySQL 5.x (5.5)

    • Perl 5.x (5.16.1)

    • Ruby 1.9.x (1.9.3)

    • Python 2.7 (2.7.3)

    • Node.js 0.8.x (0.8.12)

    • PHP 5.3- (5.3)

    • Java 6

各言語のインストールについては perlbrew, rbenv (or rvm), nodebrew (or nvm) などを用いるのが便利だと思います。手元で既にインストールされている場合はそれを使ってください。Perlについては System Perl が 5.8 の場合は、perlbrewを使って新しいものを入れることをお薦めします。
またリバースプロキシを用意する場合、ISUCON2では Apache 2.2 がデフォルトで用意されていましたので、それにあわせて用意してください。
お手元で試すぶんにはOSを縛らなくて良いと思います(ISUCON2ではCentOS 5.8でした)が、http_load を動作させる必要がありますので Linux や Mac OSX などがよいでしょう。Mac OSXの場合にはXcodeのインストールが必要です。
MySQLはそれぞれインストールを行ってください。Linuxの場合はおそらくディストリビューション側でパッケージが提供されているでしょうから、それを使ってもよいでしょう。Oracleのダウンロードサイトで提供されているものを使ってもよいと思います。

ISUCON2本番時のデフォルト設定がリポジトリ中の webapp/config/database/my.cnf にあります。ISUCON2本番時のサーバスペックに近い環境で試す場合にはこれを使ってもよいかもしれません。PC1台だけで試すならパッケージのデフォルト設定などでもとりあえず良いでしょう。


つくりかた

なにはともあれ、ソースコードを取得します。適当なディレクトリを選んで git clone しましょう。isucon2ディレクトリの中に展開されます。
$ git clone git://github.com/tagomoris/isucon2.git
$ cd isucon2

Webアプリケーションを動作させるため、まずMySQLでスキーマの設定を行います。
$ mysql -u root < webapp/config/database/isucon2.sql

Perlでアプリケーションを動作させるには以下のようにします。cpanmコマンドで多少時間がかかります。
$ cd webapp/perl
$ ./cpanm -n -Lextlib --installdeps .
$ perl -Mlib=extlib/lib/perl5 extlib/bin/plackup -s Starman -E production --preload-app app.psgi

これを起動した時点で http://localhost:5000/ にブラウザからアクセスし、以下のような画面が出ればアプリケーションの準備はもう完了です。

isucon2howto_1_app_init


http://localhost:5000/admin にアクセスすると「データ初期化」というボタンがあります。これを押してから再度 http://localhost:5000/ に戻るといくつかチケットが買える状態になっていますので、試してみましょう。エラーもなくチケット購入が完了し、購入した番号のシートが横の購入履歴などに反映されていればOKです。
他の言語でもほぼ似たような手順でアプリケーションが起動可能です。言語ごとのディレクトリに README があるのでそちらを確認してみてください。特に難しいところは無いと思います。
リバースプロキシを設定する場合にはApacheで mod_proxy (やmod_proxy_balancer)を使用する設定を記述します。これは簡単に試すなら行わなくてもよいでしょう。

今回は詳細を割愛しますが、前回のISUCON環境のつくりかた などにも説明がありますので、実施する場合は参考にしてください。
ベンチマークの準備としては http_load のビルドが必要です。パッチをあてたものが tools/http_load_isucon2 にありますので、これを用います。
$ cd tools/http_load_isucon2
$ make

またベンチマークツールに必要なモジュールのインストールを行います。
$ cd tools
$ npm install

これで簡単なベンチマークが動作します。開発時に手元で試すためのコマンドを用意してありますから、それを使うのがよいでしょう。以下のコマンドで localhost:5000 に対して簡単なベンチマーク(本番ISUCON2の縮小版的なもの)が走ります。
$ cd tools
$ ./test.sh 127.0.0.1 5000

完了したら標準出力にJSONで結果情報が出力されてきます。"err" に何も出てなければ基本的には通っていると思ってよいですが、"error" や "timeout" (HTTPステータスがエラーのレスポンス、もしくはレスポンスがタイムアウトした数)が多過ぎる場合はダメかもしれません。

だいたい以下のような結果になると思います。(これは自分の MacBook Air 上で実行したものです。見易いように整形しました。また"buyer"は複数表示されるはずですが、省略しています。)
{ "name": "starter",
"err": null,
"result": { "result": "success" }
}
{ "name": "checker",
"err": null,
"result": {
"get": { "success": 9, "timeout": 0, "error": {} },
"buy": { "success": 1, "soldout": 0, "timeout": 0, "error": {} },
"first_soldout": null
}
}
{ "name": "httpload",
"result": { "status": { "200": 255 },
"fetches": 255
}
}
{ "name": "buyer",
"err": null,
"result": {
"get": { "success": 30, "timeout": 0, "error": {} },
"buy": { "success": 10, "soldout": 0, "timeout": 0, "error": {} },
"first_soldout": null
}
}

ここでの "buyer" および "checker" の "buy" の "success" 数を合計したものが時間内に売れたチケットの数ですね。基本的にはISUCON2ではこれを競うことになります。これが8192に達した場合には "first_soldout" に表示される数値(の最も小さいもの)が完売所要時間のため、これを小さくするのが目標です。


もりつけ

さてこれだとスコアがわかりませんし、結果の把握や管理もちょっと大変です。なのでベンチマーク管理用のツールを起動しましょう。
ベンチマークツールは tools にある manager.js および agent.js を使用します。これらの設定ファイルはそれぞれ config.json と agent.json ですが、デフォルトでは localhost:5001 と localhost:5002 でそれぞれ起動するようになっているので、1台だけで試す場合にはこのまま使うのがよいでしょう。
まず manager が参照する結果保存用のデータベースおよびテーブルをMySQLに作成し、それからmanagerを起動します。
$ mysql -u root < sql/isumaster.sql
$ node manager.js

起動後、ブラウザで http://localhost:5001/ を見ると次のような画面が見られるはずです。

isucon2howto_2_manager_init

これがISUCON2でも使われた管理画面ですが、このままだとエージェントが起動していないためベンチマークが実行できません。エージェントを以下のコマンドで起動します。
$ node agent.js

そうすると数秒で管理画面が以下のように変わるでしょう(右下に注目!)。こうなるとベンチマークを実際に走らせるエージェントが準備できていますので、あとは実行するのみです。

isucon2howto_3_manager_agents

なおベンチマーク実行前に管理画面でログインが必要です。config.json の "users" にログイン用のユーザ名とパスワードリストがありますので "manager" ユーザを使うとよいでしょう。デフォルト設定では "local" チームを選択すれば localhost:5000 に対してベンチマークが走るので、先程立ち上げたアプリケーションのスコアが確認できます。

isucon2howto_4_result

やってみたらFAILEDになりました……。高い並列数に対応できず、接続に失敗したHTTPリクエストが多数あったようですね。原因がわかれば、あとは改善あるのみ!


かくしあじ

なお上述の各プロセスは普通に起動すると端末をブロックしますから、本格的に時間をかけてとりくむなら supervisord などを使用して常時バックグラウンド起動する環境を作ると良いでしょう。
マシンを複数台使える場合にはアプリケーション起動用とベンチマーク実行用に分けるといいと思います。分散構成をとるには以下のようにします。
  • アプリケーション側
    • リバースプロキシサーバ(1台)、アプリケーションサーバ(1台もしくは複数台)、データベースサーバ(1台)

    • アプリケーションに対する接続先データベースの指定は webapp/config/common.${env}.json で行われているので、これを変更しましょう

  • ベンチマーク側
    • manager(1台、MySQLもここに)、agent (1台もしくは複数台)

    • agent.json にmanagerのIPアドレスおよびポートを指定して起動します

またPC1台のみ、あるいは比較的非力なサーバマシンのみで実行する場合、ISUCON2本番のベンチマーク設定ではちょっと負荷が高過ぎるかもしれません。ベンチマークツールからの接続エラーなどがどうしても頻発する場合、 manager.js の先頭にベンチマークの各部分における並列数・起動プロセス数が書いてありますから、これを減らして manager を再起動してみましょう。

できあがり

これで環境は完成です。思う存分にあなたのISUCON2をお楽しみください! 高得点をゲットできたらblogなどに書いていただけると我々もとても嬉しいです。
NHN JapanではISUCON2と楽しく激しく格闘できるエンジニアを募集しています!
Read more...

2012/11/03 19:36にTech Blogにて公開された過去エントリです。
livedoor Techブログ : #isucon2 参加者・関連エントリまとめ

--
最終更新 2012/11/20 9:56

見つけ次第まとめていきます。
掲載されていないエントリを見つけた場合は @941 までご連絡いただけると助かります。

■参加者レポート
isucon2に参加してきました #isucon2 - しるろぐ
#isucon2 に参加してきたよ! | netmark.jp
isucon #2へ参加してきました - I sort my thought...
#isucon2 で優勝してきました - 酒日記 はてな支店
#isucon2 で惨敗してきました - かるぱねるらすたいる
Perl歴半年の3人が #isucon2 に参加してディフェンディングチャンピオンを倒そうと思った話 - kenjiskywalker no memo
isuco2に参加してきました! - koichi222のブログ
チームルンバとして #isucon2 に参加してきた! - 僕の車輪の再発明
#isucon2 #solocon2 環境つくりました | netmark.jp
#isucon2 に参加しました - 刺身☆ブーメランのブログ / @kyanny's blog
#isucon2 に参加してきてました - ぱいぱいにっき
#isucon2 にチーム「つねさま with 刺身あんちぽ」で参加してきました - delirious thoughts
#ISUCON2 で特別賞を頂いて来ました | へぼい日記
#isucon2 でまたチューニングせずに別のことをしていた話 - やったるでぇ
「Perlの上級初心者がISUCON2に行ってきた話」(2012/11/04) - beatsync.net
isucon2 にチームFukuokaで参加してきました! - CubicLouve
#isucon2 に参加しました - blog.tnmt.info
kanblr - isucon2に参加してきた
DSAS開発者の部屋:Isucon用Webサーバーrecaro
isucon2に参加してきました&主にSQL周りでやったこと - Dマイナー志向
ISUCON2に参加してきた - @ijin
isucon#2に参加してきた - bokko bokkoにしてやんよ
isucon2に参加してきました。 - mixi Engineers' Blog
DSAS開発者の部屋:#isucon2 に向けて、かなり間違った方向に本気出してみた(recaro 誕生秘話)
#isucon2 に参加してきたよ - masasuzuの技術メモ
おそらくはそれさえも平凡な日々: #isucon2 で連覇させてもらってきました
Redis布教活動報告 ISUCON 編 - unknownplace.org
#isucon2 で惨敗してきた - @Inject
#isucon2 にて死す - かみぽわーる
DSAS開発者の部屋:Isucon2 参戦記(破)
にひりずむ::しんぷる - ISUCON2 で生ハムはむはむしてきました

■運営側レポート
livedoor Techブログ : #isucon2 リアルタイムフォトレポート 更新終了
#isucon2 のお手伝いをしました - すぎゃーんメモ
#isucon2 の運営担当をしたので準備とか企画とかの話 - 941::blog
#isucon2をやりましたの話 - tagomorisのメモ置き場
isucon2 を開催しました。あるいは、優勝組の5倍のスコアを出す方法 - blog.nomadscafe.jp
livedoor Techブログ : 自家製 #isucon2 のつくりかた
#isucon2 をやったあとの反省など - tagomorisのメモ置き場




DSC03372
Read more...

↑このページのトップヘ