準備
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 Desktop | JMeterの実行、および練習台をローカルで動かす | Windows なら公式サイトからインストール |
| loadlab 一式 | 負荷をかけられる練習台 | M:\html\jmetertest に配置済み |
| サーバーのIP | サーバーを対象にする場合 | 上の切り替えスイッチに入力する |
ディスクとメモリの目安
loadlab 一式で約 2GB のディスク(Dockerイメージ含む)、動作中のメモリは約 500MB です。 JMeter 自体も動かすとさらに 500MB 使うので、空きメモリ 2GB 以上あると安心です。
1. Java があるか確認
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 を入れる
-
公式ダウンロードページ
を開き、Binaries の
apache-jmeter-5.6.3.zipを落とす - ZIP を右クリック →「すべて展開」で
C:\jmeterあたりに展開する
→C:\jmeter\apache-jmeter-5.6.3\bin\jmeter.batがあればOK 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. 練習台を用意する
ここは選んだ環境で手順が変わります。 上の切り替えスイッチの選択に応じて、下の手順が切り替わります。
Docker Desktop を起動してから(クジラのアイコンが「Running」になるまで待つ)、 PowerShell で loadlab のフォルダへ移動して起動します。
cd M:\html\jmetertest
docker compose --profile obs up -d
--profile obs はグラフ表示用のツール(Grafana など)も一緒に起動するという意味です。
後の章で使うので最初から付けておきます。
初回だけ、練習用のデータを自動で作ります。完了を待ってください。
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 のままになります。
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. 動いているか確かめる
ブラウザで次の3つを開きます。
| URL | 何が見えるか |
|---|---|
| http://localhost:8080 | 練習台の通販サイト。商品が20件並ぶ。JMeter はここを叩きます |
| http://localhost:8080/admin | 管理コンソール。わざと壊すスイッチが並んでいる |
| http://localhost:3800 | Grafana。グラフ表示ツール。第7章から使う。サーバーでは /grafana 配下で、admin のログインが必要です |
コマンドでも確認できます。こちらの方が確実です。
curl.exe -s http://localhost:8080/healthz
期待値
{"status":"ok","instance":"app1","uptimeSec":69}
instance が app1 か app2 のどちらかになります。
これは異常ではありません。練習台はアプリを2台並べて交互に振り分けているためで、
実際のWebサービスと同じ構成です。
ログイン用のアカウント
利用者は user0001@example.com 〜 user2000@example.com の2,000人。
パスワードは全員 pass1234 です。
管理コンソールのトークンは loadlab-admin です。
すべて練習用のダミーです。本物の情報は絶対に入れないでください。
5. JMeter の画面の見方
JMeter の画面は3つの区画でできています。これだけ覚えれば迷いません。
┌──────────────┬──────────────────────────────────┐
│ ①ツリー │ ②設定パネル │
│ │ │
│ Test Plan │ ツリーで選んだ部品の設定がここに │
│ └ スレッド │ 出る。ここに宛先やスレッド数を │
│ └ HTTP │ 入力していく │
│ └ 結果 │ │
│ │ │
└──────────────┴──────────────────────────────────┘
③上部のツールバー … ▶ 実行 / ■ 停止 / 🗑 結果クリア
- ①ツリー … 部品を右クリック →「追加」で増やす。親子関係に意味がある(後述)
- ②設定パネル … ツリーで選んだ部品の設定画面
- ③ツールバー … 緑の ▶ で実行、黒い ■ で停止。実行前に Ctrl+S で保存を促されます
親子関係のルール(重要)
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(データも消えて再投入されます) |