2017/06/30(金)に開催した『第一回社内ISUCON』のレポートです。
あいさつ
こんにちは、 @ocadarumaです。
おもに広告効果計測ツールの開発/運用などをやっています。
最近はちょっとRustにハマってまして、GC無しで参照を適切に管理することの難しさを噛み締めています。(でもコンパイル時に検出できるのが素晴らしい)
Cargoやrustupなどのツールもよくできていて、Rustには未来を感じざるを得ません。
社内ISUCONについて
オプトテクノロジーズでは定期的に社内ハッカソンを開催しており、その日は1営業日を丸々使って、各々業務を改善するツールだったり謎のネタアプリだったりを作ったりします。
そして前回(2017/06/30)は、これまでと趣向を変えて、有志で企画して社内ISUCONを開催しました。
単純にISUCONに興味があったのももちろんですが、オプトテクノロジーズ全体として、システムパフォーマンス/チューニングへの意識や関心がより高まるといいな、という思いがありました。
というわけで今回のtech-magazineでは、社内ISUCONの開催レポートをお届けします。(ちょっと開催から間が空いちゃいましたが)
ISUCONとは
公式サイトより引用:
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。
他社さんでも多くの社内ISUCON開催事例があります(一部)
企画〜準備
問題/ポータルサイトの用意
ISUCONの問題には
- チューニングのしがいがあること
- いくつかの言語で実装が用意されていること
- 適切なベンチマークを実装すること
などが求められ、0から作り上げるのは容易ではありません。
さいわい、pixivさんが社内ISUCON問題を公開してくださっているので、ありがたく使わせてもらいました。(他社さんの社内ISUCON事例でも多く採用されています)
各チームのベンチマーク結果をリアルタイムに表示するポータルサイトも、NTTコミュニケーションズさんの方が使いやすいものを公開してくださっており、こちらを利用させてもらいました。
Scala実装の用意
pixivさんの社内ISUCON問題にはScala実装は含まれていませんが、オプトテクノロジーズではScalaが主要な開発言語の一つであり、Scalaを最も得意とするメンバーがそれなりにいます。
そのため、forkしてScala(Play 2.6)実装を用意しました。
- Scala実装入りの競技者用AMIも公開しました:
ami-a031d9c6
インフラの用意
インフラはAWSを採用し、サーバー構成は以下のようにしました。
インスタンスタイプ | 台数 | |
---|---|---|
競技者用 | c4.large | チーム数分 |
ベンチマーク用 | c4.xlarge | チーム数分 |
ポータル兼本番ベンチマーク用 | c4.xlarge | 1 |
各チームには、競技者用とベンチマーク用の2台のセットを配布し、各チームの好きなタイミングでベンチマークが行えるようにしました。(ベンチマークを実行するとポータルサイトに反映されます)
こうすることで、ベンチマーク実行による負荷が、競技者用インスタンスに影響しないようにしています。
また、この構成だとEC2の台数制限に引っかかるため、あらかじめ緩和申請も行いました。(参考)
当日の様子
ここからは開催当日の様子をお届けします。
集合〜ルール説明/サーバー配布
まず朝の10:00に集合してルール説明を行った後、サーバー一式を配布。
全チームで、デフォルトで立ち上がっているRubyアプリに対してベンチマークを実施し、ポータルサイトに初期スコアが反映されることの確認までを行いました。
(余談ですが、「タイムゾーンが指定されてなかったので」などと言って遅刻するメンバーが出かねないため、参加メンバーには「10:00JST集合」と念を押しました。)
チューニング
サーバーを配布した後は、各チームに分かれてチューニングが始まりました。
おもにDBのインデックス作成およびNginxでの画像のキャッシュに目をつけたチームが多かったようです。
CTO @hiraivaさんの一人チームが先手を切ってスコアを伸ばしましたが、他のチームも続々と追い上げ、混戦を繰り広げました。
ベンチマーク実施
17:30に再度全員集合し、本番ベンチマーク用サーバーで各チームのサーバーに順番にベンチマークを流していき、決戦を行いました。
結果優勝したのは、PHP実装を採用したチームでした!(ちなみに、東京オフィスと仙台ラボの混成チームです)
実はPHP実装は初期スコアがわりと高めなんですが、チューニングポイントとしては
- DBへインデックス貼る
- 静的リソースをNginxから配信する
- Nginxの設定最適化
- クエリチューニング
といった、オーソドックスな内容を主に行ったとのことでした。
開催してみて
後日取ったアンケートでは
- Nginxなどのミドルウェアを使えていないことがわかった
- 悔しいドリブンで勉強捗る。
- 個人的にはあまり経験のないパフォーマンスチューニングについて深く関心を持つきっかけになった
などの声をもらい、目的はある程度達成できたのではないかと考えています。
一方、
- レギュレーションがもっとあると良かった気がする。
- スコアの算出方法が不透明
といった意見ももらいました。(これらは、企画側がISUCON参加経験無いこともあり、当初から不安視していた部分でもあります)
これらをふまえ、次回以降の開催ではベンチマーカーあたりは自作したほうがいいかも、などの反省を得ました。
まとめ
オプトテクノロジーズとしては初の試みでしたが、参加メンバーからは好評でしたしScala実装も多くのチームが使ってくれて、とても有意義なイベントにできたと感じています。
また、今回の社内ISUCONレポートをお読みいただき、
- システムパフォーマンスに一家言ある方
- こういったコンテストなどの社内イベントを企画・運営してみたい方
- CTFとかも面白そう?
など、もしオプトテクノロジーズに興味をお持ちいただけましたらぜひこちらよりお声がけください。
※カジュアル面談ご希望の方は、補足欄に「カジュアル面談希望」とご記載ください