Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ApacheJMeterを使用してRailsアプリの負荷テストを行う

ソフトウェアをエンドユーザーにリリースする前に、さまざまな種類のテストを実行して、アプリケーションにバグがなく、ビジネス要件を満たしていることを確認します。多くのテストを行っていますが、ユーザーが実際に使用しない限り、ソフトウェアが安定していることを確認することはできません。エンドユーザーがアプリケーションの使用を開始した後、次の理由のいくつかにより、さまざまな原因でアプリケーションが期待どおりに動作しなくなる可能性があります。

  • ユーザーの行動は予測できない場合があります;
  • ユーザーはさまざまな場所に分散しています。
  • 多数のユーザーが同時にアプリケーションを使用している可能性があります。

大規模なアプリケーションの場合、本格的なリリースの前にこれらのことを知っておくことが非常に重要です。アプリケーションが期待どおりに機能するようにするには、その機能を展開する際にいくつかのことを考慮する必要があります。

  • 段階的な展開 -段階的なロールアウト中に、すべてのユーザーが機能にアクセスする前に、一部のユーザーがアプリケーションをテストできます。これは、ユーザーの行動を判断するのに役立ちます。
  • 負荷テスト -段階的な展開中に、ユーザーの行動を判断することはできますが、多くのユーザーが異なる場所から同時にアプリケーションを利用する場合、プラットフォームがどのように機能するかを知ることはできません。

負荷テストとは何ですか?パフォーマンステストとはどのように異なりますか?

次の3つの用語は似ているように聞こえるかもしれませんが、異なります。

  • パフォーマンステスト
  • 負荷テスト、および
  • ストレステスト。

パフォーマンステスト は、特定の入力でアプリケーションがどのように実行されるかを評価するために使用される一般的なテストメカニズムです。これは、アプリケーションを使用するシングルユーザーまたは複数のユーザーで実行できます。これは、応答時間やCPU/メモリ使用量などの特定のメトリックを評価するために実施されます。負荷/ストレステストは、パフォーマンステストのサブセットです。

負荷テスト アプリケーションが指定された時間にわたって同時にアプリケーションを使用する指定された数のユーザーで期待どおりに動作することを保証するために実行されます。システムが処理できるユーザー数を決定するのに役立ちます。

ストレステスト 負荷テストは互いに密接に関連しています。ストレステストは、負荷テストと同様のメカニズムで実行できますが、テストの目的は異なります。負荷テストの目的は、アプリケーションが指定された数のユーザーで動作するかどうかを判断することです。一方、ストレステストは、負荷制限に達した後のアプリケーションの動作と障害の処理方法を判断するために実施されます。

立ち上げ期間に基づいて、パフォーマンステストはスパイクテストのいずれかに分類できます。 またはソークテスト 。短期間のユーザーの突然の急増はスパイクテストであり、長期間にわたるユーザーのゆっくりとした立ち上げはソークテストです。

パフォーマンステストが重要な理由

Railsプロジェクトの1つでは、近い将来、ユーザーの大幅な増加が見込まれていました。アプリケーションが期待どおりに実行され、ユーザー数の増加に伴って重要な機能が失われないようにする必要がありました。では、これをどのように保証しますか?負荷テストを実行し、アプリケーションがユーザーの特定の増加を処理できるかどうかを確認しました。パフォーマンステストは、他の多くの場合に重要になる可能性があります。

  • ブラックフライデーなど、特定の日にアプリケーションのユーザー数が急増すると予想される場合は、短い立ち上げ期間でアプリケーションを急増テストすると、システムの潜在的な問題を見つけるのに役立ちます。
  • 負荷テストは、数人のユーザーのみが使用している場合に表示されない、またはごくわずかなシステムのバグを特定するのに役立ちます。
  • これにより、負荷の増加によってプラットフォームの速度がどのように影響を受けるかを評価できます。アプリケーションが遅いと、顧客を失う可能性があります。
  • 負荷が増加した場合にシステムがどのように機能するか、10,000人のユーザーがいるときにCPUまたはメモリの使用量が多い場合にシステムがクラッシュするかどうかを評価するのに役立ちます。
  • 特定の数のユーザーに対してアプリケーションを実行するコストは、負荷テストで判断できます。

負荷テストの実行中に、Railsアプリのバグを見つけることができました。問題を特定した同様のシナリオについて説明します。ホテル予約アプリにはオープンな予約プロセスがあり、部屋を予約しようとしたユーザーが数人しかいなかったときは、すべて問題ありませんでした。ただし、複数のユーザーが同じ部屋を予約しようとした場合、2人の異なるユーザーが正常に予約できました。アプリの負荷テストを行うことで、機能をリリースする前に、問題を特定して早期に修正することができました。

ApacheJMeterを使用したRailsアプリの負荷テスト

JMeterは、Apache2.0ライセンスのオープンソース負荷テストツールです。スレッドベースの負荷テストを提供します。スレッドベースのテストを使用すると、多くのユーザーがアプリケーションを同時に使用するときにシステムが受けるストレスを簡単にシミュレートできます。 JMeterは、テスト結果の優れたレポートも提供します。

Apache JMeterを使用して負荷テストを実行し、システムを使用する多くのユーザーをシミュレートすることで、システムの潜在的な問題とアプリケーションの応答時間を特定する方法を検討します。

JMeterは、次のリンクからダウンロードできます:https://jmeter.apache.org/download_jmeter.cgi#binaries

よく知っているJMeterの用語
  • テスト計画 テスト計画は内部の最上位のものであり、負荷テストコンポーネントとして定義されています。グローバル構成と変数はここで定義されます。
  • スレッドグループ スレッドの数、ランプアップ期間、スレッド間の遅延、ループなど、スレッドと構成を定義するために使用されます。これは、負荷テストを実行する並列ユーザーの数として扱うことができます。
  • サンプラー シングルスレッドが実行するものです。 HTTPリクエスト、SMTPリクエスト、TCPリクエストなど、さまざまな種類のサンプラーがあります。
  • プリ/ポストプロセッサ サンプラーの実行前または実行後に何かを実行するために使用されます。ポストプロセッサは、1つのAPI呼び出しから応答データを受け取り、次の呼び出しで使用するためにそれを渡すことができます。
  • リスナー サンプラーからの応答をリッスンし、各スレッドからの応答時間または応答の集計レポートを提供します。
  • アサーション 応答データがサンプラーに期待したものであることを検証するのに役立ちます。
  • 構成要素 HTTPヘッダー、HTTP Cookie、CSVデータセット構成などの構成を定義します。

負荷テストを実行するには、最初に、上記のJMeter用語を定義するJMXファイルを作成する必要があります。

負荷テスト用のJMXファイルの準備

JMXは、XML形式で記述されたJMeterプロジェクトファイルです。 JMXファイルを手動で作成するのは難しい場合があるため、JMeterインターフェースを使用してファイルを作成します。

JMeterインターフェースを開き、テスト計画を見つけます。テスト計画の中に、スレッドとその負荷テスト構成を追加します。

ApacheJMeterを使用してRailsアプリの負荷テストを行う テストプランを作成するためのJMeterインターフェース

テストプランは、負荷テストの対象に応じて名前を変更できます。スレッドグループ(ユーザー)を設定できます。ここでデフォルト設定を維持し、スレッドグループの作成に進むことができます。

追加->スレッド(ユーザー)->スレッドグループ

スレッドグループには、デフォルトで単一のスレッドが指定されます。必要に応じて数を変更して、アプリにアクセスするユーザーの数をシミュレートします。

WebベースのRailsアプリの負荷テストを行うため、HTTPサンプラーを追加します。 ThreadGroup内にあるサンプラーを追加できます 。 HTTPサンプラーを追加します 以下をナビゲートすることによって:

追加->サンプラー->HTTPリクエスト

ここでは、負荷テストを行うIPまたはドメイン、HTTPメソッド、およびHTTPエンドポイントに必要なリクエスト本文を構成します。

最後に、負荷テストのレポートを表示するために、スレッドグループにリスナーを追加できます。

追加->リスナー->結果ツリーの表示

結果ツリーの表示には、各スレッドの応答時間が表示されます。ここに他の種類のレポートを追加することもできます。 「結果ツリーの表示」は、提案のデバッグにのみ使用し、実際のテストには使用しないでください。

このようにして、簡単なテスト計画を作成して実行できます。 JMeterのトップバーにある再生アイコンを押すだけで、テストを実行できます。

Railsアプリの負荷テストの前に考慮すべき事項

上記の例は、非常に単純な単一エンドポイントのHTTPリクエストです。 Railsアプリの場合、テストするエンドポイントは認証でロックされています。したがって、次のことを確実に行う必要があります。

  • ウェブCookie -HTTPエンドポイントで負荷テストを実行する前に、HTTPエンドポイントにCookieヘッダーが必要です。 JMeterは、ユーザーがログインするとCookieを追加する機能を提供します。次のセクションでは、ブラウザー要求を記録し、負荷テストのためにJMXファイルに変換する方法を検討します。クッキーの記録についても説明します。
  • RailsCSRFトークン --RailsはCSRFトークンを提供することでアプリをセキュリティの脆弱性から保護するため、負荷テストを実行する前に、リクエストのヘッダーにCSRF認証が含まれていることを確認する必要があります。このCSRFトークンはheaderにあります meta内 HTMLのタグ。

RailsCSRFトークン ポストプロセッサを使用してJMeterでフェッチできます。 CSRFトークンを含むWebページをロードするHTTPリクエストを右クリックし、 Add-> Post Processor-> Regular Expression Extractorを選択します。 。ここで、次の正規表現エクストラクタ構成を追加して、ヘッダーメタタグからCSRF値を読み取ることができます。

  • 参照名: csrf_value

  • 正規表現: name ="csrfToken" content ="(。+?)"

  • テンプレート: $ 1 $

  • 一致番号: 1

ここで、変数 csrf_value リクエストを行うために使用できます。

ブラウザからのリクエストを記録してJMXファイルを作成する

HTTPエンドポイントが少ないと、JMeterインターフェースからJMXファイルを簡単に作成できます。ただし、より大きなテストケースの場合、これは難しい場合があります。また、ユーザーがアプリケーションを使用しているときに行われた実際のリクエストを見逃す可能性があります。ブラウザからの実際のリクエストを記録し、JMXファイルを自動的に作成する必要があります。

JMeterは、Railsアプリとブラウザー間のプロキシとして追加できます。これにより、すべてのリクエストがJMeterによってRailsサーバーに転送されます。これはMITM(中間者)攻撃とも呼ばれます。

ApacheJMeterを使用してRailsアプリの負荷テストを行う JMeter Recording

JMeterでレコーディングを作成するには、ファイル->テンプレート->レコーディングに移動します。 [作成]をクリックします。記録するホスト名を指定します。これにより、Cookieマネージャーなど、いくつかのものが自動的に生成されます。 Cookieマネージャーは、認証に必要なCookieを保存します。

JMeterSSL証明書を使用したHTTPSリクエストの確認

ブラウザからのこのリクエストはJMeterに転送され、JMeterはそれをWebサービスに転送してリクエストを記録し、JMeterの記録から負荷テストを実行できるようにします。アプリケーションがSSL接続にhttpsプロトコルを必要とする場合は、証明書をブラウザーに追加する必要があります。証明書を追加するには、 Firefoxを開きます。 または他のブラウザ。 Firefox、 設定>プライバシー>証明書の管理に移動します JMeter証明書を追加して、ブラウザがJMeterによって生成された証明書を認識できるようにします。

cmd + sht + gと入力します パス/usr/local/Cellar/jmeter/5.2/libexec/bin/jmeterを入力します 証明書を追加するには

JMeterをAaプロキシとして使用するようにFirefoxを構成する

次に、FirefoxからのリクエストをJMeterレコーディングスクリプトに転送する必要があります。これは、Firefoxでプロキシを構成することで実行できます。 Firefoxを開き、 Preferences-> Advanced-> Connection(settings)に移動します。 。ここで、HTTPプロキシを「localhost」に設定し、ポートを「8080」に設定し、「このプロキシサーバーをすべてのプロトコルに使用する」にチェックを入れます。

これで、JMeterとスクリプトレコーディングに移動できます。 以前に選択したテンプレートのセクション。スタートボタンを押すと、JMeterは着信リクエストの受け入れを開始します。 Firefoxにアクセスして、負荷テストを行っているアプリケーションを参照すると、それが記録され、負荷テスト用に実行できるJMXファイルに変換されます。

JMeterを使用した分散負荷テスト

テストの実行中に、ローカルマシンの1つからテストを実行できます。これは、テスト計画を作成するときに問題ありませんが、実際のテストを実行するときに変更する必要があります。単一のマシンで負荷テストを実行すると、ハードウェアの制限(つまり、CPUとメモリ)があり、場所の制限が要求されます。これらのテストは、アプリケーションを使用する実際のユーザーのトラフィックをシミュレートするために実行されます。この目的のために、テストをさまざまなサーバーに分散し、すべての結果を表示するための単一の場所を用意する必要があります。

JMeterは、テストを調整するためのプライマリノードと、テストを実行するための複数のセカンダリノードを提供します。これは、アプリケーションを使用して実際のユーザーをシミュレートするのに役立ちます。テストサーバーは、実際のユーザーに近いさまざまな地域に分散できます。

ApacheJMeterを使用してRailsアプリの負荷テストを行う JMeter分散テスト

分散テストを実行するには、まずプライマリサーバーとセカンダリサーバーの両方にJMeterをインストールします。

セカンダリサーバーで行うこと:

  • jmeter / binに移動します jmeter-serverを実行します 指図。これにより、サーバーが起動してテストが実行されます。
  • テストにCSV入力が必要な場合は、これらのファイルをこのサーバーに追加してください。

プライマリサーバーで行うこと:

  • jmeter / binディレクトリに移動し、 jmeter.propertiesを開きます。 ファイル。
  • remote_hostsを含む行を編集します セカンダリサーバーのIPをカンマで区切って追加しますremote_hosts=
  • JMeterテストを実行します。

セカンダリサーバーが実際のテストの実行を担当し、プライマリサーバーがレポートを集約します。

負荷テストを実行するには、UIからテストをトリガーするのではなく、常にCLIコマンドを使用する必要があります。これにより、負荷テストサーバーのパフォーマンスに問題が発生する可能性があります。 JMXファイル名を指定してJMeterコマンドを使用できます:

> jmeter -n -t path / to / test.jxm -r

または

> jmeter -n -t path / to / test.jxm -R s1_ip、s2_ip、…

-r jmeter.propertiesで指定されたリモートサーバーを使用します

-n GUImodなしで実行します

-t jmxファイルへのパス

RailsサーバーにPumaとUnicornを使用することを決定した方法

PumaとUnicornは、Rails用の2つの異なるWebサーバーです。どちらにもメリットがありますが、どちらが最適かをどのように判断するのでしょうか。アプリケーションによって異なります。一部のアプリケーションはUnicornで最適に動作し、一部のアプリケーションはPumaで最適に動作します。 Railsアプリの1つとしてUnicornとPumaのどちらかを選択する必要があり、負荷テストから得られたデータに基づいて選択しました。 Railsアプリで、Unicornを使用して1回、Pumaを使用してもう1回負荷テストを実行しました。変更したのは、Railsアプリのウェブサーバーだけでした。

このテストから次の結果が得られました。 ApacheJMeterを使用してRailsアプリの負荷テストを行う ピューマとユニコーンで応答時間が異なります

プラットフォームに多数のユーザーがいる場合、PumaのパフォーマンスはRailsアプリの方が優れていることがわかりました。これは、より少ない数のアプリケーションサーバーでより多くのユーザーを処理できることを意味します。

注:これは、使用しているサーバーインスタンスの種類と、アプリが実行するビジネスロジック処理の種類によって異なります。

Railsアプリのストレス中に発生したいくつかの一般的な障害と、それらを修正する方法

  • 最適化されていないデータベースクエリ
    • n+1クエリの問題を解消します。
    • アクセスパターンに従ってインデックスを追加します。
    • データベースの前にRedisのようなキャッシングレイヤーを使用します。
  • ルビーコードのパフォーマンスが遅い
    • メモ化してコードを最適化します。
    • o(n ^ 2)の複雑さを把握し、最適なアルゴリズムを使用します。
  • マイクロサービスアーキテクチャでは、サービス間に多くのHTTP呼び出しが存在する可能性があります。ネットワーク通話が遅い。
    • マイクロサービス用のメッセージングシステムを使用して、HTTP呼び出しの数を減らします。
  • 同時に作成すると、同じレコードが2回作成されます。
    • データベース固有の制約を追加します。
    • FIFOイベント(キュー)ベースのリソース作成を利用します。
  • 可能な限り、Sidekiqなどのバックグラウンド処理を使用します。
  • API応答時間のSLAを定義し、開発ライフサイクルの一部としてパフォーマンステストを含めます。

負荷テストを実行するためにどの環境を使用する必要がありますか?

実稼働環境で負荷テストを実行することは、実稼働で問題やダウンタイムを引き起こす可能性があるため、理想的な選択ではありません。本番環境で問題を引き起こしたくはありませんが、本番環境と同様に、テストレポートに実際のデータが反映されていることを確認したいと思います。負荷/ストレステストでは、本番環境のレプリカ環境を作成することをお勧めします。これには、次のようなものが含まれます。

  • アプリケーションサーバーの数。
  • レプリカを含むデータベースサーバーのハードウェア仕様。
  • テストデータベース内の本番環境のようなデータ。これには、本番環境で発生するデータ量とほぼ同じ量が含まれている必要があります。

本番環境のような環境を作成することは、困難でコストがかかる可能性があります。したがって、負荷テストの内容に基づいて、これらのコンポーネントに接続するインフラストラクチャのみを本番環境にアップグレードできます。それはコストを節約します。 3か月に1回、アプリの読み込み/ストレステストを行うことをお勧めします。ただし、1人のユーザーによるパフォーマンステストと、応答時間が定義された標準(200mなど)を下回っていることを検証することは、開発サイクルに追加する必要があるものです。

負荷テストでは、ターゲットサーバーのCPU/メモリ使用量などのデータポイントも必要です。メモリ/CPU使用率の急上昇により、アプリケーションがクラッシュする可能性があります。ハードウェアKPIを測定するには、負荷テストを開始する前に、Prometheusなどの監視ツールを追加します。

Apache JMeterは、負荷テストのための強力なツールです。 Railsアプリの負荷テストにはApacheJMeterを使用しましたが、任意のスタックでのアプリケーションビルドの負荷/ストレステストを実行するために使用できます。負荷テストは、アプリケーションでデータを利用した意思決定を行うのに役立ちます。負荷テストは恐ろしいように聞こえるかもしれませんが、最初は少しの投資で、長期的にはアプリケーションに多くの安定性と信頼性を追加できます。


  1. AppLock で Android のアプリを保護する

    Android スマートフォンをいつでも画面ロックでロックし、アプリを覗き見から守ることができます。しかし、電話をサービス センター、子供、または友人に何らかの理由で提供し、電話全体ではなく一部のアプリがロックされていることを望む場合があります。これは、Systweak のを使用することで可能になりました アプリ ロック – 指紋、パターン、パスワードを使用 Android でアプリをロック:アプリのロック – 指紋、パターン、パスワードを使用 The App Lock – With Fingerprint , Pattern &Password は、ユーザーがスマートフォンでロックしたい

  2. ビジネスの宣伝に最適なマーケティング アプリ

    起業家によると、顧客に直接リーチすることが重要です。同じことを行うためのさまざまな手法とプラットフォームがあります。ただし、スマートフォンの使用が増えるにつれて、モバイルアプリを使用して目的を達成することをお勧めします。多くのマーケティング アプリがあります スマートフォンでビジネスを宣伝するのに役立ちます。 Android デバイスと iOS デバイスの両方について、中小企業や大企業の宣伝に役立つアプリの長いリストがあります。これはすべて、私たちがテクノロジーに依存して接続を維持し、オンラインでサービスを利用しているからです。 この投稿では、最高のデジタル マーケティング アプリについて説