この記事は Howtelevision Advent Calendar 2023 23日目の記事です。 昨日は、外資就活ドットコムのPdM 関根さん (id:toshimasa1234) による「プロダクトマネージャーが本気でプロダクトロードマップを作る意義とメリット」でした。プロダクトロードマップとはなんぞやと思った方はぜひご一読ください。
はじめに
こんにちは、知見共有プラットフォーム Mond の開発チームに所属している id:chima91 です。 今回は、2023年11月25日 (土) に開催された ISUCON13 に挑戦するまでの過程とその結果について語ろうと思います。 弊社の新卒社員2人(Mond開発1人、外資就活ドットコム開発1人)とインターン生1人(Mond開発)の3人で挑みました。3人ともISUCONは未経験での初チャレンジでした。
ISUCONとは
ISUCONとはLINEヤフー株式会社が運営窓口となって開催している、お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトルです
公式ブログで述べられているとおり、ISUCONは Iikanjini Speed Up Contest
の略称で、当日与えられたWebサービスを1~3名のチームで高速化していき、スコアを競うコンテストです。毎年この肌寒い季節に開催されています。
挑戦しようと思ったきっかけ
ISUCON攻略で必要とされる知識は、MySQLやNginx、AWS、Linux などであり、Mondの技術スタックとはあまり関係のないものばかりです。ですが、Web周りの知識を一通り学べるという意味でやって損はないと考えたため、挑戦することにしました。
また、例年のISUCONでは予選と本戦が分かれており、厳しい予選を勝ち抜いた優秀なチームだけが本戦に出場できる大会でした。ですが今年は予選が撤廃され、誰でも大会に参加できるようになったため僕たちも参加することができました。参加者は1,500名を超えていたようです。
参加チーム数 694組(学生 78組) 参加者合計 1662名(学生 253名)
ISUCON 前日までの対策
5~7月ごろ
麗らかな春が過ぎたころ、ISUCON 本番の半年前くらいに参加することを決め、ISUCON で必要とされる技術について少しずつ勉強するようになりました。 普段触らない Nginx や Linux、パフォーマンスチューニングの方法などの学習をしました。
この時期はまだ本番が遠く感じ、多くの時間を割いて勉強することはありませんでした。
8~9月ごろ
猛暑となり外でのランニングが憚られるようになってきたころ、ISUCON対策に力を注ぐようになりました。
ISUCON の事前講習やハンズオン、トークセッションが開かれた「ISUCON 夏祭り 2023」を視聴したり、ISUCON 対策本 を購入し各自が読んできたところについて毎週日曜日に報告・議論したりしました。
すべては紹介しきれませんが、3人でISUCON周りの知識をNotionにまとめました。
今見返すとNotionにたくさんの知見が溜まっており、感慨深いです。
10~11月ごろ
空気が乾燥して体調管理の難易度が上がってきたころ、ISUCON の過去問に挑戦するようになりました。実際にさくらのクラウドやAWSでインスタンスを立ち上げ、環境構築をしてパフォーマンスチューニングを実践しました。言語としては、毎年多くのチームに利用されているGoを選びました(今年も全体の70.8%が選択)。
初心者の初心者による初心者のためのISUCON対策方法をZennの記事としてまとめたのもこのころでした。
また、当日の参照用として、初動チェックリストや開発中チェックリスト、終了直前チェックリストも作り上げました。 本番の前日も夜にオンラインで集まり、当日の流れや役割分担などの最終確認を行いました。
ISUCON 当日
ここまで準備してきたのだから当日はさぞ上手くいったんだろう、と思った方もいるかもしれません。しかし、ISUCON は群雄割拠の大会です。僕たち小国が敵うはずもありません。
序盤
開始直後は役割分担を事前に決めていたため、スムーズに進められたと思います。 開始45分後には今大会優勝チーム「NaruseJun」を抑える勢いでした。 (いかにもすごそうに書きましたが、最終スコアで競うため序盤のスコアは意味がありません)
序盤は レギュレーション や アプリケーションマニュアル をしっかり読み込む必要があったように感じました。
中盤
お昼を過ぎたころ、アプリケーションとデータベースを別サーバーに分けるチューニングで躓き、約2時間ほど消費してしまいました。 ここは過去問で事前に取り組んで方法を前述のNotionにまとめておくべきでした。 この間に多くのチームに抜かれましたが、それでもインデックスを張ったりプリペアードステートメントのキャッシュを無効化したりして僅かながらもスコアを上げていきました。
終盤
終わりも近づいてきたころ、不要なトランザクションの削除などの細かいチューニングではスコアを大きく上げることができなかったため、比較的大規模なチューニングに取り掛かることにしました。しかし、どれもあと一歩のところで上手くいかず、順位は下がる一方でした。 アプリケーションのボトルネックとなっている部分(上手く改善できれば大きくスコアを上げられる部分)に対するチューニング方法の学習・実践が足りなかったように思います。
結果、僕たちの最終スコアは8,530。優勝チームの最終スコアは468,006。 桁が2つくらい違うように見えるのは気のせいでしょう。僕たちは694チームのうち、291位でした。 上位チームは、アイコン画像のハッシュ値計算や条件付きGETリクエストへの対応、N+1問題の解消、今大会初登場のDNSサーバーの負荷対策などをきっちりこなしていたようです...
おわりに
良かった点
- 初動チェックリストなど、初挑戦にしてはドキュメント化を丁寧に行っていた。
- 基本的な役割分担(Go担当、Nginx担当、DB担当)を明確にしていた。
来年に向けて改善すべき点
- 僕を含め2人はGoを普段使っていないため、Go実装に慣れる。
- サーバー移行など、ボトルネックに対するチューニングの手順化を事前にしておく。
初心者3人で挑んだためもちろん結果は振いませんでしたが、エンジニアなら一度は聞いたことのあるであろうISUCONに参加できて良かったです。 また、ISUCON本番に向けそれまで勉強してきた過程において、現状の業務では得難い新しい知見を得ることができました。 ここまで努力・苦労した経験は今後に活きるはずなのです。来年は今年の反省を活かし、パワーアップした状態で再挑戦できればと思います!
P.S. 新しい知見を得るという言葉で思い出しましたが、これは弊社の知見共有プラットフォーム「Mond」の得意分野です!ぜひ一度ご覧ください。 Mondに関する記事を読みたい方にはこちらがおすすめです。
また、弊社ではMondだけでなく、外資就活やLiigaでも エンジニア職やビジネス職を絶賛募集中 です!まずはカジュアル面談からで大丈夫ですので、ぜひご検討よろしくお願いいたします。