読者です 読者をやめる 読者になる 読者になる

ISUCON4で準優勝でした #isucon

技術系

ISUCON4 本選結果 : ISUCON公式Blog

私の所属するチームフリー素材が準優勝でした

チーム構成は 予選 に引き続いて @walf443 さんと @edvakf さんの計 3 人で出場しました
私以外の 2 人は去年の本戦にも出場していますが,私自身は ISUCON 初出場でした

結果としては準優勝でしたが,優勝チームには惨敗したという気持ちでいっぱいですし,自分たちのチームがスコアが高い理由も終わってから分かったという有り様でした

言われてみれば私が担当している広告サーバーで全部ぶち当たって自分で解消していった問題だったのにどうしてすぐに気付けなかったのかと思って悔しいです

来年は絶対に優勝したいと思うので来年もよろしくお願いします

私が担当している広告サーバーに関しては今年の夏インターンの講義資料として発表した以下の資料が一番詳しい上に,今から見ると今回の ISUCON の問題を予見しているとしか思えないスライドになっているのでぜひご覧ください

戦略

今回の ISUCON ではサーバー 3 台でメモリは 1GB で 1 号機は 1 コアで残りの 2 台が 2 コアという非常にしょっぱい構成で swap 不可避の構成になっていました

私が事前に準備していた Nginx の設定はメモリが潤沢にある前提になっていたので設定値を変更しなければ使えませんでしたし,運営に翻弄されている感じでしたw

今回チームで立てた戦略は次のものです

  • アプリケーションは一台で動かす
    • Redis やログファイルのデータ共有などを考えるとアプリケーションの変更がかなり増える上に時間内に終わらせることが困難
  • 動画ファイルの配信に異常に時間がかかっているのでファイルに保存してファイルの配信を残りの 2 台でやる
    • メモリが少ないので返す URL を分散させて特定の動画へのアクセスは必ず片方のみに行くように
    • 今回のレギュレーションにはブラウザの見た目に関するものが存在しなかったので IP アドレスは内部 IP を指定するように
  • Nginx の proxy_pass を使ってそのレスポンス内容をキャッシュするようにして AP サーバーへのアクセスは一度しかいかないように
    • ファイルを lsyncd などを使って他のサーバーにコピーしてくる構成や POST 時にバックグラウンドで動画配信サーバーにファイルを送る構成も考えるが時間的に厳しいと判断
    • 実はこの構成は自分が担当している広告サーバーの設定と似ているのですぐにできると判断して採用
    • やっている最中は気付かなかったがこの判断がブレイクスルーを引き起こした

今回のベンチマーカーはローカルで実行した結果とリモートで実行した結果が全然違ったためにローカルで異常に高いスコアが出ていても本当にリモートでもそのスコアになるのか全く分からなかったので試しに実行してみた結果…

会場がものすごくざわついているし,運営チームもバグかどうか確認しに来るしという感じでした

結局このスコアが出ていた時はエラーが大量に出ている状況だったのでエラーの原因を特定するために一度差し戻したのでスコアは戻りました

しかしこれが優勝チームにヒントを与えてしまい,優勝を逃す結果となってしまいました…

当初エラーの原因をファイルの保存する処理が誤っていると思ってしまったために時間をかなり消費してしまいましたが,間違えていたのは動画配信サーバーのキャッシュの容量が足りないことで完全に私のミスでした…

今回の ISUCON はとにかくメモリ容量が少ないのでキャッシュ容量の設定などは慎重にやるべきでした

これで AP サーバーの Nginx から動画ファイルを配信しているのでタイムスタンプからいい感じのヘッダーを付けて返してくれます
そしてここが幸運だったのですが,あまり余裕がなかったので広告サーバーで実際に使っている設定をそのままコピーして貼り付けたためにブラウザ側のキャッシュを利用する設定がちゃんとされていました
この設定によって大きなスコアを出せていることを最後まで気付けなかったことが優勝を逃した大きな要因です

正直今回のベンチマーカーはキャッシュを見ないと思い込んでいました

またリモートのベンチマーカーを実行するのに 10 分以上かかるような状況だったので最後の数時間は大きな変更を恐くて出来ない状況になってしまったのでエラーを無くした後は fail しないようにベンチマーカー実行前に Nginx のキャッシュを消すようにする機能などをつけることしかできませんでした

結局スコアのブレイクスルーを Cache-Control であると見抜きサーバーのパフォーマンスを完全に出しきる設定をやりきった優勝チームの実力は本物だなと思いました

完敗です

総括

ISUCON 運営の方々には本当に頭が上がりません
本当にお疲れ様でした

今回 ISUCON は初出場でしたがこんなに楽しいイベントなのかと驚きました

ISUCON では時間制限があるので自分の経験と知識を制限時間内に出しきれるかどうかが勝負を決めると思いました

特に今回の動画広告配信サーバーは構成ややるべきことが私が担当している広告配信サーバーと似ていたので経験という点では他の参加者より有利だったはずなのでそれを活かしきれなかったことが本当に悔しいです

最終結果だけを見れば準優勝でしたが気持ちは負けたという気持ちでいっぱいです

次回は優勝を狙ってがんばりますので来年もよろしくお願いします