maco's life

主にエンジニアリングと読書について書いていきます。

ISUCON7 オンライン予選に参加しました

先程人生二回目のISUCONに参戦してきました! 今回やったことと所感を簡単にブログに残します。

isucon.net

事前準備

今回は前職の同僚の id:karia , id:naught00 と参加しました。私は過去一回、二人は今回がISUCON参加はじめてで、全員右も左もわからないかんじだったので本戦に向けて準備は色々しました。やったことは ISUCON6 -> ISUCON4 -> pixiv社内ISUCONの過去問をみんなでやり、ISUCONとはどういうものなのかという雰囲気の把握と過去のボトルネックの改善方法をみたりしました。過去問を通してやっぱり当日は色々準備する時間がもったないよねという話がでて事前にツール等は準備していました。用意したものとしては

  • alpをよしなに使えるshell
  • slack通知shell
  • newrelic
  • mackerel
  • チューニングしたnginx conf
  • 使いそうな実装のリファレンス実装とドキュメント
  • etc...

みたいなものは準備しました。(ほとんど他のチームメンバーが用意してくれました!!! 感謝!!!)

予選

結果から言うとベストスコアは9万4千点ぐらいで、最後の方はベンチ回すごとに上がったり下がったり不安定な感じで結果7万9千点くらいがラストスコアになりました。いろんな実装試しましたが、何がどのぐらい効いたか詳細に残してなかったのでやったことのみ書いていきます。今回の実装の役割分担としては、id:karia がインフラ担当で、id:naught00 と私がアプリ担当でした。自分が予選通してやったこととしては

  • githubへコードをpush
  • image, messageのテーブルにindexはる
  • channelリストを取ってくる処理をキャッシュに乗せて効率化
  • ログイン後のリダイレクト先をchannelに変更
  • pumaをsocketに変更してthread数を変更
  • ユーザ作成時のパスワードのsaltを固定値にする
  • 画像キャッシュが効いてなかったところのバグ取り
  • fetchの効率化 -> redisつかっていい感じにN+1削ろうとしたけど修正方針あやまりあまり効かなかった
  • 残り時間でSELECT * FROMですべてのカラムを取ってきていたので必要なカラムのみにして効率化

ぐらいですかね。あとはエラーの調査とかその辺みたりしてました。画像のキャッシュ化とかサーバー構成周りの変更詳細は 他のお二方がきっと書いてくれるはず...!

心残り

大きくスコアをあげるにはどうすればいいかというところを考えすぎたあまりに、自分の実装の間違いや他の効率が悪いちょっとした処理など見過ごしていた点が多々あったのが悔しいです。今回選択した言語への理解が浅かったところももちろんあるとおもうけど、以前やったisuconの実装の良い部分をちゃんとみていたらわかっていたこともあったのでそこに気づけなかったのが心残りですね...

最後に

本戦に行くことはできなかったけど、また今回自分にたりなかったことへの気づきを持ち帰ることができとても学びがおおかったです! 運営の皆様お疲れ様でした、そしてありがとうございました!