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

ISUCON4本選で3位に敗れました #isucon

ISUCON4 に「fujiwara組」として参戦しましたが、既報のとおり 3位に敗れてきました。順位こそ3位で賞金10万円は獲得できたものの、スコアが示すとおり内容的には完敗です。

まずは主催のLINE社様、出題を担当していただいたCookpad社様、本番サーバ提供をしていただいたテコラス社様にお礼申し上げます。本当に楽しいイベントをありがとうございました。

うちのチームとしてやったことは #isucon 4の本戦で3位を取ってきました (追記あり) - beatsync.net に大変詳しいので、そちらをご参照ください。

簡単に最終的な構成をまとめると

  • Redisは1号機に(動画以外)集約
  • 動画はアップロードを受けたサーバがローカルファイルとして保存しnginxが返す。保存されたサーバのアドレスをメタデータとしてRedisに保存し、APIへのレスポンスに含まれるURLを構築するのに使用する
    • そのため、動画ファイル自体の自ホスト間転送はない
  • リクエストは3台で問題なく受けられるが、ベンチマーカーのアクセスパターンの癖(?)か、先に指定したアドレスのほうに帯域が1.5倍ぐらい偏るような挙動が見られたので、最終的には1号機をシングル構成で動かす
  • ただしeth0, eth1のアドレス両方をベンチマーカーに指定することで1Gbpsのインターフェースを2個使ってスループットを出す

という構成でした。

ローカルアドレスを指定するのって(そもそもベンチマーカー相手に指定できるのって)どうなの、という話はあるのですが、出題者側の目論見としてなんらかのロードバランサーやCDN的なキャッシュサーバが前段にいるということであれば、それらからのアクセスがローカルアドレスでも受けられる可能性はないではない、ということで……うーん……

敗着

今回の敗着はこれに尽きます。33万点のスコアを「チームフリー素材」が出した時点で何か秘孔がある可能性は思い浮かんだのですが、そこを突き詰めずに忘れようとしたところが、最後まで考え続けた優勝チームの「生ハム原木」に完全に及ばなかったところです。

途中の構成では2号機3号機でそれぞれファイルを保存するものの、自ホストにないファイルがリクエストされた場合は nginx の try_files を使って相手ホストに reverse proxy することでファイルを見つける構成になっていました。

これが確か15時ぐらいでしたが、その際に毎回 proxy で相手から取得するのは無駄だから proxy_cache を入れよう、と思ってサーバ上の nginx.conf に設定をコピペまでしていました。

が、ここでベンチ実行待ちの間に念のため自らのホスト間の通信速度を iperf で測定したところ、(おそらく同一物理マシン内のVMのため) 32Gbps という計測結果が得られてしまい…… これだとメモリの少ないVMで proxy_cache のためにファイルIOを行うよりも、ホスト間で通信する方がコストが少なかろう、と判断して結局 proxy_cache を一度もベンチしないで外してしまったという経緯がありました。

そこで1回でも、ローカルベンチでも走らせていたら流れが変わっていた可能性があり、全く悔やみきれないのですが後の祭りですね。

もしくは自分のホスト間の帯域も1Gbpsに制約されていたら、確実に通信よりはファイルIOを選択していたわけで、そこが現実にはあり得ない(同一筐体にあることを想定して構成するわけにはいかない) VM配置だったのがある意味罠として作用してしまった感があります。

本選問題の感想など

おそらく出題の意図としては、もっと早い時点で Cache-Control が効くことを発見するチームがでて、そこからが本当の闘いになるというような目論見だったのかなあと勝手に思っています。

が、競技時間が1時間延長されてなお最後の30分まで(自覚的に)発見したチームがなかった、というのが想定外だったのかなと。

帯域ネックな勝負ではない、ということになれば当然ベンチマーカーの1Gbpsな帯域によってリモートベンチ結果が不安定になることもないでしょうし、そこでベンチマーカーの並列数を2にする判断が遅くなったということもあるんでしょうね。

参加者は基本的にはブラックボックスであるリモートからのベンチマークのみを頼りにチューニングする必要があるので、そこがもう少し安定していたらな、というのは正直な感想なのですが、そのあたりは今後 tagomoris さんが開催するであろう ISUCON benchmarkers casual talks で存分に(自分も出題経験者として) 話せたらなあと思います。

Cache-Controlヘッダの付与なんて、いつも飽きるほどやっていることなのに、それが ISUCON 当日にできないところが競技の難しさだなあと毎回思います。

最後に

自分も来年40歳になりますし、今回3回目の優勝を成し遂げた上で引退して勝ち逃げする目標を立てていたのですが、そうもいかなくなりました。また来年、リベンジできたらなと思います。

主催と共催の皆様、参戦者の皆様、本当にお疲れ様でした。今年も楽しかったですね!