2020年 12月 21日 (月)に開催した『第四回社内 ISUCON』に参加した新卒3人のレポートです。
社内 ISUCON について
ISUCON とは(公式サイトより引用):
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それが ISUCON です。
オプトテクノロジーズでは定期的に社内ハッカソンを行っております。 業務改善ツールを作ったり、試したかった新技術に手を伸ばしてネタアプリを披露したりとテーマは様々ですが、社内ハッカソンの一環として 2017 年から開催してきた社内 ISUCON を、今年度も実施しました。ISUCON は、「いい感じにスピードアップコンテスト」の略です。
コロナの影響もあり例年より少し遅れましたが、なんとか年内に間に合いました。4 回目となる社内 ISUCON ですが、今年はなんとフルリモートでも参加可能になりました。ちなみに本家 ISUCON は 2011 年から開催されており、 2020 年に記念すべき 10 回目を迎えました。
第四回では、4 チームが参加しました。今年は、新卒のみのチームが 2 つあったり、ソロのチームがあったりしました。
- 若きトマトOS (Go)
- 新卒 4 人の頭文字( wkktmtos )を名前にしたチーム
- <script>alert('ISUCON')</script> (js)
- 去年優勝チームのメンバー @matzkoh さんのソロチーム
- que sisisin (js)
- 去年優勝チームのメンバー @sisisin さんがいる 2 人チーム
- デジタルの鼓動 (js)
- 新卒 2 人チーム
ここからは、実際に参加した 若きトマトOS メンバー 3 人が社内 ISUCON でどのようなことをしたのかレポートさせていただきます。
過去の開催記事はこちら:
2017 年 tech-magazine.opt.ne.jp 2018 年 tech-magazine.opt.ne.jp 2019 年 tech-magazine.opt.ne.jp
問題・レギュレーションについて
問題は ISUCON 9 の予選問題でした。 ISUCARI と呼ばれるフリマサイトアプリをチューニングしました。
参照実装
Go(1.15), Ruby(2.71), Python(3.91), Node.js(14.15.1)。
インフラ
AWS EC2 の 2 vCPU, メモリ 8GB, Ubuntu 20.04 のマシン。東京リージョン。
禁止事項
AWS Console からの閲覧・確認・アクセス
準備〜当日
チームについて
@u1 @shachitaku @wdkkou @papadinoの 4 人チームでした。
メンバー全員 20 新卒ホヤホヤです。
準備について
事前に以下のようなことをやりました。
- Slack チャンネル作成・webhook を用意
- リポジトリ用意
- deploy 用の shell script 用意
- 役割分担決め
- 役割ごとに、当日の動き方をまとめた
- 当日までに調査しておくことをリストアップ
- 言語の決定
- Go でやってやるぜと意気込んだ
- 計測ツールの選定・導入方法確認
- 社内の先輩エンジニア @peko さんが Qiita に投稿してくださっていた ISUCON の予習記事を参考に、DataDog の導入方法確認
- 過去問( ISUCON 10 )の環境を構築する手順をまとめた
- @u1 が社内勉強会で過去問のハンズオン + 環境構築手順の共有をした!
当日について
当日のタイムテーブル
- 10:00 - 10:30 オリエンテーション
- 10:30 - 17:00 競技時間
- 17:00 - 18:00 結果発表 & 実施したチューニングについて発表
競技中にやったことなど
午前
@wdkkou
- 問題とレギュレーションの確認
- 本番環境に ssh できるように設定
- ローカル環境で動かせるように設定
@papadino
@shachitaku
午後
@wdkkou
- Nginx やアクセスログの解析ツールの導入の試み
- 結局導入できませんでした orz
@papadino
- MySQL の設定ファイルをいじってチューニング
- conf ファイルの設定が反映されない事象にハマりタイムアップ
@shachitaku
- 計測ツール( Datadog APM )の導入方法について調べた
- しかし、残り時間を考えると厳しそうだったのでやめた
- ISUCON定番のインデックス不足だったり n+1 を探していた
- 終盤に謎のエラーで脱落した
結果発表
初期スコアでは一時的にトップに立ったものの、午後からあっという間にベテランチームに追い抜かれ、最終的にはソロチームの <script>alert('ISUCON')</script> が優勝しました。
4 チームの最終スコア:
- 若きトマトOS (Go)
- 2220
- <script>alert('ISUCON')</script> (js)
- 9670
- que sisisin (js)
- 6540
- デジタルの鼓動 (js)
- 910
初挑戦しての考察・学び
- 私のチームはそれぞれ別角度でチューニングしましたが、結果的には元のコードからチューニングすることが難しかったです。
- 各メンバーがローカルでベンチマークを実行する際に、動作トラブルに費やして本質的なチューニングする時間を削られてしまいました。時間配分も考えておくべきだったと思います。
- 単純に準備不足を感じたので、練習問題などで実際に高速化する練習や当日チューニングする際の戦略を詰めておくなどの準備が大事に思いました。
後日談: 優勝チームは何をしていた?
次回リベンジするため、ソロチームで参加し優勝した @matzkoh さんに後日、 ISUCON を攻略する秘訣を教えていただきにインタビューしました。
当日までに準備したことは?
こういったスクリプトは @matzkoh さん曰く『秘伝のタレ』だそうです。私のチームは特にスクリプトを準備しておらず、ローカル環境をセットアップするのに手間取っていました。チューニングの時間をできる限り増やすために、いかに他の作業を効率化できるかは高スコアを狙う上で大事な点ですね。
当日したことは?
- スタートは他チームと同じくインスタンスを確認したりベンチを走らせた
- ボトルネックの改善を繰り返す
- ある程度改善されたらキャンペーンレベルを上げてそれを捌けるように
- 最終的にキャンペーン 2 まで到達した
当日の動きは他のチームと大きく変わりなく、セットアップを終えた後はチューニングを繰り返していたそうです。行ったチューニングポイントとしては、本家の講評でも挙げられていたクエリの改善や、外部APIとのやりとりの削減と並列化などがあったそうです。
ソロチームの良いところ悪いところは?
- 自由度が高い
- リモートということもあって好きな場所で好きな姿勢で出来る
- オーバーヘッドがない
- 一人なのでコミュニケーションコストが発生しない
一見、チーム人数が多ければ有利にも思えますが、人数が多ければ多いほどオーバーヘッドが発生するので、チューニングに使える時間が減ってしまうこともありそうですね。ソロでの参加は、全て自分でやるという意味で大きな責任もありますが、自由度とやりがいもありそうです。
ISUCON 初心者の方に向けてアドバイスはありますか?
- 一回で勝てないなら何回でもでたら良い
- ISUCON 本家の講評やブログ記事を読んで典型的なパターンを覚えていく
- 覚えれば覚えるほど有利になる
今回初参加となる新卒チームは、どちらもあまり成果を残せず悔しい結果になってしまいました。しかし、準備中にしてきたこと、当日取り組んでみたことは知識、経験として残るので、是非次回リベンジしたいと思いました。
終わってみて
アンケート結果を見ると今年も好評で、今後も継続したいとの声が多かったです。そして改善点も多く挙がっており、その中でも印象的だったのは、「 ISUCON を通じて、若手メンバーが得られる経験をより良くするために、何か工夫できるのではないか?」といった意見でした。
今回私が所属していたチームも、全メンバー 20 新卒で ISUCON の経験はなく、当日は環境構築を何とか終え、ここからチューニングだ!というところでタイムアップを迎えてしまいました。
今振り返ってみると、自分と先輩方との差異として、技術力の差だけでなく、どういう方針でチューニングをしていくか、といった戦略を持ち合わせていなかったなと感じました。
次回以降は、自分も含め若手メンバーががんがん行けるような工夫を取り入れていきたいです。
来年も頑張るぞい!