Webアプリケーションを学ぶならISUCONをやってみるといいかもしれない(ISUCON13参加記録)
こんにちは。セーフィー株式会社で管理系Webアプリケーションのフロントエンド開発をしている佐川です。
今回、ISUCONに初参加してみて、Webアプリケーション全般について学ぶ題材としてISUCONはうってつけだと感じたので、記事にしてみます。
以下のような方に、すこしでも「ISUCONやってみようかな」と思ってもらえたら幸いです。
-
Webアプリケーションについて学びたいと思っている人
- 特に、サーバーサイドの処理やインフラについて分からない人
- 異業種から転職してきて、まだ知らないことが多い人
- 必要に迫られないと勉強しない、遅延評価勉強法を取る人
ISUCONとは
『Webアプリケーションをいい感じに早くしよう』という趣旨の技術コンテストです。
コンテスト当日、お題となるWebアプリケーションが動くサーバーが何台か与えられ、それを制限時間内でどこまでチューニングできるのかを競います。ベンチマーカーという、ユーザーシナリオに沿った負荷試験を1分間実行し、その結果をスコアとして出すツールがあります。負荷試験中に捌けたリクエストの数によってスコアは変動し、Webサービスとして致命的なバグや、APIの整合性が損なわれていればFail(0点)。コンテスト順位は、このベンチマーカーのスコアによって決まります。
最大3名のチーム参加が可能です。もちろん1人でも参加可能です。
今回、自分は3名チームで参加しました。
なお、ISUCONにおけるチューニング対象はバックエンドであり、フロントエンドは対象外です。
参加のきっかけ
フロントエンドエンジニアである自分がISUCONに出ようと思った理由は、端的にWebアプリケーションについて学ぶ機会が欲しかったからです。
以下に自分の経歴を簡単に書きます。
- 情報工学部出身ではない
- 開発経験1年
- いわゆる未経験転職組
- 数年ほどほそぼそと個人開発をしている
これまで個人開発では、フロントエンドで完結する、ないしは出来合いのAPIを利用したアプリを作っていました。また、情報工学科を出たわけでも、どこかのスクールでまるっと学んだわけでもなく、ほとんど独学で今に至っています。業務もフロントエンド開発がメインです。
そのため、サーバーサイド、データベース、インフラ…それらの知識はほとんどと言っていいほどありません。
自分はWebアプリケーションの開発に携わっているけれど、Webアプリケーションの一部しか分からない…!Webアプリケーションのこと、もっと知りたい…。
そこで、なにかサーバー側の処理が必要なアプリケーションを作ってみようかな、と考えました。しかし、これといって作りたいアプリが思いつかない。思いつかないので、一向にWebアプリケーションを学ぶ機会が生まれません。自分が必要としないアプリケーションを作ってもたいして面白くないので、クローンアプリを作ったり、ハンズオンをやってみる、といった行動も取らずにいました。
そのまま特になにもせず、面白そうだという理由でNoSQLのDeno.KVを触ったり、「実体が見えないとテンションが上がらないから自宅にサーバーでも生やすか…」と、安くて小さなデスクトップを買ってきておうちサーバーにしたりして過ごしていました。
そんなある日、自分の様子を見ていた友人(ISUCONに何度か参加しているソフトウェアエンジニア)が「ISUCONってのがあるねんけど、チームメイト決まってないんよ。もし気になってたら声かけて~」と声をかけてくれました。
Webアプリケーションのチューニングバトル…?ゲームっぽくて面白そう!APIの処理いじったりデータベースいい感じにしたり、サーバー分散したり、色々やれるのか~…これは、Webアプリケーションについてまるっと学べる良い機会なのではないだろうか…?
かくしてISUCON参加を決め、当日に向けて取り組んでいくこととなりました。
ISUCON当日に向けて取り組んだこと
参加を決めたのが10月上旬、本番が11月下旬ですから、とにかく時間がありません。
Webアプリケーションについて知れたらいいな、というモチベーションで参加を決めましたが、ISUCONはコンテストです。順位が出ます。せっかくなので良い成績は残したいものです。
そこで、せめて『チームメイトの足を引っ張らない程度に動けるようになること』を目標にして取り組むことにしました。
ISUCON本の通読
ISUCONとはなにか、アプリケーションのどこをどのように計測すればボトルネックが分かるのか、なにをどうすればパフォーマンスが上がるのか…なにも分からなかったため、まずは概要を把握しようと考えました。
ISUCONに関する記事を読むとだいたい出てくる『達人が教えるWebパフォーマンスチューニング〜ISUCONから学ぶ高速化の実践』、通称ISUCON本を通読しました。
どのような本なのかは、ぜひ他のかたのISUCON本のレビュー記事を読んで頂ければと思いますが、
一度通読しておくと「こんなことをやるんだな~」というのがざっくり把握できてよかったです。
ISUCONの過去問を解く
なにはともあれ解くのが一番です。触ってみて分かることはたくさんあります。
過去のISUCONで出題された問題はネット上で公開されています。
ISUCONの過去問にチャレンジするためのシンプルな環境構築
上記のページでは環境構築の方法もセットで紹介されているので、チャレンジの敷居はとても低いです。
AWS、GCP、ガバメントクラウドに採択されていま話題のさくらのクラウドなど、お好きなクラウドサービスで構築するもよしですし、まずはアプリを動かして触ってみるだけであれば、ご自身のマシン上に構築してもよいでしょう。
チームでは以下の過去問に取り組みました。
ISUCON11予選で出題された課題アプリケーション『ISUCONDITION』はシンプルなサービスなので、APIの実装やデータ構造の把握がしやすく、初心者におすすめかなと思いました。
課題となるアプリケーションには、「ここは改善ポイントです!」と言わんばかりの箇所がいくつも存在しています。まずはそういった部分をチマチマと改善してみること。これだけでも結構おもしろいです。
そこから少しずつ、計測結果からボトルネック箇所を突き止める流れを癖付けたり、アプリケーションとデータベースでサーバーを分けてみたり、色々と手を出してみるのが良さそうです。
自分は「INDEX貼るって何?」「INNER JOINとLEFT JOINの違いって何?」というレベルからのスタートだったため、そこまでは至れませんでした…。
実行が遅くてデータベースからなかなか結果が返ってこない部分(いわゆるslow query)の解消や、アプリケーション側が不必要にクエリを投げてる部分(N+1問題)の解消、また、デプロイ効率化のためのMakefileの作成などができるようになりました。
ISUCON13当日
当日の朝10時、お題となるアプリケーションが発表されました。
こんいす~(かわいい!)
今年はYouTubeを模した、ISUPipeというアプリケーションでした。
これをここから8時間でチューニングしていくわけですが…Hotfixでリリースしなければならない!というときの緊張感に近しいので、アドレナリンが出ます。
序盤の方で、アプリケーションのmainブランチに直接pushする大罪を犯してアプリの整合性が取れなくなったり、DNSが分からなくて早々に思考を放棄し現時点でボトルネックになっているところを解消するのではなく目についてるN+1を黙々と解消したりと、わりあいめちゃくちゃな動きをしていましたね…。
とはいえ、お祭りのようでとても楽しかったです。
ISUCONに取り組んでみて感じたメリット
一番伝えたいのはこちらです。
Webアプリケーションについて頭から尻尾まで触ることができる
個人開発のネタがないとWebアプリケーションを作れない、かといって会社のアプリケーションでは、規模が大きければ大きいほど全体像の把握だけでへとへと…
ISUCONのお題は、8時間で改善しなければならないという制約上、比較的コンパクトなアプリケーションの作りになっています。さくっと把握できるというのは嬉しいですよね。
サーバー上にWebアプリケーションの環境を立てるところから、アプリケーションの処理、データベース、ログを取るべくOpenTelemetryを仕込むだとか…そういったものをまるっと触っていくことができます。
実際に動くアプリケーションを触って改善したり壊したりして得られる学びは大きいです。そういった機会が得られるISUCONはとても良いと感じています。
改善しがいがあるので面白い
ISUCONのお題として用意されるWebアプリケーションには様々なボトルネックが存在しています。初心者でも改善できそうなところから、Webアプリケーションを知り尽くしていないと手が出せないものまで様々です。
改善の結果、ベンチマーカーのスコアがわずかにでも上がれば嬉しいですし、あきらかに改善しているはずなのにスコアが下がれば「ボトルネックが別のところに移ったんだな、追え~!」とゲーム感覚で取り組むことができます。
個人開発の場合、突如爆発的に人気が出たりしない限りは、そもそもパフォーマンスが問題にならないケースが多いと思います。また、会社のアプリケーションも分かりやすくボトルネックになりうる箇所なんてすでに潰され存在していない(はず)ですから、そういう点でもISUCONはよい題材ですよね。
本番当日に向けて勉強しようと思える
締め切り駆動、あるいは遅延評価勉強法…。必要に迫られないと、どうしてもやれない…やらない、そんな方、いますよね。私です。
一度参加を決めてしまえば、参加するには良い結果を残したいという欲や、チームメイトの足を引っ張らない程度には動けるようになりたいといったモチベーションが湧いてきます。
おわりに
ISUCONだからこそ許される行いもありますが(スコアを上げるために、ログの出力を全部止める、など)、それでもWebアプリケーションについて得られる知見は多くありました。これまでフロントエンド以外の処理についてはざっくりとした認識しかありませんでしたが、より高い解像度で眺められるようになりました。
ISUCONはとても楽しい。
みなさん、来年のISUCON14でお会いしましょう。
(来年はどうか分からないですが)予選 aka 参加申し込みを勝ち抜きたいです。
おまけ: ISUCON13参加記録
以下に備忘録的に残しておきます。
結果
最終得点: 9938(250/600位くらい)
チーム
チーム名: 梅割り駆動開発
- @HirokiYoshida837: 環境構築、Elasticの導入から、アプリの改善、すべてやる
- @barometrica: Index貼ったりN+1潰したり
- @sagawao: やれることをやる
Discussion