愛と悲しみのISUCON10決勝

TL:DR;

  • isucon10決勝でfailしました
  • 僕の注意不足です
  • つらい

なにがあったのさ

デーモンファイルにRestartSec=10sとかを入れないまま、問題が発覚しない形で再起動試験をしてしまったのでサービスが死んでた。具体的には、golangのサーバーがredisがロードし終わる前にconnection貼りに行ってて死んだ。

なにしてたの

  • 10:00 sshとかの環境整えてansibleでbootstrap
    • git configしたりいつものツールを突っ込む
  • 11:00 プロファイル取って様子を見る・デプロイ環境の若干の用意
    • 方針を決めてチームメンバーに改修をよろしくした
  • 12:00 query改善
    • generated columnとか使ってクエリをいい感じにしてた
    • 生の点と減点を引いたスコアをSTORED
    • indexも多少貼った
    • team_idとかにうまく貼られてなかったのを改善
    • あとは見つけ次第クエリの改善(? = TRUEとか。)
  • 14:00 redis導入
    • jobQueueを実装したかった
    • anqouに託した後断念している
  • 15:00 いろいろなパラメーターのチューニング
    • mysqlの設定値とか
    • interpolateParamsとか
    • envoyのLimitNOFILEとか(envoyなんもわからんかったけどファインプレーだった様子)
    • /etc/security/limit.confとか
  • 16:00 sessionを外(redis)に出す、envoyをいい感じに複数台構成
    • ぱっぱと出来たのはよかったけど…
    • ここのせいで再起動試験落ちの結果になってしまった
    • 本当に鬱
  • 17:00 indexを追う
    • チームメンバーがキャッシュを導入してくれてたおかげでmysqlの負荷がだいぶ減っていた
    • それでも変なクエリを書き換えたりindexきかせていた
    • 変なOR文にmergedIndexした
  • 17:30 再起動試験
    • 1台ずつ順番にやってしまった
    • 依存関係のあるサーバーは同時に起動すべきだった
    • つらい
    • つらい
    • つらい

おえて

チームメンバーには本当に申し訳ない気持ちでいっぱいです。多分再起動試験通ってたら3位圏内だったので本当につらい。しばらくチームメンバーにはまともに顔向けできないです。ごめんなさい。なお、**daemonの定義ファイルは最初にちゃんと覗くようにしましょう。**

そして私が事前にメモ書きしていたことの中に、

再起動試験をする

– `sudo reboot`
— 最悪起動しないときのために、1台ずつ再起動する
可能なら3台同時再起動なども行うべき?

メモ書きより

とありました。3台同時再起動すべきでしたね。とんでもない鬱。すいませんでした。

辛い気持ちのまま書きなぐってるので書きなぐりです。具体的なことがなくてごめんなさい…

暗い話はさておき

それでも楽しい思いをさせてもらいました。運営のみなさまありがとうございました。