はじめに
これはISUCON10に出たのでその振り返りの記事です。
当日のリポジトリ。
チーム構成
- ゴリラ
- アプリケーション & 実装読みながらN+1剥がしたりする人
- 犬
- アプリケーションのミドルウェアレイヤいじったり、マニュアル読んで色々気づいたことをメモしてくれる人
- カンガルー
- インフラ全般 & CIとかデプロイ周りの整備とか、たまにクエリいじったりしてた
動物園でした。
序盤の動き
まずは502まつりだったけどなんとかマニュアルにたどり着いた人から仕様を調べていった。 サーバーへのつなぎ方を確認して、ローカルでサイトが見れるように鳴ったのがだいたい開始10-20分くらい。
そのあとミドルウェアの構成を確認。
- Go 1.14
- Nginx 1.19
- MySQL 5.7
EPYCの1コア2GBが3台いるのを見て吹いた。
大体分かってきたところでベンチを走らせたかったのだが、ベンチが日を吹いてて全然まわせないw
この時点ではまだ効果があるかわからなかった細かいSQL周りのPRを出したり、いろいろ調べたりしてた。
しょうがないのでN+1っぽいところを眺めつつ僕はカーネルのパラメーターとかNginxとかMySQL周りの秘伝のタレを入れていく。
DB Indexっぽいものを入れたらスコアが微増した(後でこれは直したけど)
Low Priced EstateのJSONが別にわざわざ別で読み込む必要がないやつっぽかったので↓のPRでGoプロセスで処理するようにしたらまたちょっとスコアがあがった。この時点でだいたい16:30くらい。スコアは600前後を言ったり着たりって感じだった。
あー、あと、このときDBを別にしたのが大きかった気もする。それまでは450くらいだった。
このくらいのタイミングで、daisuzu(犬)さんがレギュレーションのBot弾くルールを教えてくれたので正規表現をNginxに仕込んだ。スコア的には微増ってところだけど700に乗るようになった。
僕はこのときSQLのレプリケーション対応をやってて、APP1台、DB2台(master1-slave1)構成にしようとしてたんだけど、レプリ遅延もあって全然うまくいかなかった。一旦DBを戻しつつIndexをもうちょっと見直したらだいたい800くらいに到達した
DBを直しながら、アプリの二人が「JOINが全然ないから愚直にINDEXを貼っていくくらいしか手立てがない」みたいなことを言ってたのを聞いて、CPUずっとベタベタに張りっぱなしのDBで、テーブルが2つしかなくて、JOINをしてないんだったら、初期化処理を2つに分けて、1テーブル1DBの2台構成にしたら良いんじゃない?って提案した。
爆速でDBの設定を変えてゴリラさんがアプリ側でDBを2台に剥がしてくれて、結果スコアが1000突破。
さらに細かいところを見ながらNew Relicとかログとか潰していって、最終スコアは最高が1291、最後が1244とかだった。
その頃周りを見ると既に2000超えもたくさんいて化け物かよって思った。
最後の最後は、nazotte検索が重くなってきたところでN+1が剥がしきれずタイムアップ。色々改善できた点が見えて面白かったものの、結果としては色々やりたいことがやりきれず、DB力が足りず、悔しい結果になった。
さいごに
運営のみなさん、ほんとうにありがとうございました。
参加者の皆さん。おつかれさまでした。対戦ありがとうございました。