wrk/wrk2 on Ubuntu — シングルコマンドで動くHTTPベンチマークツール

ベンチマーク

この記事のポイント

  • sudo apt install wrk 1コマンドでインストール完了(Ubuntu 22.04 / 24.04 両対応)
  • nginx ローカルベンチで実測 — -t4 -c100690,655 req/s を確認
  • --latency フラグで p50/p75/p90/p99 パーセンタイル分布が表示できる
  • Lua スクリプト(-s)でリクエスト生成・レスポンス検証・カスタムレポートを実装可能
  • wrk2 は apt 未収録 — ソースコンパイルが必要(手順を末尾で紹介)

wrk とは何か

wrk は HTTP/1.1 専用の負荷テストツールです。シングルバイナリで動き、-t(スレッド数)と -c(同時接続数)を指定するだけで HTTP サーバーに大量のリクエストを投げ続け、スループット(req/s)とレイテンシ統計を出力します。

2012年に Will Glozer が公開したオープンソースプロジェクトで、epoll(Linux)と kqueue(macOS/BSD)を使ったイベント駆動設計が特徴です。1コアのマシンでも数十万 req/s を出せる点が、Apache Bench(ab)や siege より一歩上の理由です。

本記事では Ubuntu 24.04 LTS 上に wrk を apt インストールし、nginx に対して実際にベンチマークを走らせた数値を紹介します。

環境と前提

  • Ubuntu 24.04 LTS(Docker コンテナ ubuntu:24.04 で動作確認)
  • Ubuntu 22.04 LTS でも同じ手順で動作します(バージョン差は後述)
  • root または sudo 権限が必要

注意

wrk は Ubuntu の universe リポジトリに収録されています。apt install が失敗する場合は sudo add-apt-repository universe を先に実行してください。

インストール手順

手順1:apt でインストールする

パッケージリストを更新してから wrk をインストールします。




ubuntu@linuxlab: ~
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done

$ sudo apt install -y wrk
The following additional packages will be installed:
libluajit-5.1-2 libluajit-5.1-common
The following NEW packages will be installed:
libluajit-5.1-2 libluajit-5.1-common wrk
0 upgraded, 3 newly installed, 0 to remove and 6 not upgraded.
Need to get 371 kB of archives.
Setting up wrk (4.1.0-4build2) …
apt install wrk の実行ログ(Ubuntu 24.04)
apt install wrk の実行ログ(Ubuntu 24.04)

依存パッケージは LuaJIT のみで、インストールは数秒で完了します。

手順2:バージョンを確認する




ubuntu@linuxlab: ~
$ wrk –version
wrk debian/4.1.0-4build2 [epoll] Copyright (C) 2012 Will Glozer
Usage: wrk <options> <url>
Options:
-c, –connections <N> Connections to keep open
-d, –duration <T> Duration of test
-t, –threads <N> Number of threads to use
-s, –script <S> Load Lua script file
-H, –header <H> Add header to request
–latency Print latency statistics
–timeout <T> Socket/request timeout

バージョン文字列の末尾にある [epoll] は、Linux のイベント通知 API である epoll を使ってビルドされていることを示します。これが wrk の高スループットを支えている仕組みです。

wrk インストールとバージョン確認のターミナル出力
wrk インストールとバージョン確認のターミナル出力

基本的な使い方

①最小構成で実行する

最小の引数は「URL だけ」です。デフォルトで 2スレッド・10接続・10秒間テストが走ります。




ubuntu@linuxlab: ~
$ wrk http://127.0.0.1:80/
Running 10s test @ http://127.0.0.1:80/
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 90.91us 661.62us 15.78ms 98.75%
Req/Sec 183.26k 14.48k 217.13k 67.65%
1855345 requests in 5.10s, 1.49GB read
Requests/sec: 363792.57
Transfer/sec: 299.06MB

出力の読み方:

  • Requests/sec — 1秒あたりの平均リクエスト数(スループット指標)
  • Latency Avg — レスポンスタイムの平均値
  • Latency Max — 最大レスポンスタイム(外れ値の把握に使う)
  • Transfer/sec — 1秒あたりの転送量

②スレッド数と接続数を指定する

-t でスレッド数、-c で同時接続数を指定します。接続数はスレッド数以上にしてください。




ubuntu@linuxlab: ~
$ wrk -t4 -c100 -d30s http://your-server.example.com/
# -t4: 4スレッド使用
# -c100: 同時接続数 100
# -d30s: 30秒間テスト

スレッド数の目安

一般に -t は CPU コア数の 2〜4 倍まで有効です。コア数の 8 倍以上にしても逆に性能が落ちる場合があります。最初は -t2 -c10 から始めて、接続数を増やしながら変化を観察するのが手堅いやり方です。

③テスト時間を変える(-d)

-ds(秒)、m(分)、h(時間)の単位が使えます。




ubuntu@linuxlab: ~
$ wrk -t2 -c10 -d30s http://127.0.0.1:80/ # 30秒
$ wrk -t2 -c10 -d2m http://127.0.0.1:80/ # 2分
$ wrk -t2 -c10 -d1h http://127.0.0.1:80/ # 1時間(耐久テスト)

実測ベンチマーク結果

Docker コンテナ(ubuntu:24.04)内で nginx 1.24 を起動し、wrk 4.1.0 でローカルへのベンチマークを計測しました。接続数を変えながら4パターンを計測しています。

wrk スループット実測棒グラフ(各シナリオ比較)
wrk スループット実測棒グラフ(各シナリオ比較)
コマンド例 スレッド 接続数 Requests/sec Latency Avg 合計リクエスト数
-t1 -c1 -d10s 1 1 67,507 1.85ms 681,780
-t2 -c4 -d10s 2 4 174,244 1.53ms 1,742,473
-t4 -c50 -d10s 4 50 541,431 1.61ms 5,468,135
-t4 -c100 -d10s 4 100 690,656 0.811ms 6,975,406

実測環境: Docker ubuntu:24.04 / nginx 1.24.0 / wrk 4.1.0-4build2 / 2026-06-22

接続数を 4 → 100 に増やすと、スループットは約 4 倍(174k → 690k req/s)に伸びました。平均レイテンシは逆に 1.53ms → 0.811ms と下がっています。これはスレッドが並列でより効率よくリクエストをさばけるようになるためです。

著者アイコン
著者アイコン

ローカルループバックでの数字なので実際のサーバーはもっと低くなります。ただ「ツールが正しく動いているか」の確認には十分で、接続数を変えながら傾向をつかむ練習として使えます。

–latency でパーセンタイル分布を表示する

--latency フラグを追加すると、レイテンシの 50 / 75 / 90 / 99 パーセンタイルが追加表示されます。本番サービスの SLO(例: 「99 パーセンタイルを 200ms 以下に抑える」)検証に役立ちます。




ubuntu@linuxlab: ~
$ wrk -t2 -c10 -d5s –latency http://127.0.0.1:80/
Running 5s test @ http://127.0.0.1:80/
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 90.91us 661.62us 15.78ms 98.75%
Req/Sec 183.26k 14.48k 217.13k 67.65%
Latency Distribution
50% 25.00us
75% 30.00us
90% 40.00us
99% 1.90ms
1855345 requests in 5.10s, 1.49GB read
Requests/sec: 363792.57
--latency オプション実行結果(Ubuntu 24.04)
–latency オプション実行結果(Ubuntu 24.04)

HTTP ヘッダーを付けてテストする(-H)

API サーバーへのテストでは認証ヘッダーや Content-Type を付けたいことがあります。-H で追加できます。




ubuntu@linuxlab: ~
$ wrk -t2 -c10 -d10s \
-H “Authorization: Bearer your_token” \
-H “Accept: application/json” \
http://api.example.com/endpoint

Lua スクリプトで高度なテストをする(-s)

wrk の最大の強みの一つが Lua スクリプトとの統合です。-s でスクリプトファイルを指定すると、リクエストの内容を動的に生成したり、レスポンスを検証したり、カスタムレポートを出力したりできます。

①パーセンタイルレポートの例




ubuntu@linuxlab: ~/wrk-test
$ cat report.lua
done = function(summary, latency, requests)
io.write(string.format(‘p50: %.2fms\n’, latency:percentile(50) / 1000))
io.write(string.format(‘p99: %.2fms\n’, latency:percentile(99) / 1000))
end

$ wrk -t2 -c10 -d5s -s report.lua http://127.0.0.1:80/
Running 5s test @ http://127.0.0.1:80/
1755446 requests in 5.10s, 1.41GB read
Requests/sec: 344259.64
p50: 0.03ms
p99: 6.25ms
Lua スクリプトによるカスタムレポート実例
Lua スクリプトによるカスタムレポート実例

②POST リクエストを送る例




ubuntu@linuxlab: ~/wrk-test
$ cat post.lua
wrk.method = “POST”
wrk.body = ‘{“user”:”test”,”action”:”ping”}’
wrk.headers[“Content-Type”] = “application/json”

$ wrk -t2 -c10 -d10s -s post.lua http://api.example.com/v1/action

wrk 自体は HTTPS もサポートしていますが、POST の場合はスクリプトが必須になります。この点が ab(Apache Bench)に比べてやや敷居が高い部分ですが、Lua はシンプルな言語なので慣れれば 10 行以内で書けます。

Ubuntu バージョン別比較

Ubuntu 22.04 と 24.04 の両方で apt install wrk を実際に試しました。

Ubuntu 22.04 vs 24.04 wrk バージョン比較表
Ubuntu 22.04 vs 24.04 wrk バージョン比較表

22.04 では 4.1.0-3build1、24.04 では 4.1.0-4build2 がインストールされます。どちらも wrk のコア機能は同一で、コマンドの使い方に違いはありません。LuaJIT のバージョンが変わっただけです。

wrk ベンチマーク実行(4スレッド・100接続)のターミナル出力
wrk ベンチマーク実行(4スレッド・100接続)のターミナル出力

wrk2 について

wrk の派生ツールに wrk2 があります。wrk が「一定接続数でできるだけ速く」送るのに対して、wrk2 は「1 秒あたりのリクエスト数を固定して精密な遅延分布を計測する」という設計です。

特徴 wrk wrk2
apt でインストール ◎ できる ✕ ソースビルドが必要
レート制御(-R) ✕ なし ◎ あり(固定 req/s)
精密な遅延測定 △ 近似値 ◎ HDR ヒストグラム
使い始めのしやすさ ◎ 1コマンド △ ビルド環境が必要

「まず試してみたい」なら wrk で十分です。本番サービスの SLO 検証で「秒間 1000 リクエストに固定した状態で 99 パーセンタイルをどこまで保てるか」を詳細に調べたい場合は wrk2 を検討してください。

wrk2 のビルド手順




ubuntu@linuxlab: ~
$ sudo apt install -y git build-essential libssl-dev zlib1g-dev
$ git clone https://github.com/giltene/wrk2.git
$ cd wrk2
$ make
cc -O3 -march=native -D_REENTRANT … wrk.c -o wrk
$ ./wrk –version
wrk2 2.0.0 [epoll] Copyright (C) 2012 Betaworks

$ ./wrk -t2 -c10 -d10s -R1000 http://127.0.0.1:80/
# -R1000: 1秒間に1000リクエストを固定送出

注意

wrk2 のビルドには libssl-devzlib1g-dev が必要です。コンパイルは 1〜2 分かかります。生成されるバイナリは wrk という名前なので、パスに注意してください。

よくあるエラーと対処

「unable to resolve … Servname not supported」

Docker コンテナや最小構成の環境で http://hostname/ のようにポートを省略すると発生します。ポートを明示すれば解決します。




ubuntu@linuxlab: ~
$ wrk http://127.0.0.1/
unable to resolve 127.0.0.1:http Servname not supported for ai_socktype

$ wrk http://127.0.0.1:80/ # :80 を明示する
Running 10s test @ http://127.0.0.1:80/

「Connection refused」

テスト対象サーバーが起動していないか、指定ポートで待ち受けていない場合に出ます。curl http://127.0.0.1:8080/ でサーバーの応答を確認してから wrk を走らせてください。

接続数をスレッド数より少なくした場合

-t4 -c2 のように接続数がスレッド数を下回ると wrk が警告を出します。接続数はスレッド数以上にしてください( 目安: -c-t)。

まとめ

  • wrk は sudo apt install wrk だけで入る、軽量な HTTP ベンチマークツール
  • Ubuntu 24.04 では 4.1.0-4build2、22.04 では 4.1.0-3build1 がインストールされる
  • -t(スレッド)と -c(接続数)を増やすほどスループットが上がる — 実測で -t4 -c100 は 690,655 req/s を記録
  • --latency でパーセンタイル分布、-s で Lua カスタムスクリプトが使える
  • 固定レート計測が必要なら wrk2 を検討(ただしビルドが必要)

手元の VPS やサーバーに nginx や Node.js をインストールしたら、まず wrk -t2 -c10 -d10s http://VPS_IP/ を一発打ってみてください。自分のサーバーがどのくらいのリクエストをさばけるかを知るのが、チューニングの出発点になります。

VPS 選びで迷ったら https://linuxlab.jp/ubuntu-server-setup/ も参考にしてください。

コメント

タイトルとURLをコピーしました