Reactive Summitで、Pivotusのエンジニアリング担当ディレクターであるLilit Yenokyan氏は、リアクティブサービスのためのパフォーマンステストについて発表した。Yenokyan氏はパフォーマンステストの種類について説明し、テストを実行して結果を分析するために必要なツールについて紹介した。
Yenokyan氏はまず、顧客との会話を管理する銀行代理店向けポータルのシステムについて説明した。これにはReact Nativeアプリも含まれている。アプリケーションはどの銀行でも使われる可能性がある(ユーザーは何百万人にもなる可能性がある)。
チームはこのシステムが生み出すトラフィック量の大きさを認識するにつれ、システムはどれだけの負荷に耐えられるのか、それをどうやって定量化するのか、という疑問が持ち上がった。
Yenokyan氏は、パフォーマンステストの目標を、キャパシティを決定することだと定義する。パフォーマンスメトリクスを用いることで、システムのパフォーマンスをシステムを実行するためのコストで評価、比較することができる。これは1ドルあたりのパフォーマンスという意味をもたらし、潜在的利益が時間に相当する場合、最適化につながる可能性がある。
Yenokyan氏は、3種類のパフォーマンステストを定義する。負荷テストは、一定数のユーザーからなるシナリオだ。ストレステストは、システムをその限界まで追い込むことだ。これにより、どれだけの圧力を与えるとシステムが崩壊するのかがわかる。また、そうした障害からの復旧をテストすることもできる。耐久テストでは、ある程度の期間、中程度の負荷で動かす。これにより、メモリ枯渇などの問題を明らかにすることができる。
パフォーマンステストを実行するための最初のステップは、成功基準を定義することだ。そのためには、同時ユーザー数といった具体的な基準でスケールを定義する必要がある。次に、シナリオを定義して実装する。目標は、テスト対象のシステムが具体的なパフォーマンスターゲットにおいて定式化できるように定義しなくてはならない。理想的には、テストは本番クラスタ上で実行する。しかし、これは実用的でない場合が多く、本番のクローン環境が次善の策になるだろう。
Yenokyan氏は、彼女のチームのテストスタックを構成しているツールをいくつか挙げた。テスト自体はApache JMeterで実行される。JMeterはリクエストを並行に送信して結果を蓄積するテストツールだ。
Jenkinsはテスト自体を実行する。これは負荷テストに役に立つ各種パラメータとビルドトリガーを与える。また、パラメータ化されたビルドは、手動での実行に頼ることなく、テストをきめ細かく制御する手段を与えてくれる。
テスト結果は、時系列データベースのInfluxDBに送られる。そのあとデータは、ビジュアライゼーションツールのGrafanaで可視化される。インフラストラクチャ監視サービスのDatadogは、システムの各種マシンのリソース消費に関して追加のメトリクスを与えてくれる。
モノリスのテストとマイクロサービスのテストの違いは、結果の解釈の仕方にある。モノリスでは、パフォーマンスは全体として観測される。マイクロサービスでは、各マイクロサービスを互いに独立してテストし、それから個別に最適化して、スケーリングする。
Yenokian氏は続けて、チームが学んだ教訓について語った。1つはスケーリングをテストすることだ。チームは、インスタンスを追加することでアプリケーションがリニアにスケールするものと思っていたが、テストによってスループットが変わらないことが判明した。彼らはデータを分析することで、データベースやWebソケットの制限など、水平方向のスケーリングを制限する複数のボトルネックを発見したという。
Yenokyan氏は覚えておきべことを次のようにまとめた。
- コミットする前に期待されるパフォーマンスを定義する
- 早期に計測を始める
- 明らかだと思うことに疑問を持つ
- リリース毎にパフォーマンスを計測する
Rate this Article
- Editor Review
- Chief Editor Action