ISUCON7で人権を得ることに失敗した

isucon.net

同僚が会社のSlackで出ませんか?っと言っていたので手をあげる形で参戦してきて、結局今年も人権を得ることは叶わなかった。

終結果は↓こんな感じ

f:id:Chiastolite:20171023142152p:plain

主にやったこと

  • 画像周りの処理改善
  • /fetch のN+1解消
  • 入れておいたよさそうなインデックスを適当に追加
  • channel_listの取得周りをmemcachedでキャッシュ化

画像周り

今回のキモだったアイコン画像の配信周り

とりあえず画像をDBから配信するのつらすぎってことで画像へ吐き出しをしてnginxで配信できるようにした。 ためしに1台で動かしてスコアが結構出てわいわいしてたら、複数台をベンチ対象にするとあたりまえだけど機能しないことに気付いてわちゃわちゃしてた。

いろいろ考えたけど「この際画像だけは1台から配信すればいいんじゃね?」と考えて、メンバーにnginxの設定を丸投げした。無茶ぶりに答えてくれた同僚には感謝の念を禁じえない…

channel_listのキャッシュ化

チャンネル取得が内部で呼ばれることが多く値はユーザーに依存しない言われたので、DBサーバにmemcachedを入れて適当にキャッシュさせることにした。 これだけでスコアが2万ぐらい上がった記憶がある

反省

結局最後まで Cache-control: public に気付くことはなかったので勝ち目はなかった。 事前の打ち合わせで最近Web界隈で話題になったことを上げていってたりはしたんだけどCDNの話が抜けおちてた…

また計測がおざなりになっていてアプリコードから「ここはさすがに遅いだろうなー」っていうところを直すような対応をしてしまっていた。 上位チームは計測をしっかりしていて戦略的だったので、ここは次回の参考としたい。

最後に

運営のみなさん、2日間の開催と準備おつかれさまでした & ありがとうございました。 ベンチマークツールがすごい快適でした!

チームメンバーの@jacksmam0、@hachi-eiji にも感謝感謝です😇