シニアエンジニアの id:astj です。ISUCON は予選上位までいけるものの本選には届かないことが多いです。
先日、昨春入社したアプリケーションエンジニアを対象としたエンジニア新人研修*1の一環で株式会社はてな 社内 ISUCON を id:dekokun id:hokkai7go と3人で企画・開催しました。このエントリではその様子について紹介しようと思います。
※「ISUCON」は、LINE株式会社の商標または登録商標です。
ISUCON についての詳細は ISUCON公式ブログでご確認ください。
開催の経緯
ISUCON とは何か、というのは ISUCON 公式 Twitter のプロフィール文でよく説明されているかと思いますのでこれを引用します。
ISUCON とは、LINE株式会社が運営窓口となって開催している「お題となる Web サービスを決められたレギュ レーションの中で限界まで高速化を図るチューニングバトル」です。
ISUCON公式 (@isucon_official) | Twitter
Web アプリケーションが動く仮想マシンが参加者ごとに用意され、そのアプリケーションがより高パフォーマンスを実現できるように1日かけてアプリケーションとインフラ両面をチューニングするイベントです。公式ブログのまとめ記事によると、直近の ISUCON10 はオンラインで開催され、予選には実に1209名が参加しています。
さて、この ISUCON 自体はコンテストということである種のお祭なのですが、 Web アプリケーションのパフォーマンス調査や対応は当然のことながら実際の Web アプリケーションの開発・運用を行う中でも大いに役立つ物です。そこで今回は、2020年春に入社したエンジニア向け新人研修の一環、パフォーマンス問題に対する調査・解決アプローチを学ぶ機会として、ISUCONのやり方を採用した社内研修「株式会社はてな 社内 ISUCON」を実施することにしました。
構成・準備
今回は以下の内容で構成しました。
- 問題: showwin/ISHOCON1
- 内容: 講義 + 競技 + ふりかえり
- 期間: 1営業日 (タイムスケジュールは後述。競技時間そのものは昼休憩を含めて7時間)
- チーム構成: 競技者2名 + メンター1名の3人1組
問題には @showwin さんが公開している ISUCON *系* のパフォーマンスチューニング課題である ISHOCON1 を利用させていただきました。
Web アプリケーションのパフォーマンスチューニングとして素直な問題であること、限られた時間(1日)で取り組むのに適しているボリューム感であること、また README にて触れられているように各社の社内 ISUCON や勉強会の題材として利用されてきた実績があることで選定しています。
今回社内で開催するにあたっては、ふたつ改修を加えています。
ひとつめは Node.js 実装の追加です。もともとの ISHOCON1 には Node.js 実装は存在しませんでしたが、参加者からリクエストがあったため Node.js 実装を今回新しく追加しました。開催後に ISHOCON1 のリポジトリに Pull Request を送り 、現在はリポジトリに含まれています。
もうひとつはベンチマーカーに手を加え、スコアを Mackerel のサービスメトリックとして投稿できるようにしたものです。元々 ISHOCON1 のベンチマーカーはスコアを画面表示するだけでしたが、この改修によって Mackerel のサービスメトリックのグラフを簡易的なポータルとして使えるようにしました。こちらの改修内容は我々の環境に特有の内容なのでフィードバックはしていませんが、GitHub の fork 側に一応内容は残してあります。興味のある方はご覧下さい。
また、今回は パフォーマンス問題に対する調査・解決アプローチを学ぶ機会 として企画しているので、競技自体の前に簡単な講義と、競技後のふりかえりを用意して研修として整備しました。
講義では社内における障害対応の流れを再確認したほか、 Web アプリケーションのパフォーマンス調査や改善に関する資料やアドバイスを中心に構成しました。 tkuchiki/alp や pt-query-digest など調査によく利用されるツールも紹介しています。
競技後のふりかえりについては、競技中に調査や対応したこと、そして結果(ベンチマーク結果 = スコア)を記録した上で、終了後にチーム間で共有しあうようにしました。 ISUCON の感想戦をもう少しフォーマルにした構成、といえるかもしれません。
これらの事前の講義とふりかえりを含めてタイムテーブルを組んでいます。
時間 | 内容 |
---|---|
10:30~11:00 | 講義 |
11:00~18:00 | 競技(途中昼休憩を含む) |
18:00~19:00 | ふりかえり |
そして、チーム構成については各参加者が躓きすぎずに取り組んで学びを得てもらうために、(研修対象エンジニア2名 + メンター役の先輩エンジニア1名)の3人1組をひとつのチームとしました。メンターに関しては、基本的には研修対象のふたりに任せつつ、詰まった時や方向性を見失ったときにフォローする役割です。メンターがフォローすることで、対象者たちだけで進められず躓いてしまった場合でも学びと経験を持ち帰ってもらえるようにという期待でこの構成としていました。実際各チームには1人ずつ ISUCON 参加者がいたことでメンターが手を動かして助けに入る場面はあまりなかったようですが、時折アドバイスして助けになっていたようです。
開催しました
開催された2021年2月は新型コロナウィルス感染症拡大防止のための緊急事態宣言が発動されていたということもあり、当日は運営メンバーや参加者全員がそれぞれ自宅から参加し、通常業務同様に Slack / Discord / Scrapbox といったツールを利用したリモートでの開催となりました。
実際に開催されたスコアの様子です。正攻法のパフォーマンスチューニングから、不変レコードをメモリに載せるような ISUCON 向けのテクニックまで各チーム色々飛び出しつつ、パフォーマンスチューニングと向き合う1日となりました。
アンケート
競技後に参加者やメンターを対象に実施したアンケートの回答の一部を以下に紹介します。前述したように今回のふりかえりパートは感想戦的な内容で構成していましたが、開催意図からすると運営側からの解説をもう少し用意してもよかったのかもしれません。幸い ISHOCON1 はインターネット上でも解説がいくつか公開されているので、解説を参考にしながら議論するような形にしても良いかもしれない、と筆者は本稿を書きながら考えています。
今日の経験は今後仕事で役に立ちそうですか?
- ISUCON, いつもは手を動かす側なので, メンターとして社内ISUCON を俯瞰して? 見れたのは良い経験だった. 業務での障害対応や, ISUCON参加するときに有益な知見が得られたと思う.
- はい。計測のポイントや、普段PWGで見ているような計測結果をどのように出すのかを学べて、実際に改善も できたので、仕事にも役立ちそうと思っています。 ISUCON的な裏技については仕事で実際に使わないこともあるかもしれませんが、それでも何がボトルネックになっているかというのを知ることができてよかったです。
- 複数人で限られた時間でパフォーマンスチューニングする、という経験はなかなかないので、そういう時にどうやればうまく回るのか/どういうのが悪手なのか、みたいなことが分かってよかった
ふりかえりパートについて
- 相手チームが何をしてどういう結果になったかを知れたことと、取った対策のメリット・デメリットについて確認できたところがよかったです。もう少しまとめを準備するのに使える時間があるとありがたかったです。
- 大体こういうボトルネックがありました、こういった計測をするとこうしたボトルネックが分かりました、こう修正するとスコアが上がります、みたいな解説がもうちょっとあると良かったかもです。
結び
ここまで、エンジニア新人研修の一環、パフォーマンスチューニングの演習として社内 ISUCON を開催した様子を紹介しました。このような形での社内 ISUCON は、学びとおもしろさのバランスとして良いイベントにできるのではないかと考えています。
また、こういった企画ができたのは本家の ISUCON あってのことですし、今回採用した ISHOCON1 を始め様々な ISUCON / ISUCON *系* の問題が公開されているからこそでもあります。ISUCON とそのカルチャーを支える皆様に感謝の気持ちを記して、今回の紹介の結びとさせてください。ありがとうございます。
*1:昨春なので入社から1年近く経ってしまいましたが……