ISUCON5 予選通過しました

9月26日、27日と行われたISUCON5@yujinakayma @spesnova と一緒に "醤丸" として参加し、最終スコア14501で通過しました。

実質的にやったことはUnicornワーカー数を増やして、あとはひたすらSQLのチューニングのみで、結局Redisは使いませんでした。MySQLだけでもなんとかなるもんです。

あと、今までAWSしか使ったこと無かったんですが、GCPめっちゃ便利で良かったです。

以下、効果があったこと(ネタバレ)



















  • ユーザAとユーザBが友達になったとき、relationsテーブルに one=A another=Bone=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も使わなかったけど、本戦では隙を見て投入していきたいですね。

目指せ優勝!