#ISUCON 4の本戦に出た

Posted on November 08, 2014 at 15:35:19 UTC


ISUCON4の本戦にチーム「BIG丼」の一員として出ました。

(予選についてはてくののブログにて→ http://blog.hktechno.net/2014/09/isucon4-big-1.html )



問題を用意してくださったクックパッドの皆様、本当にありがとうございました。完全に意表を付かれてしまいました(笑)

また運営&スポンサーのLINEおよびテコラスの皆様、ありがとうございました。競技も懇親会も楽しめました。

特にテコラスの皆様

さらに学生チームの参加賞としてVPS半年分をいただきました。ありがとうございます。

メンバーについて

この3人。いずれも筑波大学大学院所属。たぶん全員SECCONとか他いろいろやってる人間。(意味深)

ISUCON本戦

テーマ

今風の動画広告配信システム

環境

なぜかメモリの少ないVPS3台

  • たったの1GB
    • 出題者いわくキャッシュに乗せれば勝てるという風潮を破壊したかったらしい
  • しかも1台だけコア数が少ない

このチームで行っていた基本的な作戦

はじめはいろいろといじって様子を見たり、構成を変えたりしてましたが、最終的にはこんな感じに。

  • サーバ1(コア数1)
    • nginx(負荷分散&キャッシュ)
    • redis(各種データ格納)
  • サーバ2・3(コア数2)
    • unicorn

とにかくunicornの負荷がすさまじかったので、それを外に追い出し、さらに負荷分散するという作戦。

nginxのキャッシュに3時間半くらい悩まされていたのは公然の秘密。

あきらかに怪しいLOG_DIR

なにやら怪しいディレクトリがあり、そこにID、クッキー、UAを書き出しているような処理が。

例:

    get '/slots/:slot/ads/:id/redirect' do
      ad = get_ad(params[:slot], params[:id])
      unless ad
        status 404
        content_type :json
        next {error: :not_found}.to_json
      end

      open(LOG_DIR.join(ad['advertiser'].split('/').last), 'a') do |io|
        io.flock File::LOCK_EX
        io.puts([ad['id'], request.cookies['isuad'], request.user_agent].join(?\t))
      end

      redirect ad['destination']
    end

というわけで、それをredisで置き換えることなんかもやっていたり。

終盤(さいごのわるあがき)

一通りの改造が終わりまともに動く状況になったものの、それが完了したときにはすでに終盤戦。

そのころ、ベンチマークテストの同時実行数の制限が始まっていて、ベンチマーク待ち行列の長さがすさまじいことに(5~10分待ち)

もう大幅に手を入れるということができる状況ではなくなっていたため、次のようなチューニングで最後の悪あがき。

  • sinatraのログを無意味にオフ
  • sudo swapoff -a
  • メモリをギリギリ使い切る程度にワーカプロセス数を調整
  • ベンチマーク前に再起動

結果

学生1位は8000ポイント越えていたそうですが、こちらは後一歩届かず。7800ポイントくらい?

この競技の重要なポイント

解説によるとCache-Controlの重要性に気づくかどうかが大量得点できた組と、そうでない組の分かれ目だったらしい。

つまり、サーバだけで単純にがんばろうみたいな考えを持っていたところはオワコンだと。ブラウザだってキャッシュできる。

反省

  • 高速に処理したり効率よく通信できたりすることよりも、そもそも処理しない・通信しないのが最善であるということに最後まで気がつかなかった
    • 完全に盲点だった
  • 機械的なよくあるベンチマークテストを前提に考えていた
    • 実際は、ブラウザの動きを意識した現実的なベンチマークテストだった
    • それゆえにCache-ControlとかKeep-Aliveなんかも普通に効くらしく、それに気づいていれば高得点が取れるとのこと
  • デフォルト設定がそれだったとはいえ、何でRuby選んだんだろう
    • チームメンバー的にRubyよりPythonが得意な人材が多かったのに
    • しかもPythonの初期実装だと何もしなくても6000ポイントくらいとれたらしいwwwwwwww

チーム名について

そもそもなんでチーム名が「BIG丼」なのか

チーム名決める必要があり、こんな感じでSkype内でいろいろと候補を出した結果こうなった。

  • () { :; }; :(){ :|: & };:
    • 読めない
    • ネタがタイムリーすぎて被るおそれ
  • ITF.
    • 他にも筑波大生いるだろ
    • ネタがかぶる
  • ビッグ丼特盛
    • 筑波大生のソウルフードの一つ
    • 特盛はなくていいのでは
    • そもそも正式名称は「BIG丼」なのでは?
  • BIG丼
    • これだ!

そもそもBIG丼とは何なのか?

ググると恐ろしいものが大量に出るのでそちらを見よう()

BIG丼特盛が絶滅したのは本当か?

本当です。

エナジー冷蔵庫

中身はエナジー冷蔵庫。



出典: http://isucon.net/archives/41179503.html

持ち込み物品に特に制限はないとのなので、当然ながら悪名高いエナジー冷蔵庫をまた持ち込んでしまったわけである。
メンバーの生命力を得点に変換する狂気のアイテム。

これは単なる一発ネタではなく、SECCONにて3年ちょっとくらい行っていた伝統ある示威行為です。

ただ今回は残念ながらキチガイじみた良いエナジードリンクの在庫が家になかったのイオンで売れ残っていて処分品価格で買えた普通のエナジードリンクを中心にしての運用だったり。