この記事のポイント
sudo apt install wrk1コマンドでインストール完了(Ubuntu 22.04 / 24.04 両対応)- nginx ローカルベンチで実測 —
-t4 -c100で 690,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 をインストールします。
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) …

依存パッケージは LuaJIT のみで、インストールは数秒で完了します。
手順2:バージョンを確認する
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 の高スループットを支えている仕組みです。

基本的な使い方
①最小構成で実行する
最小の引数は「URL だけ」です。デフォルトで 2スレッド・10接続・10秒間テストが走ります。
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 で同時接続数を指定します。接続数はスレッド数以上にしてください。
# -t4: 4スレッド使用
# -c100: 同時接続数 100
# -d30s: 30秒間テスト
スレッド数の目安
一般に -t は CPU コア数の 2〜4 倍まで有効です。コア数の 8 倍以上にしても逆に性能が落ちる場合があります。最初は -t2 -c10 から始めて、接続数を増やしながら変化を観察するのが手堅いやり方です。
③テスト時間を変える(-d)
-d に s(秒)、m(分)、h(時間)の単位が使えます。
$ 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パターンを計測しています。

| コマンド例 | スレッド | 接続数 | 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 以下に抑える」)検証に役立ちます。
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

HTTP ヘッダーを付けてテストする(-H)
API サーバーへのテストでは認証ヘッダーや Content-Type を付けたいことがあります。-H で追加できます。
-H “Authorization: Bearer your_token” \
-H “Accept: application/json” \
http://api.example.com/endpoint
Lua スクリプトで高度なテストをする(-s)
wrk の最大の強みの一つが Lua スクリプトとの統合です。-s でスクリプトファイルを指定すると、リクエストの内容を動的に生成したり、レスポンスを検証したり、カスタムレポートを出力したりできます。
①パーセンタイルレポートの例
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

②POST リクエストを送る例
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 を実際に試しました。

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

wrk2 について
wrk の派生ツールに wrk2 があります。wrk が「一定接続数でできるだけ速く」送るのに対して、wrk2 は「1 秒あたりのリクエスト数を固定して精密な遅延分布を計測する」という設計です。
| 特徴 | wrk | wrk2 |
|---|---|---|
| apt でインストール | ◎ できる | ✕ ソースビルドが必要 |
| レート制御(-R) | ✕ なし | ◎ あり(固定 req/s) |
| 精密な遅延測定 | △ 近似値 | ◎ HDR ヒストグラム |
| 使い始めのしやすさ | ◎ 1コマンド | △ ビルド環境が必要 |
「まず試してみたい」なら wrk で十分です。本番サービスの SLO 検証で「秒間 1000 リクエストに固定した状態で 99 パーセンタイルをどこまで保てるか」を詳細に調べたい場合は wrk2 を検討してください。
wrk2 のビルド手順
$ 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-dev と zlib1g-dev が必要です。コンパイルは 1〜2 分かかります。生成されるバイナリは wrk という名前なので、パスに注意してください。
よくあるエラーと対処
「unable to resolve … Servname not supported」
Docker コンテナや最小構成の環境で http://hostname/ のようにポートを省略すると発生します。ポートを明示すれば解決します。
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/ も参考にしてください。



コメント