Pythonベースの負荷テストについて知っておくべきこと:負荷テストの重要性と準備方法
アプリケーションに多くのユーザーが同時にアクセスすることで、障害が発生する危険性がある。そうした需要に対応する準備が整っていることを確認することは重要だ。本稿では、負荷テストのベストプラクティスにPythonを利用できる箇所と、アプリケーションを適切に準備する方法を解説する。
アプリケーション開発チームは負荷テストを実施することで、少なくとも所定の負荷値まではアプリケーションが想定通りに機能することを保証できる。だが、負荷テストを重視しない開発チームがあまりにも多い。
開発者がスポットチェックを行ったり、パフォーマンスを高めるコーディング手法を採用したりすることは可能だ。だが、予期しないユーザー負荷が原因でサーバがロックすると、企業もユーザーも不意を突かれることが多い。負荷が高過ぎてアプリケーションが機能しなくなるのは恥ずべきことだ。
そこで、本稿では、負荷テストのベストプラクティスにPythonを利用できる箇所と、実際の状況に合わせてアプリケーションを適切に準備する方法について説明する。
負荷テストが重要な理由
負荷テストは一種のパフォーマンステストで、アプリケーションにどの程度まで負荷をかければ、パフォーマンスや機能に悪影響が出るかを検証する。
あるソフトウェア開発企業が、登録したユーザーが自身の処方箋と投薬状況を毎日追跡できるWebサイトを新しく立ち上げる準備を整えたとする。このアプリケーションは、指定された時間に薬を服用するよう毎日登録ユーザーにメッセージを送信し、その情報を登録ユーザーの医療記録と医療提供者に中継する。
負荷テストでは、テスト担当者がサーバに負荷をかけ、1000〜100万人のユーザーが同時に登録、ログイン、医療データの入力を行う状況をシミュレーションする。サーバリソースの消費量が1%程度であれば、アプリケーションは想定通りに機能し、適切なパフォーマンスを発揮するはずだ。次に、テスト担当者はサーバリソースの50%を消費するまで、あるいはサーバが停止するかアプリケーションがロックするまでユーザー数を増やしていく。テスト担当者が負荷をテストする際は、負荷をかけた時間やデータ取得速度も計測し追跡する。負荷をかけるユーザー数を変えながら、アプリケーションとサーバのパフォーマンスをドキュメントに記録する。
効果的な負荷テストは、システムの次のような問題点を特定できる。
- パフォーマンスのボトルネック
- スケーラビリティ
- アプリケーションの安定性
- ユーザー負荷の最大キャパシティー
- フェイルオーバーのポイント
- データ取得速度の問題点
ポジティブなカスタマーエクスペリエンスを提供する有用なアプリケーションを提供するためには、キャパシティーに応じてアプリケーションがどのようなパフォーマンスを発揮するかを理解することが不可欠だ。負荷テストは、システムのキャパシティーとパフォーマンスをテストして改善する方法を提供する。また、アプリケーションがクラッシュしたり、機能を停止したりすることがないよう、キャパシティーを別のサーバに負荷分散しなければならないポイントも負荷テストによって確立される。
Pythonを使えば、負荷テスト用の機能を組み込むことができる。Pythonは、最も人気が高く、効率の良い負荷テストツールの一つを支えるプログラミング言語だ。
Pythonを使用する負荷テストツール
開発チームは、負荷テストツールを使うことで、システムやアプリケーションに対するさまざまな負荷を測定、分析できる。
ツールでは、さまざまな重要項目を測定、分析する機能が提供される。測定、分析される重要項目の例には、ピーク時の負荷をサポートする際のスループットレート、システムリソースの使用レベル、ハードウェアのパフォーマンス、ロードバランサー機能とパフォーマンス、同時実行のパフォーマンス、負荷レベルに応じて生じるアプリケーションの問題点の可視化、アプリケーションの設計上の欠陥などがある。
効果の高い負荷テストは、システムの遅延、非効率なページ読み込み、クラッシュを、他の形式の手動テストや自動テストよりも正確に特定する。
負荷テストを使えば、フェイルオーバーのポイントを判断できる。フェイルオーバーポイントとは、アプリケーションがクラッシュしたり機能を停止したりしないように、ロードバランサーを立ち上げるか、過剰なユーザー負荷を他のサーバにオフロードするポイントを指す。
Locustによる負荷テストの作成
オープンソースの「Locust」と「Apache JMeter」は最も広く使用されている負荷テストツールだが、他にも多くの選択肢がある。
負荷テストの担当者や開発者は、Locustを使ってアプリケーションにかかるユーザー負荷のシミュレーションができる。Locustでは、負荷テストとテスト後の結果のダッシュボードへの表示にPythonコードを使用する。
Locustを負荷テストツールとして使用すると、次のようなメリットを得られる。
- Test-as-code(テストをコードで記述する)機能
- ユーザーにとって使いやすいWebベースのUI(ユーザーインタフェース)
- ダッシュボード、ビジュアルチャート、テストレポートによる結果分析
- アプリケーション実行中のパフォーマンスの追跡
- テストスクリプトを複数実行する反復可能なテストのサポート
- オープンソースへのアクセス権
- Python開発者にとっての使いやすさ
- システムやプラットフォームへの非依存性
ここからは、Locust負荷テストを作成する手順の簡単な例を紹介する。
- HttpUser、task、timeおよび幾つかのclassをインポート(Import)する
- 引数としてHttpUserクラスを受け取るclassとしてAuthenticateUserを作成する
- 各タスクを10秒間隔で実行するための変数timerを作成する
- 登録とログインのプロセスをカプセル化する関数authenticate_taskを定義する
- テストファイルの開始時に実行するメソッドon_startを実装する
import time from locust import HttpUser, task, between class AuthenticateUser(HttpUser): timer = between(1, 10) @task def authenticate_task(self): self.client.get("/login") self.client.get("/register") def on_start(self): self.client.post("/register",json={"username":"testuser", "email":[email protected]", "password":"password"})
広く使われているオープンソースのツールApache JMeterも負荷テスト専用に設計されている。ただし、こちらはPythonではなくJavaをベースとする。このオープンソースのデスクトップアプリケーションはJavaを使って完全にカスタマイズ可能で、さまざまな種類の負荷をテストできる。Apache JMeterは、アプリケーションのパフォーマンステストをサポートし、Webサービス、LDAP(Lightweight Directory Access Protocol)、データベース、シェルスクリプトのテストをサポートする。また、テストスクリプトの作成を容易かつ迅速にするための記録と再生の機能も備え、強力なサポートが得られる開発者コミュニティーもある。
Python負荷テストのベストプラクティス
負荷テストは少なくとも最初は複雑に感じる。負荷テストを効果的に行うには、幾つかのベストプラクティスに従う必要がある。ベストプラクティスに従えば、テストの品質とメンテナンスの容易さ、結果の正確性が確保される。一連のベストプラクティスに従うことで、品質の高い負荷テストと結果の正確性が保証される。
負荷テストには次のようなベストプラクティスがある。
- 負荷テスト専用の独立したテスト環境を作成する
- 別のサーバで運用環境を模倣し、運用環境でテストを行うことで生じるリスクを避ける
- 運用データを模倣するスクラビングしたテストデータを使用する
- 運用インフラを模倣する負荷テストシステムのインフラを確保する
- テストのシナリオは優先順位とリスクに基づいて特定する
- 関連する全てのエンドポイントをテストに含める
- データベースからの取り出し時間を含める
- 主要アプリケーション機能を含める
- テストスクリプトを開発する
- アプリケーションが設計通りに機能することを証明するだけでなく、アプリケーションの機能を停止させるようなテストを設計する
- たとえわずかでもパフォーマンスを向上する機会を探す
- テストスクリプトを実行する
- 履歴参照を目的にテスト結果を追跡する
- アプリケーションコードとテストスイートを最新状態に保つ
- テストのレポートと結果を分析する
- 欠陥や問題のある部分だけでなく、改善できる部分を探す
- フェイルオーバーやロードバランサーが立ち上がるキャパシティーポイントをドキュメントに記録する
- アプリケーションの限界を認識、理解し、障害を防ぐ対策を講じる
- 必要に応じて問題点を修正し、アプリケーションのパフォーマンスを最適化する
- 設計上の問題点やシステムの問題点を可能な限り効果的に解決する
- 次のような重要なパフォーマンス指標を測定する
- 応答時間
- 待機時間
- エラー率
- 1秒当たりの要求数
- 成功したトランザクション数
- 失敗したトランザクション数
- CPU使用率
- 同時実行ユーザーのパフォーマンス
Pythonを使用するか、他の手法を利用するかにかかわらず、負荷テストによってアプリケーションの応答性が改善され、フェイルオーバーや負荷分散の計画が生み出される。Pythonは負荷テストに直接使用する場合もツール内で使用する場合も強力な言語になる。
アプリケーションが成功を収め、ポジティブなカスタマーエクスペリエンスを生み出せるかは、そのアプリケーションにかかる負荷をどれだけうまく処理できるかにかかっている。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
Google Cloud、パフォーマンスとリソースの最適化に役立つ3つのOSSツールを公開
Google Cloudは、Google Cloud上のKubernetesクラスタの最適化に役立つ、サイジング、パフォーマンスベンチマーク、負荷テストといったタスクを支援するオープンソースツールを公開した。長期的なセキュリティ最適化を支える継続的な脅威エクスポージャ管理(CTEM)
さまざまなサイバー攻撃に対して、企業は対策を自動化したり、セキュリティパッチを導入したりしているが、全ての攻撃を防ぐことはできない。継続的に、ビジネスを大きく脅かす脅威への対処に注力すべきだ。機械学習をPythonで学ぼう! 基礎、できること、ライブラリ
「知識ゼロから学べる」をモットーにした機械学習入門連載の第1回。ルールベースと機械学習ベースの違いから、教師あり学習などの学習方法、回帰/分類などのタスクまで基礎の基礎から説明。機械学習のためのPythonライブラリも概説する。