北海道集合でISUCON13に参加して敗北したdbgofyの記録
目次
技術的な内容だけを主題とする場合は、 前日 にジャンプしてください。一応チーム内で合意を取ってまとめて出すことにしていますので、fono以外のメンバーの記事は出ない予定です。
前日談
チームメンバーの家を転々として対面で実施してきたISUCON。
前々回目黒、前回牛久、そして、メンバーが北海道に転居したため、 当然ながら(?)北海道で開催することになった。
北海道でISUCONをやろう。
ということで、競技外のサポート要員を1人捕まえ、飛行機を押さえ、旅のしおりを作り、北の大地でのISUCONの実施に踏み切った。
11⁄23 前々日(移動日)
成田空港に集合し、新千歳空港へ。 無事新千歳空港着。レンタカーで札幌市街へ移動。
夕食は千歳市内の焼き鳥店「なおちゃん」でいただいた。 https://maps.app.goo.gl/EaVjtg8XBFc63D6y6
その後、無事メンバー宅へ行き、直後最低限の買い出しをして、移動日は終了。
11/24 前日(準備日)
前日の午前は問題の最初に展開する ボイラープレートリポジトリ:bgpat/isucon-boilerplate の改良と準備を進め、本番リポジトリ:dbgofy/isucon13に必要な作業を可能な限り洗い出した。
序盤・中盤・終盤にやるべきことをすべてチケットとして起票してある上に、 ChatOps, タスクランナが整った状態である程度迷いなく作業できる環境が整った。
加えて、昼食の帰りに、近くの中古オフィス用品店でホワイトボードを購入して持ち帰った。
その日の夜は非常に吹雪き冷え込んだため、車で外食へ向かうのは断念した。
コインパーキングに停めておいた、レンタカーを雪下ろしし、軽く移動し、ワイパーを立てた。
近所のスーパーで食料を買い出し、就寝した。
11/25当日
前日作っておいたIssueとボイラープレートから素早く展開し、ChatOps, タスクランナ、Grafanaによる可視化が早期にできた。
具体的にどのタイミングでどのようなことに着手したのかは、PR一覧に出ているので参照されたい。 https://github.com/dbgofy/isucon13/pulls?page=1&q=is%3Apr+is%3Aclosed
最初のボイラープレートの適用が終わったあと、各所のSQLの最適化、N+1の解決、ユーザーアイコンの静的配信、複数台構成などの実装を進めていたが、最終スコアに近い点数でスコアの壁に当たった。
筆者はDBを除くミドル〜インフラ通信寄り担当であったため、最初の環境整備、ユーザーアイコンの静的配信を終えたあと、一度一息入れる時間を作り、中終盤でdnsdist周りで手堅く対応しようとしたが、これは間に合わなかった。
これは負荷走行したときのGrafana。
まとめ
最終的に、16,267点でフィニッシュとなった。
前日のボイラープレートの整備と丁寧なチケット起票は非常に良く機能し、スタートダッシュには成功したと言っていいと思う。あとは本当に地力の問題が壁になっている気がしている。
チームとして観測、分析、対策を回せる範囲を逸脱した課題になると一気に、そのサイクルが遅くなっていき、 最後は観測された事実ではなくKKD(勘・経験・度胸)とトライアンドエラーが主軸とならざるを得なくなり、 実装の打率がずるずる下がり、実装コストは嵩んでいく。ISUCONは非常にそれがよくわかる。
懺悔
実は、パケットキャプチャ解析を活用して対策を打ったことが幾度かあったが、 TLS終端の裏側に仕込む手間や、Web・アプリケーション重視の傾向から採用する回数は減っていた。
しかし、今回は水攻め攻撃周りが通信寄りの課題であったため、水攻め攻撃の挙動、特性、dnsdistの応答、などを把握するためにはパケットキャプチャ解析は非常に有用であった可能性が高い。
DNSへのDoS対策という知らない領域であったため、即席でやるのは困難ではあったが、攻撃と応答の挙動をエスパーして闇雲にやるのを防ぐには一番有用であるのは、結局「正しく観測する」「基礎に立ち返って通信を視る」ことである、というのは非常に示唆的な設問であるなと思った。
後日談
一緒にISUCONをやって寝床と居場所を提供してくれていたメンバーに急用ができてしまい、当日の晩に打ち上げたあと、2泊分の宿を追加で取って、翌日昼下がりに別れ、北海道観光をした。
層雲峡、大雪ダム、銀河・流星の滝、日本国道最長直線などを観て回ったり、旭川で鳥料理をいただいたり、すすきの呑んだり、新千歳空港に向かう道すがら室蘭本線・石勝線の乗りつぶしをしたりしたが、それはまた別の話。