id:chaya2z と id:rmatsuoka と組んだ羽つき表参道のお茶会で参加した。
最終スコアは46,618。最高スコアはそのちょっと前に48xxxくらいを出してた。後から確認したら46,934だからほぼ変わらなかった。。終わってみたら30位が49xxxという感じだったのでベストでも及ばなかった訳だけど、やってる途中は正直そこまで食い込めると思っていなかったので意外というか、ここまでいけるなら僅かな得点の上積みに貪欲になればよかったというか……。いい順位につけられたことは嬉しかったし、ここまで来たならISUCON5以来超久々に名札ほしかったぜ〜という気持ちもある。おつかれさまでした。
リポジトリ(追記: 11/27 14:42)
アウトライン
もうちょっと詳細な感想
今回二人と組むのは初めて(というか二人は初参加とのことだった)で、休日に何度か過去問をオンラインで解いて練習した。当日は弊社の東京オフィスに集まってオフラインでやった。対面の方が捗るのは間違いないな〜というように思った。
DNS がお題に来たのはビビったけど、サーバー負荷を見ると CPU が支配的かつ MySQL が激重という状況だったので MySQL で実行時間の長いクエリを順番に潰していくという作戦になった。当初はボトルネックが他に変わるタイミングが来るのかなと思ってたけど、我々としては最後までそこが支配的という感じだった。mysqldumpslow
の結果を上から順に潰していったけど、やりきったという訳ではなくてまだ潰すべきクエリは全然残っていた。事前の練習ではアプリの CPU プロファイリングから改善するのもやってたんだけど、今回は pprof のエンドポイントを入れすらしないまま終わった。
ユーザー統計は上位にいたので Redis にランキング部分を移した。動画統計は僕らの範囲ではあまり上位に上がってこなかったので無視した。(やったらよかったとは思う)。モデレーションのクエリもメチャクチャじゃんとは思ったけど、上位にあんまり上がってこなかったのでコメントを全件 select してるところに配信IDの絞り込みを追加しただけとかだったと思う。
で、クエリを見てインデックスを貼ったあたりで PowerDNS からのクエリが(インデックスを貼っても)長いクエリに残っていたので、割と早い段階で DNS のサーバー分離を選択した。PowerDNS の設定の書き方でちょっとハマりつつも13時前くらいに分離していたっぽい。
その後は id:chaya2z さんに DNS サーバーのことはお任せとして、 id:rmatsuoka さんと僕で引き続きアプリ側の改修をやっていった。アプリとDBの分離は16時くらい?にしれっとやった気がする。複数台構成でスコアを出すには最終的に複数台のリソースを全部使い切ることになるため、ある程度目処が立った時点で早めに分けたらいいじゃんという気持ちでやった。同僚や知人チームの話を聞くに3台ぶんリソースを使えたことでスコアを稼げた寄与は大きいように思う。(最終的にはアプリ乗ってるサーバーの CPU は余ってしまったが…)
個人的には If-None-Match でアイコンを 304 で返す実装ができなかったのが辛い。結果的には多分これができてたら30位入れてた気もするんだよな。。 原因は簡単で、 If-None-Match ヘッダの中身は etag をダブルクオートで囲った物 が入っているので、値を取り出すにはreq.Header.get('If-None-Match')
的なことをしたあとクオートを剥がさなければいけなかった。。
他にも Redis に入れるコードをミスりまくったり NGINX のキャッシュ設定を全然うまく書けなかったり、個人的には手の速さと正確さどちらも反省という感じだった。DNS サーバーも分離後は id:chaya2z さんが模索しているのに任せっぱなしだったのをもっとチームの問題として取り組めばよかったかなというのも思う。
ただ、 id:rmatsuoka さんに着実にクエリの対応を入れてもらえたし、 id:chaya2z さんには DNS サーバーを押しつけお任せした上でインフラチューニングもやってもらえたのもありがたかった。そういう良かったところから翻って考えると、リーダーポジションの僕が立てた対処方針は大まかには良かったのだろうと思うし、サーバー分割の勘も大外しはしなかったのだろうし、リーダーポジションとしての責務はある程度果たせたんじゃないかなと思う。
ということでおつかれさまでした。今年も楽しく ISUCON できて皆様に感謝です。
来年はトップ30になりて〜〜〜〜〜。