ISUCON公式Blog

WINNER'S PRIZE \1,000,000

  
      
  
   

オンライン予選

   

2022年7月23日(土) 10:00-18:00

   

オンライン本選

   

2022年8月27日(土) 10:00-18:00

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

ISUCON5 の出題担当の一人、tagomorisです。みなさん予選はいかがでしたか? 楽しめましたか?

今回の準備をするにあたり、参考実装の準備などについて多くの協力を @najeira さん、 @hydrakecat さん、 @making さん、 @taroleo さんにいただきました。多くのみなさんが参加できたのはひとえにこの方々の協力があってこそだと思います。特に @najeira さんには予選直前の土壇場での動作確認・修正など非常にお世話になりました。本当にありがとうございました。決勝の準備でも、できればこれに懲りず、よろしくお願いします。次こそは余裕をもって準備します :P

また共犯者というかメイン出題担当のもう一人 @kamipo さんにも大きな苦労をかけました。いつもすまないねえ……。

今回の予選はいろいろと不手際が多く、特にNode.js実装が土壇場で用意できないということになるなど、申し訳ない点が多くありました。こういった点は全て、自分の最初の準備作業の遅れと不手際によるものです。この場を借りてお詫びします。申し訳ありませんでした。

さて、ISUCON5予選に使用した全てのリソースを含むリポジトリを、このエントリ公開と同時に公開します。

https://github.com/isucon/isucon5-qualify

問題内容についての講評は別エントリにてkamipoさんに任せるとして、自分からはサーバのプロビジョニングとベンチマークツールについて簡単な説明をしようと思います。

サーバプロビジョニング

ISUCON5の準備にとりかかる前に ISUCON4のリポジトリ を見たところ、これのサーバプロビジョニングまわりが非常によく整備されており、今回はこれをかなり流用させていただきました。具体的にはISUCON夏期講習2015用のGCEイメージ作成でまず使用し(ただしこのときはCentOS)、そののちUbuntu 15.04用に書き換えつつISUCON5予選で用いています。 動作環境としては以下のようなものになります。

  • Google Cloud SDKがインストール済みであること
  • Ansible
  • Ruby 2.3 (+ 各ディレクトリで bundle install)

  • gcp/image や gcp/bench などのディレクトリで bundle exec ruby ./pack.rb run_instance --name machine-name すればインスタンス起動、おなじく ruby ./pack.rb provision すれば環境構築とコードのデプロイ、ビルドなどが走ります。インスタンス作成時の設定については基本的に予選時のものがデフォルトで決められていますが、オプションで変更することもできます。

    綺麗にやるならGoogle Cloud Platform APIを叩いてインスタンス生成などもやるべきでしたが、とりかかった時点ではRuby用ライブラリの出来が微妙そうだったので回避して gcloud コマンドを経由して実行することにしました。このコマンドは --format json を指定することで結果をJSONで取得できるのが、プログラムからも扱いやすく便利で良いですね。バージョンによってちょいちょいサブコマンド体系が変わるのが難点ですが……。 ISUCON予選開催日の少し前にGoogle Cloud Platform API全般を扱うRuby用の新しいライブラリがリリースされたのを見ましたので、現在はもうすこしAPIを直接操作する方法でも綺麗にやれるのかもしれません。

    またISUCON4の段階ではイメージ作成も pack.rb に組込まれていましたが、これは自分がとりかかった時点ではGCE上で自動化することが事実上不可能だったため、手順をコメントで示すだけにしてあります。実際には手作業で行いました。これも現在の Google Cloud SDK では新しいイメージ作成用のサブコマンドが追加されているようなので、今ならもっと綺麗に実現できるだろうと思います。

    ベンチマーク

    最初はいろいろサボってシンプルに作ろうと考えていたのですが、迂闊なことに今回の問題がセッションを扱えるツールでないと何もできないことをすっかり忘れていました。これに気付いてからどうするか真剣に考えたのですが、自分の実装能力と慣れ、新しいものにトライしたいという気分、性能面などを考慮した結果、えいやとJava8でフルスクラッチしました。高スループットで処理を走らせつつ、ベンチマーク時のチェック内容の記述性などを Java8 Lambda を用いた内部DSLで担保するというのが狙いでした。

    結果的にはこれらの狙いはそれなりにうまく実現できたように思います。それなりに高スループットなHTTPリクエストを送りつつ、以下のようなDSLで記述されたロジックでアプリケーションの動作チェックも行ったりしていました。(感想ブログエントリに散見されたタマキ出現のチェック失敗はおそらく以下のコードでのチェックにひっかかっていたもののはずです)

    getAndCheck(session, "/friends", "LIST OF FRIENDS", (check) -> {
    check.isStatus(200);
    check.content("#friends dd.friend-friend a", param2.nickName);
    check.contentMissing("#friends dd.friend-friend a", param3.nickName);
    });

    予選と同じベンチマークは bench/ 以下で gradle run すると 127.0.0.1 に向けて実行されます。 実行されるのは Isucon5Qualification.java というシナリオで、これは複数のシナリオを3ステップに分けて実行する抽象シナリオとなっており、実際には Isucon5InitExecutor (/initialize を呼び指定の時間内にリクエストが戻るかをチェックする)、BootstrapChecker (アプリケーションの大まかな動作チェックを行い) の2ステップと本番の負荷走行 + 並行したチェック処理の計3ステップを順次実行します。無条件に1分かかる本番の負荷走行を実行してしまうと全く動作していないアプリケーションが相手でも1分以上結果を待たないといけなくなるため、最初の2ステップのどちらかで失敗した場合には即座に停止するようになっています。

    各ステップでは並列に動作させるシナリオ数を任意に指定することができるのですが、今回負荷走行時の並列シナリオ数は4でした(全力の負荷走行3スレッド、レスポンスをチェックしながらの走行1スレッド)。もっと並列度を上げることもできたのですが、今回は参考実装の初期状態が非常に重く、ベンチマークツールの負荷をあまりかけてしまうとそもそも初期状態でのチェックが全く通らなくなってしまうためです。 このためフルチューンされたアプリケーションを相手にするには並列度が多少足りず、予選の最上位の数チームの環境では、いくらか負荷がかけきれなかったケースもあったようです。このあたりは決勝に向けては更に改善していこうと考えています。

    個人的には、1週間足らずで作った割にはそこそこよくできたかなと……。まだ一般的に使うには機能があれこれ足りないと思いますが、決勝が終わったら個別のツールとして切り出して公開したいと思ってます。

    分散ベンチマーク環境

    分散ベンチマーク環境はかなりシンプルで割り切った作りになっており、キューは予選ポータルサーバ上のMySQLの1テーブル、各エージェントノードはそのテーブルを持つMySQLに直接接続するという生々しい構成です。綺麗にやるならWeb API経由にするでしょうが(ISUCON2でやったときはそういう作りだった)、綺麗にやってもあんまりメリットがないんですよね、ISUCONだと……。

    各エージェントプロセス(bench/agent.rb)はインスタンスを起動したらそのままsystemdから起動され、即座に動きはじめます。このためキューが詰まり気味になってきたらノードを追加すればすぐに対応が可能となっており、GCEのインスタンス起動の早さもあいまって、それなりに快適な状況を維持できたのではないかと思います。2日で11500回ものベンチマークを回すイベントはなかなか無いのではないでしょうか。それもこれも潤沢なリソースをGoogle様にご提供いただけたおかげだと思います。

    みなさんが手元でこの分散ベンチマーク環境を再現することも可能ですが、bench/agent.rb などには予選時のポータルサーバのIPアドレスなどが直書きしてありますので、そういったあたりに気をつけていただければと思います。 eventapp 以下にある予選ポータルサーバも当日の時刻などを用いて参加者がログインできる時刻の制御を行ったりしていますので、そのあたりにもご注意ください。

    なおこのあたりの一式も、おそらくもうすこし改良を加えつつ決勝で使うことになるだろうと思っています。決勝ではチーム数も少ないですから時系列での得点グラフも欲しいし、応援する方々のために、参照のみなら誰でも可能なようにしたいところですね。

    まとめ

    このエントリではISUCON5予選用のコードの、問題そのもの以外のあれこれについて解説しました。 興味とやる気のある方はぜひ個別に挑戦してみてください!

    Read more...

    9/27 22:05【追記】
    順位に不備があったため修正いたしました

    --
    櫛井です。
    1日目、2日目を通して実際にスコアが登録された263チームにより、11,515回のベンチマークが実行されました。これは平均すると1チームあたり43.7回実行され、予選中は平均して1時間に5.4回ベンチマークを実行したことになります。

    結果、決勝に進める成績を出したチームは以下のようになりました。当初、予選日それぞれのTOP4と指定点数到達チームをのぞいた上位10チームを本選出場としていましたが、かなりの接戦だった事もあり上位12チームへ枠を増やすことにしました。代表者の方へはあらためてメールにてご連絡いたしますのでお待ち下さい。

    参加者の皆さん、インスタンスは停止していただいてOKです。

    以下、本選出場者をチーム名とスコアのセットで表記しています

    予選第1日トップ4枠
    1. fujiwara組 27232
    2. GoBold 25861
    3. 中京区のプログラマ 19450
    4. にゃーん 17040

    予選第2日トップ4枠
    1. .dat 23353
    2. chatzmers 21242
    3. はむちゃん 20986
    4. 2608 20162


    1日目,2日目でそれぞれ指定の点数に最も早く到達したチーム
    1日目 へしこず 12616
    2日目 RUSH!! 11039


    1日目と2日目のTOP4をのぞいた上位12チーム
    1. チーム hammer 20062
    2. 大森s 17766
    3. 2nd Party Cookies 17609
    4. チームフリー素材+α 16967
    5. 白金動物園 15666
    6. チーム学生自治 15079 【学生】
    7. ピザはバランスいい 14923
    8. マウント竹田氏 14795
    9. 醤丸 14501
    10. lily white 14309
    11. ヴェンティッグ 14183
    12. †空中庭園†《ガーデンプレイス》 13898

    1日目と2日目を通した学生枠の上位5チーム
    1. 古典論理の犬 13609
    2. negainoido 8477
    3. kstm 7898
    4. maguro 6686
    5. アジ・タコ・エンガワ! 6566


    以上、 27 チームが本選出場となります。


    本選は10月31日(土)に LINE株式会社の渋谷ヒカリエオフィスにて行います。本選参加は当日渋谷ヒカリエにお越しいただける方のみとし、オンラインでの参加は不可とします。また、予選と本選でチームメンバーの交代は出来ませんのでご注意ください。

    本選出場チームの代表の方へは明日以降あらためてご連絡いたしますので、お待ちください。オンライン予選にご参加いただいた皆さん、まことにありがとうございました。まだ未定ではありますが、次回のご参加をお待ちしております。

    ご参加いただいた皆さんの感想などはこちらにまとめています。
    ISUCON5 オンライン予選 Tweet まとめ#isucon - Togetterまとめ
    ISUCON5 オンライン予選 関連エントリまとめ

    --追記--
    なおチーム 大森s については、予選1日目の終了間際に予選ポータルサーバの負荷が急上昇した瞬間誤ってベンチマークリクエストが2重に登録され、それにより見掛けのスコアが下がっており当初発表した通過者リストから除外されていました。
    チームメンバーから申告があり調査したところ、その前後におけるベンチマーク走行において上位のスコアを記録していることが確認できました。ベンチマーク要求受け付け機能における主催者の実装の問題による現象だったことが確認できたため、このチームを本選への通過者として認めることとしました。これにより当初発表していた12位の「ジャムおじさんズ」については選外となりました。誤った内容を発表しお詫び申し上げます。なお他にも同様のケースに該当するチームがなかったか確認を行いましたが、他にはありませんでした。
    --ここまで--

    なお、レギュレーションにおいて実施すると予告していた予選開催時間後のインスタンス再起動を伴う動作チェックについては、事情があり実施をとりやめ、予選開催時間中における暫定結果を、そのまま最終結果として採用することとしました。

    これはGoogle Compute Engine上で参加者のインスタンスを主催アカウントから再起動しつつ動作チェックしたところ、多数チームのインスタンスにおいて以下のような現象が確認され、実質的に確認の結果が妥当でないと判断したためです。

    ・主催者がUbuntu 15.04を使用したイメージを準備する段階で、その際にドキュメントにあった手順に従うと root volume が ro mount されるという現象が確認されていた
    ・予選用イメージの準備にあたり主催側で /boot/grub/grub.cfg を編集済みのイメージを用意することでこの現象を回避していた
    ・予選実施後、参加チームのインスタンスを主催者側で起動・停止していたところ、高頻度で root volume が ro mount されるという現象が再発していることが確認された
    ・この現象の発生によりアプリケーションが全く動作しないケースが多発した

    なお予選時間中に apt-get upgrade するとインスタンスが正常に動作しなくなるという報告が参加者から多くありましたが、これはおそらく同様の現象に遭遇していたものと思われます。

    この現象はGoogle側から提供されているUbuntu 15.04のイメージから直接インスタンスを起動している限りでは発生しないものと思いますが、以下のページにて案内されているイメージ作成手順に従うと発生すると主催者側では確認されています。
    https://cloud.google.com/compute/docs/images#export_an_image_to_google_cloud_storage

    なお9月27日現在においては以下の全く異なる新しい手順がドキュメントにおいて案内されており、こちらで発生するかどうかは主催者側では確認しておりません(確認する予定もありません)。
    https://cloud.google.com/compute/docs/creating-custom-image#bundle_image

    経緯については以上です。
    Read more...

    櫛井です。
    オンライン予選参加者の皆さんお疲れさまでした!
    参加総数 271組、761名ということで過去最大の予選となりました。(昨年は185組、507名)

    LINE株式会社 渋谷ヒカリエオフィスにて開催される本選出場へ参加する条件は以下となっています。
    ・1日目、2日目、それぞれで3000点に最も早く到達したチーム (ただし予選終了後の追試の対象には含まれます)
    ・それぞれの日で最後に提出した有効なスコアの上位4チーム
    ・上記10チームを除き、1日目と2日目を通した上位10チーム
    ・上記とは別枠で、1日目と2日目を通した学生枠の上位5チーム

    というわけで本日、オンライン予選2日目の勝ち抜け(予定)のチームとなります。

    1位 .dat
    2位 chatzmers
    3位 はむちゃん
    4位 2608


    指定の点数に最も早く到達したチーム
    RUSH!!



    以上となります。予選参加者の皆さんには別途アンケートをお送りしますが、まずはお疲れさまでした!本選出場の確定は来週中を予定しておりますが、その間にでも是非ブログなどで ISUCONオンライン予選に参加した感想など書いていただければと思います。

    今後ですが
    ・利用言語比率
    ・オンライン予選 講評
    ・オンライン予選 スコアを出す方法
    などを当ブログにて掲載予定です。


    予選の様子はこちらでまとめています
    ISUCON5 オンライン予選 Tweet まとめ#isucon - Togetterまとめ

    ISUCON5 オンライン予選 関連エントリまとめ
    というのもありますので、見かけたけど入ってないエントリをご存知の方は上記エントリの中にあるフォームから教えてください。
    Read more...

    ↑このページのトップヘ