こんばんは。いや,こんいす〜!大学4年の@TAK848です。
この記事は「PlayGround Advent Calendar 2024」の23日目の記事です。24日でしょって?いや,今はまだ「2024/12/23 23:59 AoE」です。誰もJSTとは言っていないですよね?🤔
最近出た学会の原稿締切の表記が「AoE」でした。これは「Anywhere on Earth」の略で,「ある日」が地球上で最も遅く終わる地域のタイムゾーンの時間,つまりUTC-12のことを指すみたいです。JSTはUTC+9なので,21時間も猶予があるってことですね!
しょうもない話はこれくらいにして,みなさん,ISUCONというコンテストはご存じでしょうか?
今回は,主にバックエンドを学び始めた学生や,インフラに少し興味のある方に向けて,「ISUCONに出ると色々スキルアップできるぞ!」というテーマで書いていきたいと思います。
ISUCONとは
ISUCONは,「Iikanjini Speed Up Contest(いい感じにスピードアップコンテスト)」の略で,名前の通り「いい感じにWebサービスを高速化する」コンテストです。1-3人でチームを組んで,直近のISUCON14では1000チームが参加しました。毎年開催されていて,今年が14回目です。
LINEヤフー株式会社が主催するこの競技では,参加者にサーバーが与えられ,その中で動作するWebサービスをいかに高速化できるかを競います。その手法は **「何でもあり」** です。仕様を維持する限り,コードの書き換え,ミドルウェアの交換,OS設定の調整など,やれることは無限にあります。ただし,フロントエンドのチューニングは不要です。
基本的に時間は10時-18時の8時間です。最近は競技開始前に,改善するサービスの動画が流れて,18時にそのサービスがリリースされるからそれまでになおして欲しい,といった無茶振りが振られます。毎年色んなアプリケーションが出てきて(しかもパフォーマンスは悪いがちゃんと動作するので)非常に面白いです。
競技が始まったらサーバーにログインしてコードやインフラの構成・状態を確認,計測を行ってボトルネックを特定,改善を行っていきます。
スコアは任意のタイミングでポータルからベンチマーカーを回すことで採点されます。
18時前に実行した最後のベンチマークの結果が,「基本的には」最終スコアです。
ただし,競技終了後に環境チェックや,サーバー再起動後に再度ベンチマークを走らせる「再起動試験」,目視によるアプリケーションの動作チェックなどがあり,いずれかに失敗するとFAILとなり点数は0点になります。ここも重要なポイントなので気をつけましょう。
(イベントによってスコア算出方法は毎回異なるので,マニュアルをよく読むと良いでしょう。原則,ベンチマーカーは徐々に負荷をかけてきます。性能を改善すると,今までは起こらなかったデッドロックの問題などが発生することもあり大変です。そして最近は,仮想的なユーザーの行動をもとに,収益額がそのままスコアになるなど,プロダクト視点による判断も重要になっています。)
ISUCONで必要な技術領域
ISUCON12開催前に事前講習会があり,そこで詳しい解説もあるので良ければご覧ください。
この解説内の以下を見てもらうと分かるんですが,冒頭でも触れたとおり,ISUCONで必要な技術領域は以下のようにものすごく広いです。
図を見ると,DB・アプリ・ミドルウェア・OSレイヤーなど,フロントエンドを除いた幅広い範囲の領域が必要があることがわかります。ただし,最初から全部ができる必要は全くありません。まずはISUCONの環境をセットアップして,ISUCON本を片手に解説と講評を読みながら,手を動かしていって習得していくと良いと思います。最初は,インデックスとは?などとなると思いますが,順々に理解していくことで,技術的な知見を広め,実際のサービスでの負荷対策といったところにまで役立つ知識を得られると思います。
今まではバックエンドのアプリをなんとなく書いてきたけど,ちゃんと自分でアプリを公開できるようになりたい!といった人への第一歩としても,古典的なシンプル構成でアプリの実装を学び改善していくことができるのでとても良いです(もちろん競技用で,色んな言語に移植することを前提にしているので,アーキテクチャなどがそのまま実務に生きるというわけではないですが…!)
ISUCONを彩る面白いアプリケーション達
そんなISUCONですが,毎年話題だったりユニークだったりなサービスを出題してくださっていて面白いです。具体的な内容を,動画や解説と講評と共に紹介します。
ISUCON14本選 - ISURIDE
仮想のライド「チェア」サービス。インデックス貼ったりN+1解消したり,奇々怪々なSQLを潰したりといった王道の修正はもちろん,SSE(Server-Sent Events)やマッチングアルゴリズムのチューニングと言った今までにはない様々なスコアアップチューニングポイントがありました。
解説と講評
ISUCON13本選 - ISUPIPE
仮想の動画配信サービス。こんいす〜。DNS水攻め攻撃という攻撃が来るので,それの対策に時前のDNSサーバーをGoで作るようなチームもいたみたいです。N+1問題が大量に埋まっていたりと王道のチューニングも多かったイメージ。
解説と講評
ISUCON12
ISUCON12までは,予選があり,上位30チームが本選に出場できました。
予選 - ISUPORTS
マルチテナントな競技用リーダーボード。この予選の特徴と言ったらなんといってもテナント毎に物理的にSQLiteファイルが分けてマルチテナントSaaS!となっていたことですね。個人的には初ISUCONで面食らいました。予選のボリュームとしてすごかったです。
解説と講評
本選 - ISUCONQUEST
自分は出られなかったのですが,クッキークリッカー風?のゲームでした。Unityでゴリゴリにゲームクライアントが作られていてすごい!となっていました。ゲームならではのログイン処理だったり,サーバーが3台では無く5台でDBのシャーディングが求められたりと,素振りするにもボリューミーでした。
解説と講評
そのほか
住まい検索サービス,フリーマーケットサービス,学校の離礁登録システム,飛行機の予約サイトなどなど,様々なサービスが登場しました。古いものだと一部バージョンの古さなどで苦労することもあると思いますが,どれも面白いので是非触ってみましょう!
公式のISUCON問題以外にも, @catatsuy さんがメンテしてくださっている「private-isu」もあるので,是非見てみてください。
具体的にどんなことをするの?
色んなサービスが出てきてワクワクしてきましたよね。実際にISUCONに取り組むときの基本的な流れを紹介します。まあISUCON講習会や,詳しく解説しているサイトなどはたくさんあるので流れ位を。
0. まずは環境を整備
最初に起動した段階でアプリが動くようにはなっているので,ひとまずベンチマークを回してスコアを計測します。これが初期スコアです。
その後,マシンのスペックを確認したり,コードがどのように動いていて,設定を変えるにはどうすれば良いのかを確認したりします。例えば,アプリはsystemdで起動しているのか,dockerで起動しているのか?DBはMySQLなのか,PostgreSQLなのか,はたまたSQLiteなのか?プロキシはnginxなのか,h2oなのか?envoyなのか?など。
バックエンドに留まらず,ミドルウェアやインフラ,OSの面倒を見ないといけません。
例年ある程度環境は近しい傾向もあるので,あらかじめMakefileでスクリプト集を準備しているチームもあります。そして基本的には,アプリをgit配下に置いて,GitHubのプライベートリポジトリ上で複数人で修正を行っていくことになるでしょう。
1. 計測・集計環境を整える
topコマンドなどを使用してCPU使用率を確認しながらベンチマークを回すと,DBがボトルネックかアプリがボトルネックかぐらいは分かります。ですが,それだけではどこを改善していけば良いのか検討もつきません。そこで,DBのどのSQLが遅いのか集計してくれるツール,エンドポイント毎のリクエスト数・処理時間を集計してくれるツールがあるのでログの書き出し設定を有効化したりします。
これでやっとスタートラインです。
2. ボトルネックを特定する
ログを有効化した状態でベンチマークを回して集計します。その上で,整えたツール達でどのSQLクエリが遅い/呼び出し回数が多いか,どのアクセスポイントが遅い/呼び出し回数が多いかを確認します。
3. チューニングを行う
ここからは色々な手段でチューニングを行っていきます。
- DBにインデックスを貼る(これだけで結構最初はスコアが上がります。個人開発などではなかなか意識できない領域なので,初めて大規模サービスを触る勉強になります。)
- このようなアプリ上のN+1問題を解消する
- 謎にどでかい無駄なクエリ(このような通称観光名所を消す)
- データの持ち方を変える
- *データをキャッシュする
- サーバー・DBを分割する
など,色々できることはたくさんあります。
4. ベンチマークを回す
実際に改善を行ったら,その改善に効果があったかを確認します。FAILしたり,スコアが上がらなかったりしたら,再度メトリクスを見て分析します。2に戻ってひたすら繰り返しです。
ISUCONに手早く取り組むためのおすすめ環境
みなさん,もうISUCONに取り組みたくて仕方が無くなっていると思うので,その方法をご紹介します。
ISUCON14の公式環境(期間限定,1/17 16:00(多分JST)まで)
1/17 16:00(多分JST)まで,ISUCON公式で本選の時の環境を公開してくださっていて,AWSの環境があれば実際にやってみることができるので是非!ISUCONは初めてやろうとすると環境構築で苦戦するので今がチャンスです。
ISUNARABE
@KOBA789さん作のISUCON素振り用サイトです。ベンチマーカーも自分のAWS環境にホストすることにはなりますが,本番さながらの環境で簡単に素振りができます。ありがたや。
自分でセットアップ
その他の方法は,ISUCONの公式ページに書いてあるので参考にしてみてください。自分で環境をホストするのも勉強になると思います。
@matsuuさんが毎年簡単に環境をセットアップできるようメンテナンスしてくださっています。ありがたや。
自分のISUCON記
ISUCON12
大学2年の頭くらいに,PlayGroundの先輩がSlackチャンネルで募集していたのが始まりでした。当時Djangoを学んで案件に入ったり,モバイルアプリを作ったり,フロントエンドをバニラJSだけで作っていたりした頃でした。
当時インフラ経験などは全然無かったのですが飛びついて,Go言語を学び,過去問や講習会,丁度当時に出たISUCON本を見ながら何年分も素振りをしました。当時はISUNARABEなども無かったので自分たちで全て構築していたのですが,色々な罠にはまりまくっていました。SQLiteに翻弄され,結果は上位20%位でした。
当時は予選・本選がありましたが,上位30チームには入れず本選にいけず悔しかったです。ただ,ここでのインフラ周りの学びや,フレームワークをほぼ使わないフルスクラッチでのアプリ理解,計測からチューニングの流れまでを広く学んだことで,SREをはじめとした様々なインターンのご縁にもつながりました。誘ってくださった先輩方に感謝。
ISUCON13
PlayGroundでバックエンドコースを一緒に運営していたメンバーと一緒に出場しました。
PlayGroundからは自分のチームともう一チームが出ることになり,自分の昨年の知見も共有しながら一緒に対策しました。結果としては自分の力も振るわせることができず,真ん中くらいの順位でしたが,Goにも慣れてきてやっていることの解像度が上がり,周りのメンバーにも知見を共有できて良かったです。
チューニングをみんなで一個一個行って点数が上がっていくのは楽しい。
ISUCON14
ISUCON13で出たメンバーは卒業してしまい,複数人で対策する余力なども無かったので出場を多少迷っていたこともありましたが,学生最後ということで,一人でISUCON14に出場しました。結果として,スコアは良かった物の最後にFAILしてしまいました。Write-Upを書いたのでよければこちらも是非。
そして,やるとやっぱ楽しいんですよね。ISUCON。素振りはできませんでしたが,感想戦がまだOpen中なので年末年始に続きをやりたいと思っています。
来年以降
目指せ,1点以上!!?💪
おわりに
ISUCONは技術的な知見を幅広く得られるので,これを活かしつつ,個人開発したり,サポーターズさんなどのハッカソンに出たり,実際に就業型インターンやバイトに参加してみると,技術を超えたチーム開発・プロダクト開発・長期開発といった様々な視点の学びができると思います。色々まずは挑戦だなぁと。
ISUCONに興味を持った方は是非,ぜひ過去問などを触りながらチューニングの泥臭さと面白さを体感してみてください。
そして明日(?)の24日目の担当は,kouくんです!お楽しみに〜!
ん,もう公開されている…!
参考になりそうな資料例
本文中でもあげましたが,以下などは非常に参考になります。ありがたや。
ISUCON事前講習会
東工大のサークルtrapさんの講習会資料
「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」通称ISUCON本