採用はこちら!

Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
11 min read

ISUCONでいいかんじにスキルアップしよう

こんばんは。いや,こんいす〜!大学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)やマッチングアルゴリズムのチューニングと言った今までにはない様々なスコアアップチューニングポイントがありました。

解説と講評

ISUCON14 問題の解説と講評 : ISUCON公式Blog
こんにちは、ISUCON14の作問チーム・NaruseJunのとーふとふです。この記事では、ISUCON14の問題として出題した「ISURIDE」の解説と講評をお届けします。今回の問題は、NaruseJunのメンバーが所属するポケットサインが作問を担当し、LINEヤフーの皆さんにフロントエンド実装で

ISUCON13本選 - ISUPIPE

仮想の動画配信サービス。こんいす〜。DNS水攻め攻撃という攻撃が来るので,それの対策に時前のDNSサーバーをGoで作るようなチームもいたみたいです。N+1問題が大量に埋まっていたりと王道のチューニングも多かったイメージ。

解説と講評

ISUCON13 問題の解説と講評 : ISUCON公式Blog
2023.12.1 12:04 If-None-Matchについて追記 ---- こんいすー こんいすー ISUCON13 の作問チーム、さくらインターネット kazeburo です。 この記事ではISUCON13の問題となった「ISUPipe」について問題の解説と講評をします。 今年のISUCONではさくらインターネットが作問を

ISUCON12

ISUCON12までは,予選があり,上位30チームが本選に出場できました。

予選 - ISUPORTS

マルチテナントな競技用リーダーボード。この予選の特徴と言ったらなんといってもテナント毎に物理的にSQLiteファイルが分けてマルチテナントSaaS!となっていたことですね。個人的には初ISUCONで面食らいました。予選のボリュームとしてすごかったです。

解説と講評

ISUCON12 予選問題の解説と講評 : ISUCON公式Blog
ISUCON12 予選問題の解説と講評 予選問題作問チーム、面白法人カヤックの fujiwara です。 ISUCON12予選に参加された皆様、ありがとうございました。おかげさまで大きなトラブルもなく予選を終えられて安心しています。このエントリでは、予選に出題された問題の解説と、皆様

本選 - ISUCONQUEST

自分は出られなかったのですが,クッキークリッカー風?のゲームでした。Unityでゴリゴリにゲームクライアントが作られていてすごい!となっていました。ゲームならではのログイン処理だったり,サーバーが3台では無く5台でDBのシャーディングが求められたりと,素振りするにもボリューミーでした。

解説と講評

ISUCON12 本選問題の解説と講評 : ISUCON公式Blog
こんにちは、ISUCON12の本選問題作問チームの goodoo です。 この記事では、本選問題の「ISU CONQUEST」について、問題の解説と講評を行います。 ISU CONQUESTとは今年も、問題に関する動画を作成いただきました。 まずは、動画を見てみましょう。 ゲームです! 育成型放

そのほか

住まい検索サービス,フリーマーケットサービス,学校の離礁登録システム,飛行機の予約サイトなどなど,様々なサービスが登場しました。古いものだと一部バージョンの古さなどで苦労することもあると思いますが,どれも面白いので是非触ってみましょう!

公式のISUCON問題以外にも, @catatsuy さんがメンテしてくださっている「private-isu」もあるので,是非見てみてください。

GitHub - catatsuy/private-isu: a web application performance improvement training
a web application performance improvement training - 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は初めてやろうとすると環境構築で苦戦するので今がチャンスです。

x.com

ISUNARABE

ISUNARABE

@KOBA789さん作のISUCON素振り用サイトです。ベンチマーカーも自分のAWS環境にホストすることにはなりますが,本番さながらの環境で簡単に素振りができます。ありがたや。

自分でセットアップ

その他の方法は,ISUCONの公式ページに書いてあるので参考にしてみてください。自分で環境をホストするのも勉強になると思います。

ISUCONの過去問にチャレンジするためのシンプルな環境構築 : ISUCON公式Blog
過去のISUCONで出題された問題をシンプルに環境構築できるページなどを紹介します。 初めてISUCONにチャレンジするという方は、事前講習のスライドや動画でISUCONの競技の流れをまとめています。2021年と2022年とそれぞれありますので参考にしてみてください。

@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を書いたのでよければこちらも是非。

学生最後のISUCON14に一人で出て30位以内に入ったと思ったら失格だった!😇

そして,やるとやっぱ楽しいんですよね。ISUCON。素振りはできませんでしたが,感想戦がまだOpen中なので年末年始に続きをやりたいと思っています。

来年以降

目指せ,1点以上!!?💪

おわりに

ISUCONは技術的な知見を幅広く得られるので,これを活かしつつ,個人開発したり,サポーターズさんなどのハッカソンに出たり,実際に就業型インターンやバイトに参加してみると,技術を超えたチーム開発・プロダクト開発・長期開発といった様々な視点の学びができると思います。色々まずは挑戦だなぁと。

ISUCONに興味を持った方は是非,ぜひ過去問などを触りながらチューニングの泥臭さと面白さを体感してみてください。

そして明日(?)の24日目の担当は,kouくんです!お楽しみに〜!

【Lottielab】クリスマスプレゼントを届けよう!🎁
アニメーションつきの美しいWebサイト・アプリケーションの開発に役立つ便利なツールを紹介します🙌

ん,もう公開されている…!

参考になりそうな資料例

本文中でもあげましたが,以下などは非常に参考になります。ありがたや。

ISUCON事前講習会

東工大のサークルtrapさんの講習会資料

ISUCON初心者向け講習会
ISUCON workshop for beginners in traP

「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」通称ISUCON本

達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践
LINE株式会社が主催するWebサービスのパフォーマンスチューニングコンテスト,ISUCON(Iikanjini Speed Up Contest)で技術を競い合ってきた著者がWebサービス高速化のための考え方とノウハウをわかりやすく解説。本書では,お題となるWebサービスをひとつ用意して,手を動かしながら高速化手法を学んでいきます。Webサービスがどのくらいの負荷に耐えられるか,どのくらいの負荷で不具合が起こるかを検証し,不具合が起こる原因を突き止め,改善していきます。また,負荷に対応する方法だけでなく,負荷を発生させる方法(ベンチマーカーの作成方法)も紹介します。本書を読んで,Webサ…