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台同時再起動すべきでしたね。とんでもない鬱。すいませんでした。
辛い気持ちのまま書きなぐってるので書きなぐりです。具体的なことがなくてごめんなさい…
暗い話はさておき
それでも楽しい思いをさせてもらいました。運営のみなさまありがとうございました。