ISUCON9で普通に負けた

今年は同僚の @linyows と @monochromeganeと出場した。

役割分担的には僕がボトルネックを探して、 @linyows と @monochromegane にどんどん修正してもらう感じで、インフラ周りは全部僕がやっていた。

事前にやっていたのは itamae でssh超えに公開鍵の設定とか、alpとかmyprofilerを仕込むとか毎年使ってるやつをちょっと直したくらいの準備をしていて、練習は全然できなかった。

当日はGolangを選んだことで午前中には全員手元で開発できるようになっていた。

やったことはだいたいこんな感じ

  1. innodb_buffer_poolを2G
  2. mysqlのbind addr,redisのbind addrをinternal ipへ
  3. mysqlのmax_connectionを300へ
  4. postLoginのパスワード突き合わせが重かったので、bcryptのCostを4にして、defaultの10で書かれたたものを平文から4に暗号化し直して、initでdbも4で書くようにした
  5. getUserなどのUser系の情報をRedisにキャッシュできるようにした
  6. 商品のsold outを表示しないようにした
  7. 画像やcss,jsをnginxから直接配信した
  8. 3台構成にして/sell 以外を3台に振り分けた(構成的には1個にmysql,nginx、後はappって感じ)
  9. DBはexplainかけて重いやつは全部Index貼った
  10. 還元フラグは途中全然あげられなくて、最後の30分位であげたら全然パスできて、もっと早くトライしとけばよかった
  11. 外部APIのHTTPタイムアウトを入れた

Twitter見てて、N+1のあたりと、外部APIに全然触れられてなくてそこがやれてるともっと違ったかなぁと思う。deploy.shとかitamae.shとか作ってxargsで多重化するとかそういうのは普通にやってた。

今年、なんかボタンの掛け違いで行けるなぁという感じが手に残っているから来年はしっかりと練習して、勝ちにいけるように準備したい。