ぽへ

ぽへ

【ISUCON】S13 36位 dnsdist入り

最後に書いたのがポケモンの記事だったので、なんかタイトルがそれ寄りになってしまった

概要

ISUCON13にソロで出た。30位を目標にしたら36位になっててしまい、賞品が得られず残念だった
ソロチームだけで数えると5番目らしい。ぼっち賞をください(物的証拠に飢えている)

全盛期のキャプチャ。2時間半で終わっていたら3位だった

ENABLE_NESTLOOPというのはPostgreSQLのクエリプランを強要するパラメータのことで、ISUCONとは何の関係もない。まさかDB移行なんて考えていたなんてことがあるなんてことはない。まさかね

経過(抜粋)

  • 10:10:17: 売上: 3677
    初期ベンチ(サーバーが立ち上がったので、ベンチを回す練習)
  • 10:16:48: 売上: 2008
    nginx, mysqlのログ設定追加。pprofを導入してデプロイスクリプトの整備をして、デプロイ後のベンチ
  • 10:53:09: 売上: 4536
    アイコンをDBから剥がす。なんかキャッシュに関して小難しいことが書かれていたが、よくわからなかったので後回し
  • 10:59:47: 売上: 6648
    クエリログを眺めてインデックスを足していく
  • 11:04:52: 売上: 7607
    クエリログの最上位がprepareになったのでinterpolateParams: trueに、ついでにechoのアクセスログも消す
  • 11:14:41: 売上: 8185
    さらなるインデックスの付与
  • 12:01:40: 売上: 11090
    n+1の解決。selectすべきところでgetしていたりsqlxのよくわからないエラーに苦しめられたりスクリプトで横着した結果必要なファイルをscpできていないなどが重なり手間取った
  • 12:17:43: 売上: 14481
    DBを2号機に。この辺りで水責めによる被害が目立ち始める。マニュアルを読みDNSの勉強を始め、飽きる。
  • 13:01:57: 売上: 14334
    DNS用DBにインデックスを追加。この辺りの停滞はDNS関連の模索と、DNS用DBをサーバー3に移行する試みに失敗したり成功したりしていた時間になる。
  • 13:31:18: 売上: 19176
    さらにDNS用DBにインデックスを追加。この辺りでDNSサーバーが悲鳴を上げ始める

    ここから2時間程度停滞する。 この辺りでは水責めの解決を諦めて画像のキャッシュでもするか、など逃げようとしたが、結局水責めを攻略しないと未来がないと悟り色々やっていた
    30分ほどベンチマーカーに不具合があり、他の改善が進めにくかったというのもある
    さくらのナレッジでも紹介のあったdnsdist(DNSサーバーのプロキシ)を導入しようとするが、無限に詰まって名前解決ができない状態が2時間ほど続いた
    https://knowledge.sakura.ad.jp/34340/#dnsdist

  • 15:45頃 売上: 24030
    dnsdistを導入し、サブドメインが30字より多いリクエストは棄却する
    サブドメイン=ユーザー名で、負荷試験後にDBを見たら高々20文字程度だったので長い名前の人お断りのサービスにした
    ちなみに記事で紹介されていたようなQPSでの制御を試みたら全くリクエストが来なくなり得点が600点くらいになって爆笑していた
    怒られたら他の手を考えるつもりだったが通ったのでヨシ!
    ついでになんかのn+1を改善(この辺りで一手ずつログを残す余裕がなくなってくる)

  • 時刻不明 売上: 27564
    クエリログを見てインデックスを足したりする作業に戻る

    この辺りで順位表見たときに30000点以上は必要な状態になっていて、若干のあきらめムードになっていた

  • 17:01:57: 売上: 31177
    1号機がパンク気味だったため、いくつかのエンドポイントを3号機のAPサーバーに振り分け
  • 17:32:46: 売上: 46534
    alpのログを見てアクセスログの振り分け調整、ログを切って再起動試験

    3号機のCPU使用率は50~60%で余裕があったが、2号機(本体用DB)がほぼ100%だったこと、また入賞する可能性がなくはないと思い、これ以上余計なことはせず投了
    再起動後の動作も安定していたので、最後の30分は時系列ごとのスコアをメモにしながら上位入れるように祈祷(こういう他人依存の時間が一番心臓に悪い)

考察

TOP30が狙える位置だったので悔しいだけの結果になった。

最終構成では3号機のCPUに50%程度の空きがあった。またインデックス付与は逐次的で不完全だった(テーブル多すぎワロタ)ため、クエリログを見てインデックスを貼って2号機の負荷を減らし、いくつかのエンドポイントの処理を3号機に逃がす、という作業の繰り返しで点数を盛ることが現実的に可能な状態だった。
これ自体はうまくいけば数分の作業だが、点が伸びたときにはもうログを切ってしまっていた、かつ本当に微妙なラインなので悪化やエラーのリスクを感じたので30分を有効活用せず祈りに費やした。

もし競技終了まで1時間残っていれば(つまりあと30分あれば)続けていたと思うが、じゃあ30分をどこから捻出できるかって、それはもう水責めの解決を一度諦めてから戻ってくるまでの時間しかない(この時間は別のことをやって、この方針はきつそうとなってそれも投げていた)。
結局己の力のなさ、心の弱さ、順位表凍結後の経験のなさに起因する負けだったので非常に合点がいった。

良かった点は一度諦めたdnsdistの導入にちゃんと向き合ったこと。理解することをあきらめない姿勢は調査兵団団長に求められる資質なので。