JMDC TECH BLOG

JMDCのエンジニアブログです

パフォーマンステストツール「Ddosify」を使ってみた

みなさん、こんにちは!プロダクト開発部の西原です。

現在、JMDCが保有している医療ビッグデータを活用して生活者や医療に新しい価値を提供する新規プロダクト開発チームのバックエンドを担当しております。

皆さんは普段プロダクト開発の際にパフォーマンステストはどのツールを使用していますでしょうか。私が所属する新規プロダクト開発のパフォーマンステストでは「Ddosify」というツールを使用しました。 今回はこちらの基本的な使い方についてご紹介致します。

Ddosifyとは

Ddosifyは、Goで書かれたパフォーマンステストツールになります。

JSONファイルを使用してシナリオを作成することができます。シナリオを定義することで、異なるリクエストパス、ヘッダー、ボディを持つ複雑なテストケースを作成できます。

加えてDdosifyはDdosify EngineDdosify Self-HostedDdosify Cloudの3つの機能が提供されています。 Ddosify Engineは単一ノードのCLIです。一方でDdosify Self-HostedとDdosify Cloudは分散型のテストができるGUIとなっています。 3つの機能の詳細についてはこちらからご覧いただけます。

インストール

前提として、新規プロダクト開発ではDdosify EngineのCLIを使用したため、今回はCLIでのインストール方法を記載致します。

インストール方法は多岐に渡ります。Docker、Homebrewを介して入手できるのはもちろん、 macOS、Linux、Windows からでもインストール可能です。詳細はリファレンスからダウンロード可能です。

新規プロダクト開発ではDockerを使用してDdosifyをインストールしたため、本ブログでもDockerでのインストール方法を記載します。 以下のコマンドを実行してください。

$ docker run -it --rm ddosify/ddosify

以下のような状態になればインストールが完了となります。

$ docker run -it --rm ddosify/ddosify
Unable to find image 'ddosify/ddosify:latest' locally
latest: Pulling from ddosify/ddosify
9981e73032c8: Pull complete 
4f4fb700ef54: Pull complete 
212729c4f9a1: Pull complete 
48270dbdbe33: Pull complete 
707e092ef671: Pull complete 
7cab27f10efd: Pull complete 
Digest: sha256:43bf97b8838be748be01d5f9f1543b08e144ebce279b5c6b0cd363b6469a7b01
Status: Downloaded newer image for ddosify/ddosify:latest

       __     __              _  ____      
  ____/ /____/ /____   _____ (_)/ __/__  __
 / __  // __  // __ \ / ___// // /_ / / / /
/ /_/ // /_/ // /_/ /(__  )/ // __// /_/ / 
\__,_/ \__,_/ \____//____//_//_/   \__, /  
                                  /____/   

Simple usage: ddosify -t targetsite.com

~ #

クイックスタート

Ddosifyにはクイックスタートという機能があります。 シナリオファイルを用意しなくても該当のコマンドを実行することで簡単にパフォーマンステストを実行できます。

今回はDdosifyが起動できている状態で、検証したい環境のパフォーマンステストを実行するとします。

以下のコマンドを実行します。(対象のURLはあくまで例になります)

~ # ddosify -t https://example.com

上記のコマンドは、デフォルト値である 10 秒間に100リクエスト(反復回数)を送信してパフォーマンステストを実行します。 実行すると、以下のような結果が出力されます。(出力結果はあくまで例であり、実際の結果は異なる場合があります)

~ # ddosify -t https://example.com
⚙️  Initializing... 
🔥 Engine fired. 
🛑 CTRL+C to gracefully stop.
✔️  Successful Run: 0        0%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.00000s
✔️  Successful Run: 29     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.83295s
✔️  Successful Run: 44     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.56659s
✔️  Successful Run: 59     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.43449s
✔️  Successful Run: 74     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.35564s
✔️  Successful Run: 89     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.30363s
✔️  Successful Run: 100    100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.27496s
RESULT
-------------------------------------
Success Count:    100   (100%)
Failed Count:     0     (0%)
Durations (Avg):
  DNS                  :0.2117s
  Connection           :0.0084s
  TLS                  :0.0065s
  Request Write        :0.0004s
  Server Processing    :0.0478s
  Response Read        :0.0003s
  Total                :0.2750s
Status Code (Message) :Count
  200 (OK)    :100
Test Status : Success

実行結果(Success Count以降)が出力されていることを確認できます。 ここからパフォーマンステストの詳細の結果が分かります。各項目の内容は以下に記載致します。

項目 説明
Success Count 成功したリクエストの数
Failed Count 失敗したリクエストの数
Durations (Avg) 各ステップの平均所要時間
DNS DNS解決にかかった平均時間
Connection 接続確立にかかった平均時間
TLS TLSハンドシェイクにかかった平均時間
Request Write リクエスト書き込みにかかった平均時間
Server Processing サーバー処理にかかった平均時間
Response Read レスポンス読み込みにかかった平均時間
Total 全体のリクエスト処理にかかった平均時間
Status Code ステータスコード(メッセージ)ごとのカウント

また、オプションフラグを使ってリクエスト数や実行時間もカスタマイズできます。

例)-nオプションで合計リクエスト数を100、-dオプションで実行時間を10秒に設定する

~ # ddosify -t https://example.com -n 100 -d 10

その他にも様々なオプションが用意されていますので詳細はリファレンスをご覧ください。

シナリオベースでパフォーマンステストを行う

クイックスタートで簡単にパフォーマンステストが実行できました。 次にシナリオファイルを使った方法をご紹介致します。 シナリオファイルを使うことでより詳細にパフォーマンステストを実施できます。

① シナリオファイルの作成

今回は例として「ログインAPI」と「ログアウトAPI」があるWebアプリケーションのシナリオを作成するとします。 Ddosifyを起動している前提で、config.jsonとpayload_file.jsonを作成します。

以下が作成したシナリオファイルです。最初のファイルは、テストシナリオのロジックを含む構成ファイルです。2 番目のファイルには、リクエストの JSON ペイロードが含まれています。

// config.json
{
    "request_count": 100,
    "load_type": "linear",
    "duration": 20,
    "output": "stdout",
    "env": {
        "access_token": "sample_access_token"
    },
    "steps": [
        {
            "id": 1,
            "name": "Login",
            "url": "https://example.com/login",
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "Authorization": "Bearer {{access_token}}"
            },
            "payload_file": "./payload.json"
        },
        {
            "id": 2,
            "name": "Logout",
            "url": "https://example.com/logout",
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "Authorization": "Bearer {{access_token}}"
            },
            "payload_file": "./payload.json"
        }
    ]
}
// payload.json
{
    "email": "test@example.com",
    "password": "testpassword"
}

各パラメータの詳細

各パラメータの詳細について記載致します。 今回ご紹介させていただくパラメータは実際に新規プロダクトでもシナリオファイルで使用しております。

まず、環境設定周りのパラメータについてです。 以下の項目でリクエスト数や実行時間、さらに環境変数の設定を行なっています。

{
    "iteration_count": 100,
    "load_type": "linear",
    "duration": 20,
    "output": "stdout",
    "env": {
        "access_token": "sample_access_token"
    }
    // 省略
}
フィールド 説明
iteration_count シミュレーションの繰り返し回数
load_type 負荷の生成方法を指定。"linear"と指定されている場合、負荷は均等に増加する
duration シミュレーションの持続時間
output シミュレーション結果の出力方法。"stdout"と指定されている場合、標準出力に結果が表示される
env シナリオ内で使用される環境変数。"access_token"という名前の環境変数が"sample_access_token"という値で設定されている

続いてパフォーマンス対象のAPIの設定周りです。 各APIはstepsフィールドにまとめられます。

{
    // 省略
    "steps": [
        {
            "id": 1,
            "name": "Login",
            "url": "https://example.com/login",
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "Authorization": "Bearer {{access_token}}"
            },
            "payload_file": "./payload.json"
        },
        {
            "id": 2,
            "name": "Logout",
            "url": "https://example.com/logout",
            "method": "POST",
            "headers": {
                "Content-Type": "application/json",
                "Authorization": "Bearer {{access_token}}"
            },
            "payload_file": "./payload.json"
        }
    ]
}
フィールド 説明
id ステップの識別子
name ステップの名前
url リクエストを送信する対象のURL
method リクエストのHTTPメソッド
headers リクエストに含まれるヘッダー情報
payload_file リクエストのペイロード(データ本体)を含むファイルのパス

② シナリオテストの実行

シナリオファイルを作成したら、早速テストを実行してみましょう。

実行コマンドは以下になります。

~ # ddosify -config ./config.json

以下が実行結果の例です。

~ # ddosify -config ./config.json
⚙️  Initializing... 
🔥 Engine fired.
🛑 CTRL+C to gracefully stop.
✔️  Successful Run: 0        0%       ❌ Failed Run: 0        0%       ⏱️  Avg. DuratioDuration: 0.00000s
✔️  Successful Run: 5      100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Durationn: 0.00000s
✔️  Successful Run: 0        0%       ❌ Failed Run: 0        0%       ⏱️  Avg. : 1.56731s
✔️  Successful Run: 30     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 1.87639s
✔️  Successful Run: 39     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 1.45212s
✔️  Successful Run: 45     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 1.26377s
✔️  Successful Run: 54     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 1.05931s
✔️  Successful Run: 60     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.95715s
✔️  Successful Run: 69     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.83747s
✔️  Successful Run: 75     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.77352s
✔️  Successful Run: 84     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.69481s
✔️  Successful Run: 90     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.65150s
✔️  Successful Run: 99     100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.59572s
✔️  Successful Run: 100    100%       ❌ Failed Run: 0        0%       ⏱️  Avg. Duration: 0.59063s
RESULT
-------------------------------------
1. Step 1
---------------------------------
Success Count:    100   (100%)
Failed Count:     0     (0%)
Durations (Avg):
  DNS                  :0.1312s
  Connection           :0.0022s
  Request Write        :0.0003s
  Server Processing    :0.0455s
  Response Read        :0.0001s
  Total                :0.1819s
Status Code (Message) :Count
  200 (OK)              :100
2. Step 2
---------------------------------
Success Count:    100   (100%)
Failed Count:     0     (0%)
Durations (Avg):
  DNS                  :0.3427s
  Connection           :0.0057s
  Request Write        :0.0003s
  Server Processing    :0.0525s
  Response Read        :0.0001s
  Total                :0.4087s
Status Code (Message) :Count
  200 (OK)    :100

プロダクトで使ってみた感想

【よかったこと】

過去に使用したパフォーマンステストツールではシナリオファイルのフォーマットがXMLで個人的に馴染みがあまりありませんでした。一方で、DdosifyではJSON形式でシナリオを作成できるため、XMLよりも直感的で読みやすく、メンテナンスもしやすい点が良かったです。

また、普段Dockerを使用して開発を行っているため、コンテナ上でDdosifyを実行できるところも魅力でした。実際のプロダクト開発ではDdosify用のDockerfileと設定ファイルをリポジトリで管理しています。

【ハマったこと】

参考記事が少なく情報量が少なかったです。そのためキャッチアップには少なからず時間が必要だと感じました。

終わりに

JMDCでは新規プロダクト開発のバックエンドエンジニアを募集しております! ヘルスケア領域の課題解決に一緒に取り組んでいただける方、ぜひこちらをご覧ください。 加えて、私の所属している新規プロダクト開発チームのバックエンド以外にも、EM/フロントエンド /バックエンド/ データベースエンジニア等、様々なポジションで募集をしています。詳細は下記の募集一覧からご確認ください。 hrmos.co

まずはカジュアルにJMDCメンバーと話してみたい/経験が活かせそうなポジションの話を聞いてみたい等ございましたら、下記よりエントリーいただけますと幸いです。 hrmos.co

★最新記事のお知らせはぜひTwitterをご覧ください! twitter.com