RevComm Tech Blog

コミュニケーションを再発明し 人が人を想う社会を創る

ISUCON 13 に社内でメンバーを組んで参加しました

この記事はRevComm Advent Calendar 2023 6日目の記事です。

はじめに

RevCommのバックエンドエンジニアの中島です。

前回はPyCon APAC 2023への参加レポートを寄稿しました。今回もイベント参加のレポートになります。

今回は 2023年11月25日(土) に開催された ISUCON13 に、弊社内でフロントエンドエンジニア1名+バックエンドエンジニア2名、計3名のチームで参加しました。

isucon.net

私はISUCONには過去数回参加したことがありますが他の2名は参加なしという経験値で、結果としては最終スコア 7,749点、参加チーム数 694組中 314位でした。

なんとも言い難い順位ですが、参加レポートという形で忘備録として未来の参加者に知見を残せればと思います。

キックオフ

中島は8月入社ですが、8月下旬に社内のエンジニアが全員入っているSlackチャンネルで下記を投稿しました。

このようにRevCommではチームや組織を超えたコミュニケーションが活発で、社内Slackを通して日々情報交換や交流がされています。

ISUCONの参加登録が始まる前に何気なく投稿したものだったのですが、 エンジニアとして活躍する美馬さん、大谷さんにリアクションいただきました。

例年参加希望者が参加枠を大幅に上回っており、ISUCONの最も高いハードルは参加登録とも言われます。

メンバーの美馬さんがその恒例の連打バトルに見事に勝ち切ってくれましたので、参加が決定し、私たち3名は正式にチームとして発足することになりました。

早速それぞれの持っている情報を共有したり役割やチーム名を決めたりと、当日までに必要な準備が始まりました。

このとき、私たちが決めた目標は以下の4つになります。

  1. failureしない
  2. 計測する
  3. 計測を元に一番大きいボトルネックを潰す
  4. 本番までに社内ISUCONやりたい

このうち、4. の「社内ISUCON」は社内からのみアクセスできる環境構築の準備に手間取ってしまい、本番に向けた練習時間を確保するために計画が頓挫し、開催できませんでした。

しかし、今でも興味があり私の悲願なのでいつかやりたいです。

当日まで

まずは「達人が教えるwebパフォーマンスチューニング」を全員各自で読むことにしました。

多くの知見が詰め込まれている有名な本で、基本的なツールの使い方や典型的なチューニング方法や計測の重要性を学びました。

次に公式の情報や勉強会の情報、過去問の改善方法まとめなどの、役に立ちそうな記事についてそれぞれが情報共有する打ち合わせを数回行いました。

このとき、ISUCONの練習環境を社内で利用しているAWSアカウントに準備したりと、ありがたく社内のリソースも利用させていただきました。

日々忙しくチーム揃って手を動かした練習というのは本番一週間前から2時間ずつ3回に分けて行ないました。

練習の内容としては当日を意識した素振りを意識しており、「Git・SSHの設定」「alpやpt-query-digestのインストールや利用」「DBインデックスの活用」「EC2の複数台構成」などを行いました。

利用言語はGolangの予定でしたので、下記のサイトを参考にNew Relic APM Agentを入れて今回のISUCONのゴールドスポンサーでもあるNew Relicの威力も確認できました。

newrelic.com

New Relicは非常に便利でこれさえあればアプリケーションのほとんどの計測ができてしまうわけですが、 チーム内では alp や pt-query-digest といったツールと併用することを決めました。

本番当日

ISUCON 13は 10:00-18:00 で競技が行われました。

特に大きな障害などはなくスケジュール通りに進行が行われ、運営の努力を感じました。

参加者が快適に競技に集中できる環境を用意いただけていたと思います。

実際の時間や作業内容は前後していると思いますが、覚えている限りの当日のスケジュールを書いてみます。

  • 9:00 - 9:30 起床・オンラインで集合
  • 10:00 - 11:00 RepositoryやGit・SSHの準備。最初のベンチマーク取得。アプリケーションのドキュメントの確認。
  • 11:00 - 13:00 alpとNewRelicの計測結果から、icon周りの改善を試みる。「304 Not Modified」の実装をした。テーブル構造やインデックスの有無を把握し、データベース周りの理解を進める。
  • 13:00 - 14:00 休憩
  • 14:00 - 14:30 改めてコードを読んだり改善策を探す。どこから修正すべきか議論しながら、できることからやっていくことに。
  • 14:30 - 17:00 DBのスロークエリにインデックスを貼り始める。中間テーブルの削除を検討したり、DNS周りの最適化ができないか考えたり試したり。スコアがじわじわと伸びていく。
  • 17:00 ランキングが隠れる。己との勝負が始まる。
  • 17:00 - 18:00 この時追加でインデックス貼ったりログを切ったりしながら、少しずつスコアを上げていく。再起動後にベンチを回して通過したところでタイムアップとなる。

あとでポータルを確認してみると 16:53 の時点で 5,576 点だったようで、最後の1時間で2,000点以上スコアを更新していることになります。

ISCUON 13 Portal

最後畳みかけるように改善を行いましたが、やりたいことはまだまだあったので、本当に時間が足りなかったです。

振り返り

初回参加のメンバーが多いので、来年再挑戦できれば多くの点で改善できそうだなと感じました。

今回ざっくりと役割分担はあるものの、ほとんどの改善をチーム全員で確認をしながら行いました。

そのため、もっと手分けし並列に進めるようにすると上手に時間を活用できると思いました。

Miroで振り返り

4つの目標のうち以下の3つを達成できたので、大方ヨシ!とします。

  1. Failureしない
  2. 計測する
  3. 計測を元に一番大きいボトルネックを潰す
  4. 本番までに社内ISUCONやりたい

これらの目標を達成するために、私たちのチームでは競技終了直前に再起動テストを実施したり、コマンドラインツールだけでなく New Relic を活用した計測に力を入れました。

まとめ

今回は ISUCON 13 に社内でメンバーを組んで参加したというレポートになりました。

ISUCONというコンペに挑戦する場合でも弊社の社員は非常に協力的で、特にネットワークチームには社内環境を準備する際のアドバイスなどもいただけました。

スコアは物足りない部分がありますが、来年はもっと高得点が取れるように自身のスキルを磨きたいです。

最後になりますが、ISUCON 13の作問に携わって下さった方、運営の皆様、スポンサーの皆様ありがとうございました!