ISUCON5 予選通過しました
9月26日、27日と行われたISUCON5に @yujinakayma @spesnova と一緒に "醤丸" として参加し、最終スコア14501で通過しました。
実質的にやったことはUnicornワーカー数を増やして、あとはひたすらSQLのチューニングのみで、結局Redisは使いませんでした。MySQLだけでもなんとかなるもんです。
あと、今までAWSしか使ったこと無かったんですが、GCPめっちゃ便利で良かったです。
以下、効果があったこと(ネタバレ)
- ユーザAとユーザBが友達になったとき、relationsテーブルに
one=A another=B
とone=B another=A
の2つのレコードが作られるのを、one < another
というルールを作って回避。これにより relations を引くときの OR が消えて1800くらいになった。 - CPU 4コアに対して、初期状態でUnicornワーカーが1つだったので4つにしたら3000超えるくらいに改善。8個にしても変化があまりなかったので4つに固定した。
- commentsテーブルにentry_user_idを追加して効率が悪いJOINを排除して4500くらい。
- footprintsが同一日に複数レコードを作らずに同じ日の中ではcreated_atを更新していけば(もはやcreated_atではない)
GROUP BY
は全くいらないということが分かったので、そういう感じにしたら 14000 くらいにジャンプ。 - users, profiles, saltsが別テーブルになっている必要がないので、usersにまとめたら16000 になる。
- viewで
get_user
しているのを先にとってくるように変更して 17000 くらい - indexを再度見なおして18000くらい
最高点18000近くいってるのになんで最終的な点数が14501かというと、終了間際になってテスト時にインスタンスが再起動されることに気がついて、実際に再起動してもちゃんと動くのか確かめたりしてたら、たぶんキャッシュが落ちて、ガクッと点が下がったのだと思います。MySQL温めるスクリプト作ったつもりだったけど動いていなかったのかも。冷汗かいたけどなんとか通って良かったです。
予選ではRedisもVarnishも使わなかったけど、本戦では隙を見て投入していきたいですね。
目指せ優勝!