体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

人類はインターネットでテレビができるのか?──大規模トラフィックを支えるAbemaTVの裏側とは

AbemaTVの負荷対策とは

10月21日に開催されたAbemaTVの取り組みや技術的知見を披露するイベント「AbemaTV Developer Conference 2017」。その最後のセッションに登壇したのが、サイバーエージェント技術本部のService Reliability Group(SRG)という横断的組織の岡田翔乃介さんだ。

岡田さんは2015年4月に新卒で同社に入社し、AmebaブログやOwnd、CROSS MEなどに携わった後、2016年12月よりAbemaTVのインフラエンジニアとして活躍している。セッションタイトルは「AbemaTVの裏側- 大規模トラフィックを支える技術と負荷対策の話」。その概要を紹介する。

AbemaTVのアーキテクチャーは膨大である。GKEについて知りたい方は、昨年のDEVELOPER CONFERENCE(DevCon)で話しているので、こちらも見てほしい。

また「Google Cloud Next ’17 in Tokyo」では、Googleの「世界規模のクラウドネットワークの負荷分散、最適化、セキュリティ確保」についての講演内で、AbemaTVのネットワークについても紹介されており、こちらはYouTubeで公開しているので、ぜひチェックしてほしいとのこと。

まずはAbemaTVの負荷試験について。昨年のDevConから今日まで、年末年始のイベントから始まり、「劇場版魔法少女まどか☆マギカ[新編]反逆の物語」、「亀田興毅に勝ったら1000万円」、「モンスターストライク 十二支再競争」、「第30期竜王戦決勝トーナメント」など、いくつものヒット企画や番組が誕生した。

喜ばしいことだが、インフラエンジニアからすると試練の連続だった。そんな試練を乗り越えるための対策の代表例が負荷試験である。負荷試験ではLocustとwrkという2種類のツールを使用している。

大規模な負荷試験にはLocustを採用

LocustとはPython製の分散型ユーザー負荷テストツール。特徴はgeventを使用した完全なイベントベース機構であること。

ちなみにgevent自体はコルーチンベースで、複数のtaskをこなす非同期IOライブラリである。Greenletという軽量型のコルーチンが実体で、OSプロセス内では実行されるが、協調的にスケジューリングされるというものだ。

なので、OSがスケジューリングして本当に並列に動くPOSIXスレッドを利用した並列機構とは、少々毛色が違う。

IO待ちになったらon_eventが発火し、別のタスク(シナリオ)が実行される。そのため、シナリオファイルを単独で実行していると、CPUが一コアだけしか使用されていないように見えるかもしれない。そうではなく、コアを十分に使用したい場合は、distributed mode機能を使用する。

AbemaTVでは、GKE上で大量のdistributed mode workerを配置してシナリオファイルを回し、high-throughputを実現している

Locustクラスタの詳細は次の通り。シナリオの用途別によりクラスタを切り分けている。


複合シナリオで負荷試験を実施する場合のみだが、トータルで9984コアのメガクラスタで負荷試験を実施することもある。この規模の負荷試験を基本的には、1~2人のインフラエンジニアが短期間で実施している。

Locustを使うメリットは複数ある。第一にWeb UIからリアルタイムで各pathのreq/secやexeptionを観測することができること。リアルタイムで描画されるため、何か問題があった場合には、すぐに対応できるのだ。

第二にScaleに強く、GKE×Locustのの組み合わせは相性が良いこと。第三はかゆいところに手が届くこと。例えばpush受け取り時、CM入り、videoの視聴時など、ユーザーの綿密なシナリオもLocustで表現ができる。

デメリットはPythonで何でも書けるので、自由度が高い分、秘伝のタレ化しやすいこと。現状、先人が書いたコードを継ぎ足したり削ったりして使用している。そのためまだまだ改善の余地はある。

綺麗にしたら9984コアも要らない説もあるので、こちらに関してはデメリットというより、どちらかというと今後の課題に近いとのこと。

今後の展望は、負荷試験環境の起動や停止、シナリオの実行、レポートの集計まではChatOps化したい。シナリオの作成のみ手動で、残りは全て自動化したいと考えている。

また、boomerを使用した全シナリオのリプレース、パフォーマンス検証も実施したい。

1 2 3次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。