STEP 0 ・ 所要 40分

準備

JMeter を入れて、練習台 loadlab を起動し、両方が動いていることを確認します。 ここが一番つまずきます。急がずに、各ステップの「期待値」の枠と自分の画面を必ず見比べてください。

どちらの環境で練習するか

練習台 loadlab を置く場所は2通りあります。上の切り替えスイッチで選ぶと、 このサイト全体のコマンドがその環境用に書き換わります。 どちらでも学べる内容は同じですが、性格がかなり違います。

ローカルサーバー
置き場所 自分のPC(Docker Desktop) 借りたVPS。JMeterだけ手元で動かす
準備 Docker Desktop が必要。起動コマンドを打つ すでに動いている。何も起動しなくてよい
対象のURL http://localhost:8080 http://<サーバーのIP>
壊しても平気か 平気。何度でも作り直せる 平気。負荷試験専用に借りたサーバー
測定の正確さ やや不正確。JMeterと対象が同じPCのCPUを取り合う 正確。負荷生成と対象が完全に分かれている
ネットワーク 無し(応答時間に往復時間が乗らない) あり(実測で約25ms上乗せ。本番に近い
グラフの置き場所 自分のPC(localhost:3800 サーバー上/grafana)。PCを閉じても動き続ける
手元で起動するもの 練習台 + 観測ツール + JMeter JMeter だけ
向いている場面 STEP 1〜7 の操作を覚える段階 STEP 8〜11 の本気の計測

おすすめの進め方

STEP 1〜7 はローカル、STEP 8 以降はサーバーが理想です。 操作を覚える段階では手元で完結する方が速く、 限界点を測る段階では負荷生成機を分けないと数字が信用できないからです。 実測でも、同じテストで同居 329.5 req/s に対し分離 374.0 req/s と差が出ました。

サーバーで練習するときの注意

  • Grafana・InfluxDB・Prometheus はサーバー側で動いています。 ブラウザで http://localhost:3800 を開くだけです (手元でDockerを起動する必要はありません
  • Grafana は自分のIPからしか開けません。 admin のログインも必要です(二重で守っています)
  • 大量の画像取得は自分の回線が先に埋まります。 限界点を測るときは軽いJSON APIで測ってください

用意するもの

もの用途備考
Java 8 以上JMeter を動かすすでに入っていることが多い。次の手順で確認します
Apache JMeter 5.6.3負荷をかける道具インストーラは無く、ZIPを展開するだけ
Docker DesktopJMeterの実行、および練習台をローカルで動かすWindows なら公式サイトからインストール
loadlab 一式負荷をかけられる練習台M:\html\jmetertest に配置済み
サーバーのIPサーバーを対象にする場合上の切り替えスイッチに入力する

ディスクとメモリの目安

loadlab 一式で約 2GB のディスク(Dockerイメージ含む)、動作中のメモリは約 500MB です。 JMeter 自体も動かすとさらに 500MB 使うので、空きメモリ 2GB 以上あると安心です。

1. Java があるか確認

観点 JMeter は Java で動くので、まず土台があるか確認する

PowerShell またはコマンドプロンプトを開いて、次を実行します。

PowerShell
java -version

期待値

次のような3行が出れば OK です。バージョンは 8 以上なら何でも構いません。

出力例
openjdk version "17.0.13" 2024-10-15
OpenJDK Runtime Environment Temurin-17.0.13+11
OpenJDK 64-Bit Server VM Temurin-17.0.13+11

こうなったら

'java' は、内部コマンドまたは外部コマンド...として認識されていません と出た場合は Java が入っていません。 Adoptium から Temurin 17 (LTS) の Windows x64 .msi を落として、 そのままインストールしてください。インストール後は PowerShell を開き直してから再確認します。

2. JMeter を入れる

観点 JMeter はインストーラが無く、ZIPを展開して .bat を叩くだけ
  1. 公式ダウンロードページ を開き、Binariesapache-jmeter-5.6.3.zip を落とす
  2. ZIP を右クリック →「すべて展開」で C:\jmeter あたりに展開する
    C:\jmeter\apache-jmeter-5.6.3\bin\jmeter.bat があればOK
  3. bin\jmeter.bat をダブルクリックして起動する

期待値

黒いコマンドウィンドウが1枚開き、そのあと十数秒して JMeter の GUI が立ち上がります。 左側に「Test Plan」というツリーが1本だけある状態です。

コマンドウィンドウには次の警告が出ますが、これは正常です。 「GUIで負荷をかけるな、計測はCLIでやれ」という JMeter からの注意書きです。

正常に出る警告
Don't use GUI mode for load testing !, only for Test creation and Test debugging.

つまずきポイント

黒いウィンドウを閉じないでください。閉じると JMeter も落ちます。 最小化しておくのが正解です。

日本語表示にする(任意)

メニューの Options → Choose Language → 日本語 で日本語になります。 このサイトは日本語表示を前提に書いていますが、英語のままでも用語の対応表を併記しているので進められます。

3. 練習台を用意する

ここは選んだ環境で手順が変わります。 上の切り替えスイッチの選択に応じて、下の手順が切り替わります。

観点 負荷をかけられる相手を自分のPCで立ち上げる 環境 ローカル

Docker Desktop を起動してから(クジラのアイコンが「Running」になるまで待つ)、 PowerShell で loadlab のフォルダへ移動して起動します。

PowerShell — 練習台の起動
cd M:\html\jmetertest
docker compose --profile obs up -d

--profile obs はグラフ表示用のツール(Grafana など)も一緒に起動するという意味です。 後の章で使うので最初から付けておきます。

初回だけ、練習用のデータを自動で作ります。完了を待ってください。

PowerShell — データ投入の進捗を見る
docker compose logs -f app1

期待値

次の行が出れば準備完了です。約5秒で終わります。Ctrl+C でログ表示を抜けてください。

出力例
[seed] 開始 — 初回のみ数十秒かかります
[seed] categories 12
[seed] users 2000
[seed] products 20000
[seed] product_tags 36870
[seed] reviews 200000
[seed] 完了 4.4s
[boot] app1 listening on :3000 (pool=10)

利用者2,000人・商品20,000件・レビュー200,000件が入りました。 データが少ないと負荷をかけても何も起きないので、あえて多めに作っています。

つまずきポイント

failed to connect to the docker API と出たら Docker Desktop が起動していません。 クジラのアイコンが緑(Running)になってから再実行してください。

観点 すでに動いているサーバーを対象にする 環境 サーバー

サーバー側の練習台は常時起動しています(再起動しても自動で復帰する設定です)。 起動作業は不要で、生きているかを確認するだけです。

先に切り替えスイッチにIPを入れてください

このページ上部の切り替えを「サーバー」にして、 サーバーのIPアドレスを入力してください。以降のコマンドがそのIP宛てに書き換わります。 未入力のままだと localhost:8080 のままになります。

PowerShell — サーバーが生きているか確認
curl.exe -s http://localhost:8080/healthz

期待値

出力
{"status":"ok","instance":"app1","uptimeSec":12345}

グラフ表示ツールもサーバー側で動いています

Grafana・InfluxDB・Prometheus はサーバーに同居させてあります手元では何も起動する必要がありません。ブラウザで開くだけです。

URL中身
http://localhost:3800 Grafana。admin でログイン(パスワードは構築時に設定したもの)
http://localhost:8080/admin 練習台の管理コンソール(わざと壊すスイッチ)

手元で必要なもの

JMeter を動かすための Docker だけです。 Docker Desktop は起動しておいてください(JMeterをコンテナで動かすため)。 練習台や観測ツールを手元で起動する必要はありません。

アクセス制限について

Grafana と InfluxDB は自分のグローバルIPからしか開けないように nginx で制限してあります。他所から開くと 403 になります。 接続元のIPが変わった(回線を変えた、テザリングにした等)場合は開けなくなるので、 サーバー側の許可リストを更新してください。

サーバーが落ちていたら

SSHでログインして起動し直します。

サーバー上で実行
cd ~/loadlab
sudo docker compose -f docker-compose.yml -f docker-compose.server.yml up -d
sudo docker compose ps

2枚重ねるのを忘れないこと

サーバーでは -f docker-compose.yml -f docker-compose.server.yml必ず2枚指定します。 1枚目だけだとポート8080で起動してしまい、外から http://<IP>/ で開けません。

サーバー側の注意

  • このサーバーは学習用に意図的に脆く作ってあります。本物の情報は絶対に置かないこと
  • 管理画面 /admin が誰でも開ける状態です。中身はダミーデータのみなので実害はありません
  • 負荷試験は自分の持ち物にだけ。他のサーバーに向けないこと

4. 動いているか確かめる

観点 JMeter を触る前に、相手が生きていることを必ず確認する

ブラウザで次の3つを開きます。

URL何が見えるか
http://localhost:8080 練習台の通販サイト。商品が20件並ぶ。JMeter はここを叩きます
http://localhost:8080/admin 管理コンソール。わざと壊すスイッチが並んでいる
http://localhost:3800 Grafana。グラフ表示ツール。第7章から使う。サーバーでは /grafana 配下で、admin のログインが必要です

コマンドでも確認できます。こちらの方が確実です。

PowerShell — 生存確認
curl.exe -s http://localhost:8080/healthz

期待値

出力
{"status":"ok","instance":"app1","uptimeSec":69}

instanceapp1app2 のどちらかになります。 これは異常ではありません。練習台はアプリを2台並べて交互に振り分けているためで、 実際のWebサービスと同じ構成です。

ログイン用のアカウント

利用者は user0001@example.comuser2000@example.com の2,000人。
パスワードは全員 pass1234 です。
管理コンソールのトークンは loadlab-admin です。

すべて練習用のダミーです。本物の情報は絶対に入れないでください。

5. JMeter の画面の見方

JMeter の画面は3つの区画でできています。これだけ覚えれば迷いません。

画面の構造
┌──────────────┬──────────────────────────────────┐
│  ①ツリー      │  ②設定パネル                     │
│              │                                  │
│  Test Plan   │  ツリーで選んだ部品の設定がここに  │
│   └ スレッド  │  出る。ここに宛先やスレッド数を    │
│      └ HTTP  │  入力していく                     │
│      └ 結果  │                                  │
│              │                                  │
└──────────────┴──────────────────────────────────┘
   ③上部のツールバー … ▶ 実行 / ■ 停止 / 🗑 結果クリア

親子関係のルール(重要)

JMeter では部品を置いた場所によって効く範囲が変わります

  • スレッドグループの直下に置いた設定 → そのグループの全リクエストに効く
  • 特定のHTTPリクエストのに置いた設定 → そのリクエストだけに効く

「アサーションを付けたのに効かない」の原因はほぼこれです。置き場所を疑ってください。

用意されているテストプラン

M:\html\jmetertest\jmeter\testplans\ に5本の完成品が入っています。 これから章ごとに開いて中身を読んでいきます。

ファイル内容使う章
01_smoke.jmxまず1本通す基本
02_login_html.jmxログインを突破する基本
03_journey_api.jmx購入までを一周するシナリオ
04_stress_influx.jmx限界点をさがす限界と改善
05_stock_race.jmx在庫を取り合わせる限界と改善

STEP 0 完了の判定

  • JMeter の GUI が開いている
  • ブラウザで http://localhost:8080 に商品一覧が出る
  • /healthz{"status":"ok"...} を返す
  • 上の切り替えが「サーバー」になっていて、IPが入力されている

つまずいたら

症状原因と対処
JMeter が起動しない Java が無い、または PATH が通っていない。java -version をやり直す
localhost:8080 が開かない docker compose ps で全コンテナが Up か確認。mysql が healthy になるまで1分ほどかかる
502 Bad Gateway アプリがまだ起動中。30秒待って再読み込み。それでも直らなければ docker compose restart nginx
商品が0件 データ投入が終わっていない。docker compose logs app1[seed] 完了 を確認
全部おかしい 作り直す:
docker compose --profile obs down -v のあと up -d(データも消えて再投入されます)