こんにちは! SmartHR VPoE の芹澤です。
先日開催された ISUCON7 に、弊社開発メンバーの芹澤、神崎、藤井の三人で参加しました! その内容を簡単にご報告いたします。
ISUCON とは
ISUCON とは、テーマとして与えられた Web サービスを決められたルールの中で高速化チューニングし、その成果を競い合う大会です。 ベンチマークテストが投げてくるリクエストを多く処理すれば処理するほどスコアが上がり、その最終スコアで順位が決まります。 毎回テーマは違うのですが、中心となるのはアプリケーションコードの改善で、現場で使えるテクニック満載の内容となっています。
役割分担
今回は以下のような役割分担で挑みました。
- 芹澤
- アプリケーションコードの改善
- 神崎
- インフラ周りの整備
- ミドルウェアチューニング
- 藤井
- アプリプロビジョニング周りの整備
- アプリケーションコードの改善
事前に ISHOCON1 を使って練習をしたところ、自然と上記のような分担になり、本番もそのままでいくことにしました。
やったこと
今回のテーマはチャットアプリでした。 開始直後にログのプロファイリングを行い、「メッセージ取得のリクエスト」と「プロフィールアイコン画像取得のリクエスト」が大量に飛んでくるのが特徴かつボトルネックなことがわかったので、そこを重点的に改善していく方針で進めました。
やった内容はざっとこんな感じです。
- インフラ関連
- nginxログの ltsv化 -> alp でのログのプロファイリング
- 静的ファイルの cacheの調整
- 3台で受けるように変更
- /icons/* を全て nginx で受けるように変更
- ミドルウェア関連
- mysqlの max_connections の調整
- puma の unixsocket化 (nginxとの接続がうまく行かず revert)
- SELECT に合わせたインデックスをテーブルに追加
- アプリケーション関連
- 実装言語は Ruby を選択
- 画像のバイナリを redis に保持 (revert)
- 初期画像のファイル書き出し
- ベンチマークがアップロードする画像の書き出し (scp 転送)
- JSON 生成の gem をより高速なものに変更
- salt 作成処理の簡略化
- SELECT 句で取得するカラムを最小限になるよう調整
- n+1 の除去
- ログインユーザ情報を全てセッションに持たせて DB アクセスを削減
結果
これらを試した結果、ベストスコアは 55,714 を記録しました。 残念ながらこのスコアでは予選突破はならずでしたが、事前練習で学んだことを役立てられたので、悔しさ半分、達成感半分といった感じです。
さいごに
冒頭でも述べた通り、ISUCON は業務で使えるテクニック満載です! この練習〜本番を通して学んだことを SmartHR の開発にも生かして、より高品質のプロダクトを安定して皆様に提供できるようにしていきます。
ちなみに、次回の ISUCON では優勝する予定です。 「一緒に優勝したい!!」というエンジニアの方がいらっしゃいましたら、下にある「メンバーを募集しています」リンクよりご応募いただけると幸いです!