LabHub

ブログ

ロード/パフォーマンステストツール 2026 — k6・Locust・Vegeta・Gatling・Artillery・JMeter 徹底比較(JMeter の先の風景)

한국어English日本語

プロローグ — 「毎秒1万リクエスト出せます」という嘘

2026年、ある会社のリリース前夜。

PM:「毎秒1万リクエスト出せますよね?」 バックエンド:「JMeterで回しました。通りました」 SRE:「どんなシナリオで?」 バックエンド:「constant 1万 RPS で5分…」 SRE:「production のトラフィックパターンは? warm-up は入った? p99 は?」 バックエンド:「…」

この場面は2026年でもよくある。ツールは良くなったが計測文化はそのままだ。「通った」と言うが、何が通ったのか、どんな分布の下で通ったのか、production にどれだけ近いのかは答えがない。そうしているうちにリリース後の実トラフィックは burst で来るし、キャッシュはコールド状態で始まるし、p99 は SLO を割るし、その全部が「通った」テストとは無関係に起こる。

ツール自体は良くなった。2010年代の JMeter 中心の世界は、いまや k6(Grafana) が事実上の標準となった風景に変わり、LocustVegetaGatlingArtilleryBombardier がそれぞれの領域に居場所を持つ。マイクロベンチの領域には wrkwrk2autocannon が生きていて、gRPC や WebSocket のような非-HTTP プロトコルには ghzfortio が別にいる。

この記事は2026年のロード/パフォーマンステストツールの地図を描く。各ツールの位置、同じシナリオを各ツールでどう書くか、「良いロードテスト」とは何か、そして自分のチームにどう選ぶか、まで。


1章 · ロードテストの4つの目的 — 何を計るかをまず決める

ツールを選ぶ前に 目的 を整理する。同じツールが全ての目的に合うわけではない。

  1. マイクロベンチマーク (micro-benchmark) — 単一エンドポイントの上限スループットと p99 レイテンシ。「このホットパスはどれだけ速いか?」小さな変更の回帰を捕まえる用途。wrk、autocannon、Bombardier、Vegeta。
  2. ロードテスト (load test) — 期待される負荷でシステムが SLO 内で動くか。通常、一定 RPS を一定時間維持。k6、Locust、Gatling、Artillery、JMeter。
  3. ストレステスト (stress test) — 限界を見つける。どこで崩れるか、どう崩れるか、復旧できるか。上のツール + シナリオ設計。
  4. スパイク/ソークテスト (spike & soak) — 急なトラフィック増(spike)と長時間維持(soak、メモリ・接続リークを捕まえる)。k6 と Locust がシナリオ表現に強い。

さらに カオステスト(障害注入 + 負荷)は別軸だが、ロードツールでトラフィックを流しつつ chaos tool で障害を注入する組み合わせがよくある。

要点:「パフォーマンステスト」という一語が上の4つを指し示している。ツールを選ぶときは「主にどの種類のテストをやるのか」を答えてから決める。マイクロベンチに JMeter を持ち出すのは過剰だし、複雑なシナリオに wrk を使うのは足りない。


2章 · ツール地図 2026 — 一目で

ツール言語/スクリプト強み弱み代表的な用途
k6JS (ES2015+)、Go ランタイムモダンな既定、出力が豊富、クラウド選択肢、gRPC/WS/ブラウザ分散は OSS では自分で構成2026年の一般的既定
LocustPython分散が簡単、Python コード可能単一ワーカー throughput の限界Python チーム、行動モデルが複雑
VegetaGo (CLI + ライブラリ)ワンライナー実行、結果分析が強いシナリオ表現は単純HTTP マイクロベンチ、素早い計測
GatlingScala/Java DSLシナリオ表現力、エンタープライズレポートScala の学習曲線大規模、JVM 親和組織
ArtilleryNode.js、YAML起動が速い、YAML 表現高負荷で単一ノード限界Node チーム、CI シナリオ
wrk / wrk2C、Lua スクリプト非常に軽くて速い HTTP ベンチHTTP のみ、シナリオ単純ホットパスのマイクロベンチ
autocannonNode.jsnpm インストールですぐNode チーム外には弱めNode API 速ベンチ
BombardierGo本当に単純で速い CLIシナリオほぼ無しワンライナー負荷計測
JMeterJava、GUI/XML古い資料・プラグイン生態系XML シナリオ、UX が古いエンタープライズ、既存資産
ghzGo、CLIgRPC 専用、単純gRPC 以外には不向きgRPC サービスベンチ
fortioGo (Istio)gRPC + HTTP、分布分析UI が地味サービスメッシュ検証

一行まとめ:2026年の「最初に手に取るツール」はおおむね k6。チームが Python 親和なら Locust。ワンライナーのマイクロベンチは Vegeta(または wrk)。エンタープライズ・JVM 親和組織と既存資産は JMeter/Gatling。Node 親和チームの速い CI シナリオは Artillery。gRPC は ghz または k6 gRPC モジュール。


3章 · k6 — 2026年の一般的既定

現在の状況 (2026年5月):Grafana Labs 傘下。k6 OSS バイナリは無料、Grafana Cloud k6 で分散実行/ダッシュボードを有料で提供。v0.5x 台の安定リリースが続いており、browser モジュール(Playwright バックエンド)・gRPC・WebSocket・xk6 拡張生態系が拡張中。

なぜ既定になったか:

基本スクリプト(4章で比較用に再登場):

// k6 script: login + ramp 50 → 200 RPS for 5min
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  scenarios: {
    login_ramp: {
      executor: 'ramping-arrival-rate',
      startRate: 50,
      timeUnit: '1s',
      preAllocatedVUs: 50,
      maxVUs: 500,
      stages: [
        { target: 50, duration: '1m' },
        { target: 200, duration: '5m' },
        { target: 200, duration: '2m' },
      ],
    },
  },
  thresholds: {
    http_req_duration: ['p(99)<500'],
    http_req_failed: ['rate<0.01'],
  },
};

export default function () {
  const res = http.post('https://api.example.com/login', JSON.stringify({
    user: 'demo',
    pass: 'pw'
  }), { headers: { 'Content-Type': 'application/json' } });
  check(res, { 'status 200': (r) => r.status === 200 });
  sleep(1);
}

k6 Cloud(Grafana Cloud k6)の費用感覚 (2026年基準):無料プランは月50 VUh、Pro プランは $299/月からで VUh と同時実行数の上限が増える。分散実行/地域分散が必要なら cloud オプションが楽で、代替は self-host 分散(複数ノードで同じスクリプトを実行、結果集約)。

制限:


4章 · 同じシナリオ、ツール別比較 — POST /login + ramp 50 → 200 RPS

同じシナリオを k6 / Locust / Vegeta でどう表現するかを並べて見る。

k6

3章のスクリプトそのまま。要点は ramping-arrival-rate executor と thresholds で p99・失敗率をコードとして宣言。

Locust (Python)

# locustfile.py
from locust import HttpUser, task, LoadTestShape, constant_throughput

class LoginUser(HttpUser):
    wait_time = constant_throughput(1)  # 1 req/sec per user

    @task
    def login(self):
        self.client.post(
            "/login",
            json={"user": "demo", "pass": "pw"},
            headers={"Content-Type": "application/json"},
        )

class RampShape(LoadTestShape):
    stages = [
        {"duration": 60, "users": 50, "spawn_rate": 50},
        {"duration": 360, "users": 200, "spawn_rate": 5},
        {"duration": 480, "users": 200, "spawn_rate": 0},
    ]

    def tick(self):
        run_time = self.get_run_time()
        for stage in self.stages:
            if run_time < stage["duration"]:
                return (stage["users"], stage["spawn_rate"])
        return None

実行: locust -f locustfile.py --headless -H https://api.example.com。分散モードは master/worker(--master--worker)で簡単に分けられ、k8s helm chart も有名。

Vegeta (CLI)

# step 1: 50 RPS for 1m
echo "POST https://api.example.com/login" | \
  vegeta attack -rate=50 -duration=60s -body=body.json \
                -header="Content-Type: application/json" \
  | vegeta report -type=hist[0,100ms,200ms,500ms,1s]

# step 2: 200 RPS for 5m
echo "POST https://api.example.com/login" | \
  vegeta attack -rate=200 -duration=5m -body=body.json \
                -header="Content-Type: application/json" \
  | tee result.bin \
  | vegeta report
vegeta plot result.bin > plot.html

Vegeta はシナリオ自体が単純 — 一定 rate を一定時間打つ。ramp は通常、段階別のコマンドを連ねて実行するか、シェルスクリプトで外側から作る。その単純さが強み — 一行で計測が終わり、vegeta report -type=jsonvegeta plot で分布・時系列を見る。

比較観察:


5章 · Locust — Python チームの心地よい友

現在の状況 (2026年):活発にメンテナンス中。v2.x 安定。Locust は「コードで表現可能な行動モデル」が強み。ユーザーが何をするかをクラス/メソッドで表現し、@task デコレータで重みを与える。

いつ適合するか:

制限:

ヒント:Locust の強みは 分散が簡単 という点。100k+ RPS が必要ならワーカーを数十個立てるのが自然。k8s に helm chart で立て、Prometheus にメトリクスを集めるパターンに慣れれば運用が単純になる。


6章 · Vegeta — 一行の優雅さ

現在の状況 (2026年):単一メンテナ中心でメンテナンス中。安定で単純。新機能はほぼないが、それが美徳。

なぜ Vegeta が生き残ったか:

制限:

代表的な使い方:ホットパス一つのレイテンシ分布を正確に計りたいとき、CI で回帰を捕まえるマイクロベンチ、「今サーバーは生きているか」の素早いチェック。


7章 · Gatling — JVM 陣営の強者

現在の状況 (2026年):Gatling 3.x 安定。Gatling Enterprise(有料、旧 FrontLine)と OSS の両方が活発。Scala DSL が既定だが Java/Kotlin DSL も正式サポート。

なぜ今も使われるか:

いつ適合するか:

制限:


8章 · Artillery — YAML シナリオの手軽さ

現在の状況 (2026年):OSS + Cloud(有料)。YAML でシナリオを表現するのが魅力。最近 v2 から分散実行(Cloud)オプションも強化された。

なぜ使われるか:

制限:

(少し違う形式で):

config:
  target: 'https://api.example.com'
  phases:
    - duration: 60
      arrivalRate: 50
    - duration: 300
      arrivalRate: 50
      rampTo: 200
    - duration: 120
      arrivalRate: 200
scenarios:
  - flow:
      - post:
          url: '/login'
          json:
            user: 'demo'
            pass: 'pw'
          expect:
            - statusCode: 200

9章 · JMeter — 生きている古参

現在の状況 (2026年):Apache JMeter 5.x メンテナンス中。学習資料が最も多く、プラグイン生態系が最も広い。GUI 中心だがヘッドレス実行も正式サポート。

なぜ今も見えるか:

なぜ新規チームはほぼ選ばないか:

ガイド:新規プロジェクトで JMeter を新たに選ぶ理由はほぼない。ただし 既存資産があるなら それを捨てて移行するコストは別の決定。段階的に新しいテストは k6/Gatling で書き、既存は維持するパターンがよく見られる。


10章 · マイクロベンチマーク — wrk / wrk2 / autocannon / Bombardier

この4つのツールは「一つのエンドポイントの上限 throughput とレイテンシ分布」を素早く取るのに特化している。

wrk

wrk2

autocannon

Bombardier

いつ何を:


11章 · 非-HTTP プロトコル — gRPC、WebSocket、ブラウザ

2026年の負荷計測は HTTP だけではない。gRPC・WebSocket・実ブラウザ(Headless Chrome)すべて計測対象。

gRPC

WebSocket

ブラウザ(Real Browser Load)


12章 · 「良いロードテスト」とは何か — 2026 チェックリスト

ツールが良くてもシナリオが悪ければ結果も悪い。良いロードテストの核心。

1) production-like なデータ

2) 一定 rate ではなく分布

3) warm-up と ramp-up

4) p99 (avg ではなく)

5) error rate の分離

6) 複数の計測点

7) 一度ではなく定期的


13章 · self-host と cloud — コストと運用

分散実行が必要になると二つの道。

Self-host 分散

長所:コスト制御、データがインハウス。短所:運用負担、地域分散が難しい。

Cloud

長所:地域分散・即時実行・ダッシュボードが即時。短所:コスト(週1回大きなテストなら月数百~数千ドルに早く到達)。

経験則:単発の大型計測(リリース前)は cloud が安くて速い。定期回帰テストは self-host が長期的に安い。両方を混ぜる組織が多い — 日常 CI は self-host、四半期ごとの大規模は cloud。


14章 · ツールを選ぶ決定フレーム — 正直なガイド

状況おすすめ
初めて、一般的バックエンドk6
Python チーム、行動モデル複雑Locust
ワンライナーのマイクロベンチVegeta または wrk2
Node チーム、CI を速くArtillery または autocannon
エンタープライズ JVM 組織Gatling
既存資産が JMeterJMeter 維持 + k6 新規 併行
gRPC 計測ghz または k6 gRPC
ブラウザ負荷k6 browser
単純な throughput 上限計測wrk または Bombardier
カオステスト + 負荷k6/Locust + Toxiproxy/Litmus

混ぜるのはよくある。 一つの組織内でマイクロベンチは Vegeta、一般負荷は k6、既存の大きなシナリオは JMeter — こういう組み合わせが現実の姿。ツールを統一しようと無理せず、領域別に適切なツールを認めるのが運用を単純にする。


15章 · アンチパターンと罠


エピローグ — 計測は決定のためのツール

ツールは豊富。JMeter が標準だった時代は去り、k6 が事実上の既定になった。Locust は Python 親和組織の良き友、Vegeta は一行計測の優雅さ、Gatling は JVM 陣営の強者、Artillery は速い起動、wrk/wrk2/autocannon/Bombardier はマイクロベンチの単純さ。

しかしツールが結果を作るのではない。シナリオが production に似ているか、percentile を見たか、warm-up を置いたか、回帰として置いたか が結果を作る。ツールを選んだ後の仕事の方が長くて重要。

この記事の一文要約:「うまく動きます」は計測ではない。p99・分布・シナリオで答えてこそ計測である。 ツールはその答えを可能にする手段に過ぎず、答え自体は自分たちで定義する必要がある。

12項目チェックリスト

  1. 目的が明確か(マイクロ/負荷/ストレス/スパイクのいずれか)?
  2. production-like なデータを使っているか?
  3. constant rate ではなく分布・ramp をモデリングしたか?
  4. warm-up 区間を計測から除外したか?
  5. p99(または p999)を SLO に紐づけたか?
  6. error rate をレイテンシから分けて見たか?
  7. クライアント側 + サーバー側のメトリクスを一緒に見たか?
  8. CI に回帰として入っているか?
  9. 分散が必要なときに self-host/cloud の決定をしたか?
  10. 非-HTTP プロトコルがあるならそのツールも併用しているか(gRPC/WS/ブラウザ)?
  11. 計測経路が user path と一致しているか(DNS・CDN 込み)?
  12. coordinated omission 補正を理解しているか?

アンチパターン10

  1. 平均レイテンシだけ見る — p99 を見る。
  2. constant rate 一度で通過宣言 — 分布をモデリング。
  3. localhost で計測して結論 — ネットワークがない。
  4. production で直接負荷 — staging で。
  5. 負荷ツールだけ見る — サーバーメトリクスと一緒に。
  6. リリース前一度 — 定期回帰として。
  7. JMeter で全部やる — 領域別にツールを。
  8. 分散を組まず単一ノードで無理 — ツール限界 ≠ システム限界。
  9. warm-up 無視 — 序盤データが結論を歪める。
  10. error rate 抜け — 死んだリクエストが見えない。

次の記事予告

次の記事候補:production における信号とノイズ — RED・USE・SLO ダッシュボード設計chaos engineering 2026 — Litmus・Chaos Mesh・Gremlin・AWS FIS 比較performance regression CI — 一行から分布まで

「計測できるものが改善できるもの。そして分布を見なければ計測ではない」

— ロード/パフォーマンステストツール 2026、終わり。


参考 / References

コメント

まだコメントはありません。

ログインするとコメントできます