ISUCON公式Blog

ISUCONとはさくらインターネット株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです

ISUCONの過去問に
チャレンジするための
シンプルな環境構築
商標「ISUCON」利用の
ガイドラインはこちら

ISUCON4 本選は優勝賞金にプラスして副賞をご用意いただきました

櫛井です。
いよいよ本選まで2週間ほどですが、予選を勝ち抜いた皆さん心と体の準備はいかがでしょうか。

さて、何度かお知らせしておりますが今回の ISUCON4 はISUCON4 なんと今年は5位まで賞金が出ることになりました!2位でも30万! : ISUCON公式Blogとなっていますが、ご協賛いただいている株式会社データホテル様(11月1日よりテコラス株式会社に商号変更)より、今年も副賞をご用意いただきました!

というわけでこちらです!
pc3_l
▼AR.Drone 2.0. Parrotの最新wi-fi クアドリコプター - AR.Drone.com - HDカメラ - Parrot

で、でたー!ドローン!すごい!
内蔵の720p HDカメラで高画質な映像をスマートフォンに直接ストリーミング&録画。AR.Droneの2.0とGPSフライトレコーダーのWi-Fi接続により50メートルまで上昇可能。
※優勝チームの人数分を進呈します


いやはや、昨年はロボダンボーでしたが今年もすごいですね…。「もらって終わりではなく、プログラミングを含めた組み立てが出来るものを提供したいので」というデータホテルさん(11月からテコラスさん)の熱い思いをひしひしと感じました。


というわけで本選出場の皆さん、当日は万全の体調でお越しください。渋谷ヒカリエ会場にてお待ちしております。(当日の流れなどは改めて代表者へメールしておきます)

ISUCON4 予選 参考解答(オンメモリ版)

参加者の皆さん、 ISUCON4 予選、お疲れ様でした。
ISUCON4 運営チームの @rosylilly です。
すでに予選問題の解説記事もあがっていますが、この記事では、ベンチマーカー実装者が予選参加者となるべく同じ状況で、出来る限り高得点を出すことを重点に置いたピーキーな解答例について解説します。
※ 別解となる、この記事ほどピーキーではない @sorah による解答記事はこちらです。

また、実装されたソースコードは GitHub にて公開しています。

前提

  1. 実装時間は皆さんとおなじ8時間程度を想定しています
  2. この実装はすべて僕一人で行います
    • 架空の想定として、運営チーム(@mirakui, @sorah, @rosylilly)で予選に参加している状況としています
    • @mirakui と @sorah がまったく別の実装を行っている設定です(去年の予選と同じ状況)
  3. 僕は出題者であり、ベンチマーカー実装者
    • 問題を把握する時間などはほぼスキップできる
    • すでにどういう解法にするかある程度検討がついている

手始めに(2分)

僕の手元で EC2 インスタンスを立ち上げて真っ先にやることは

  1. sudo service nginx stop
  2. sudo service mysqld stop
  3. sudo chkconfig nginx off
  4. sudo chkconfig mysqld off

で Nginx と MySQL を停止させます。

Nginx 及び MySQL を停止させるのは、この2つに一切依存しない実装をする、と最初から決めているためです。この2つはおそらく並行作業中の @mirakui と @sorah が触っているはずなので、僕の時間内にうまくいくかどうかわからないギャンブル実装に合わせていれた変更による手戻りや、設定のコンフリクトなど、想定されうる諸問題を最初から発生させないように、僕の実装からは完全に除外するためにサービスの停止を行います。

実装方針

まずは、実装方針を固めます。実装方針はおおまかに3点。以下のように定めました。

  1. 他のミドルウェアに依存しない
    • Redis であれ、 Memcached であれ、2人が使っていそうなので依存しません
    • これはベンチマーク対象をスイッチした時に事故を起こさないための措置です
      • 最終的な AMI 作成時に事故を起こすと失格になってしまいかねません
  2. Go 言語で実装するが、参考実装のフォークは行わず、フルスクラッチで書く
    • Martini が入っていて便利そうなのはいいのですが、最終的にどこがボトルネックになるのかわからない以上、型による制約が多く、人の手の入った状況から書き換え難い Go ではベース実装が足かせになると踏んでの判断です
Read more...

ISUCON4 予選 参考解答(Redis版)

ISUCON4 予選お疲れさまでした! 予選問題の Ruby 初期実装などを担当した @sora_h です。

予選はたのしんでいただけましたでしょうか? 本記事では、ざっくりとそこそこのスコアを出す解き方を紹介しようと思います。
※@rosylillyによる、高得点を出すことを重点に置いたピーキーな解答例はこちらです

前提

  • 一人でやる
  • 一応8時間経過時点でスコアをとる
    • ただし出題者であるので問題の把握などの時間は短縮されていることに注意。
  • Ruby の実装を利用する
  • ある程度、現実味のあるチューニングが主
    • ベンチマーカーの実装を利用したりしない

また、この記事で出来た実装は GitHub に掲載しています: https://github.com/sorah/isucon4-qualifier-sorah

初期スコア

とりあえず立ち上げて動かした時のスコアは success:6030 fail:0 score:1303 でした (workload=1)

チューニング

ここからチューニングしていきます。

失敗数のカウンタを Redis にのせかえる (2 時間経過)

問題を読むとログを残す必要は一切ない事がわかるので、とりあえず mysql でログを取るのをとめて、Redis をカウンターとして利用するように変更します。

ただし、MySQL でも適切な index を張ればスコアが出せます。この辺は好みだと思われます。

  • isu4:user:<id>, isu4:ip:<ip> をカウンタとして連続失敗数を記録 (INCR)
  • isu4:last:<id>, isu4:nextlast:<id> を最終ログイン記録に利用

スコアはこの時点で "success:29430 fail:0 score:6357" (workload=1)

これはあまりスコアに影響はなかったのですが、少し後で users テーブルも redis にのせることにより、
完全に mysql をとりのぞいています。

nginx で静的ファイルを配り、app process との接続を UNIX ドメインソケットに

Read more...

ISUCON4 予選問題の解説と講評 & AMIの公開

こんにちは、ISUCON4 運営チームの @mirakui です。 @rosylilly @sora_h とともに ISUCON4 の問題作成と運営を担当しています。

さて、予選に参加していただけたみなさんは楽しんでいただけたでしょうか。今回は、予選問題の振り返りをしたいと思います。

予選問題「いすこん銀行」

今回の予選問題は、「いすこん銀行」という架空の銀行の Web サービスがテーマでした。
01

銀行とはいっても、実は銀行としての機能は一切ないハリボテで、今回用意したのは ログイン機能 のみです。ログインって機能なの? と思うかもしれませんが、実際のウェブサービスを作る上で、ログイン部分の設計は単純では済みません。

それは、近年増加している「パスワードリスト攻撃」のような、不正ログインの対策を行わなければならないからです。

「いすこん銀行」には、ログイン画面と、ログインに成功した時に表示されるマイページの2画面しかありません。
ログイン画面でユーザ名とパスワードを入力し、ログインに成功するとマイページに遷移することができますが、失敗した場合、エラーメッセージを表示してログイン画面に戻ります。

このとき「いすこん銀行」は次のような条件で不正なログインとみなし、それ以降はログイン禁止にします。

  • 一つのユーザIDに対して試みたログインで、連続3回以上パスワードを間違えた場合、それ以降そのユーザIDはログイン不可能になる
  • 同一IPアドレスから試みたログインで、連続で合計10回以上パスワードを間違えた場合、それ以降そのIPアドレスからはログイン不可能になる


  • 今回の予選問題は、とにかくシンプルな問題にすることを意識して設計されました。最初は、銀行アプリケーションなので暗証番号表を用意しようとか、他アカウントへの振込み機能を作ろうとか言っていたのですが、工数の都合シンプルさを重視して、最終的にログイン機能のみを残しました。
    Read more...

    ISUCON4 本選出場者決定のお知らせと本選出場者の利用言語比率

    オンライン予選後レギュレーションに則り、参加者から提出された AMI を元に主催者が実行し競技時間中に計測された性能値に近い値が再現できるかを確認いたしました。その結果、本選出場者は以下となります。スコア、チーム名、利用言語、の順となっています。

    本戦出場者

    予選第1日トップ5枠
    1. 82386 チームフリー素材 [Go]
    2. 65398 鉄球 [Ruby]
    3. 62145 山形組 [Perl]
    4. 60344 lily white [Go]
    5. 45742 ご注文はPHPですか? [Go]

    予選第2日トップ5枠
    1. 67782 fujiwara組 [Perl]
    2. 51045 .dat [Go]
    3. 49199 SHINCHOKU.ZERO [C++]
    4. 46875 椅子子 [Ruby]
    5. 42809 EH-MTI [Ruby]

    総合トップ13枠
    第1日・第2日それぞれのトップ5をのぞいた一般参加チームの中から、上位13チームを選出しました。

    1 . 42638 ナイスカロリー [PHP]
    2 . 41748 Beer Qz's [Ruby]
    3 . 41705 (40618) GoMiami [Go]
    4 . 41640 (39599) 矢澤 [PHP]
    5 . 41266 (42134) マカレラーズ [Perl]
    6 . 40418 (42120) Printemps [PHP]
    7 . 40268 (43298) MEAN普及委員会 [Go]
    8 . 39377 Oops! [PHP]
    9 . 39363 (38855) Mr. Frank & Co: A New Hope [Ruby]
    10 . 38960 (40115) 部長と副部長 [Go]
    11 . 38921 (40079) 50ms or die. [Perl]
    12 . 38802 (30180) PHPに花束を [PHP]
    13 . 37808 Team Ku's [PHP]

    ※予選1日目の参加者のみ、スコアのレギュレーションが異なるため、参考値としてカッコ内に提出時のスコアを併記しています。詳しくは下記をご覧ください。
    ISUCON4 本選出場の一部基準変更についての詳細 : ISUCON公式Blog

    学生枠
    1. 17764 (ρ_-)/超銀杏バスターズ(・ω・ o) [Ruby]
    2. 16544 (86974) BIG丼 [Ruby]
    Read more...

    ↑このページのトップヘ