4. 吞吐量指标定义与测量方法
在 Nginx 进程调度调优中,吞吐量指标是衡量系统处理能力的核心依据。本章明确定义 QPS、并发连接数、响应时间(RT)和吞吐量(Throughput)四个关键指标,并给出标准测量方法。只有准确测量这些指标,才能量化调度器参数调整带来的性能变化。
4.1 核心指标定义
| 指标 | 英文全称 | 定义 | 典型单位 |
|---|---|---|---|
| QPS | Queries Per Second | 服务器每秒处理的请求数量 | req/s |
| 并发连接数 | Concurrent Connections | 同一时刻服务器保持的 TCP 连接总数 | 个 |
| 响应时间(RT) | Response Time | 从发送请求到收到完整响应所经过的时间 | ms |
| 吞吐量(Throughput) | Throughput | 单位时间内成功传输的数据量 | MB/s 或 Gbps |
指标关系提示: 在 Nginx 调优场景中,QPS 和吞吐量是正向指标(越高越好),响应时间是反向指标(越低越好)。并发连接数需要结合系统资源综合评估,并非越高越好。
4.2 指标间的关系模型
四个指标通过 Little's Law 和系统资源约束相互关联。下图展示了 Nginx 处理请求时各指标的流转关系:
调优关键: 调度器参数(如
worker_processes、worker_connections)直接影响并发连接数和 QPS 的平衡。当响应时间固定时,提高并发连接数可以线性提升 QPS,但受限于系统资源上限。
4.3 QPS 测量方法
QPS 是最直观的性能指标,测量方法分为主动压测和被动统计两种:
4.3.1 主动压测法
使用压测工具(如 wrk、ab、hey)向 Nginx 发送固定并发数的请求,统计每秒完成的请求数。
# 使用 wrk 进行 30 秒压测,10 个线程,100 个并发连接
wrk -t10 -c100 -d30s http://target-server:8080/
# 输出示例
Running 30s test @ http://target-server:8080/
10 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.23ms 12.45ms 198.00ms 72.45%
Req/Sec 221.45 28.67 320.00 68.90%
66250 requests in 30.00s, 52.80MB read
Requests/sec: 2208.33
Transfer/sec: 1.76MB
4.3.2 被动统计法
通过 Nginx 的 stub_status 模块或日志分析工具实时统计 QPS:
# 启用 stub_status 模块(nginx.conf 配置)
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# 访问状态页获取数据
$ curl http://127.0.0.1/nginx_status
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
# QPS 计算:两次采样间隔的 requests 差值 / 时间间隔(秒)
注意事项: 被动统计法受采样间隔影响较大,建议使用 5-10 秒的采样窗口。主动压测时需确保压测工具所在客户端资源充足,避免客户端成为瓶颈。
4.4 并发连接数测量
并发连接数反映 Nginx 同时处理的 TCP 连接数量,是调度器参数调优的直接反馈指标。
| 测量方式 | 命令/工具 | 说明 |
|---|---|---|
| Nginx 状态页 | curl http://127.0.0.1/nginx_status |
Active connections 字段即为当前并发连接数 |
| ss 命令 | ss -s | grep estab |
查看系统层面 ESTABLISHED 状态的连接数 |
| netstat 命令 | netstat -an | grep :80 | wc -l |
统计监听 80 端口的连接总数 |
| 压测工具报告 | wrk 的 Socket errors 部分 |
可间接反映连接数是否达到上限 |
# 使用 ss 命令精确统计 Nginx 进程的并发连接数
# 先获取 Nginx master 进程 PID
$ pidof nginx
12345
# 统计该进程所有 worker 子进程的连接数
$ for pid in $(pgrep -P 12345); do
echo "Worker PID: $pid, Connections: $(ss -tunp | grep $pid | wc -l)"
done
4.5 响应时间(RT)测量
响应时间分为平均响应时间、P50/P95/P99 百分位响应时间。在 Nginx 调优中,P99 响应时间比平均值更能反映尾部延迟问题。
4.5.1 百分位响应时间说明
4.5.2 测量命令
# 使用 wrk 的延迟统计功能
wrk -t4 -c200 -d60s --latency http://target-server:8080/
# 输出中的延迟百分位信息
Latency Distribution
50% 42.15ms
75% 58.32ms
90% 76.89ms
99% 112.45ms
# 使用 curl 手动测量单次请求响应时间
$ curl -o /dev/null -s -w "Total: %{time_total}s\n" http://target-server:8080/
Total: 0.045s
4.6 吞吐量(Throughput)测量
吞吐量关注的是数据传输速率,而非请求数量。对于 Nginx 静态文件服务或视频流场景,吞吐量比 QPS 更具参考价值。
| 场景 | 测量工具 | 关键指标 |
|---|---|---|
| 静态文件下载 | wrk / iperf3 | Transfer/sec(MB/s) |
| 视频流媒体 | ffmpeg + 自定义脚本 | 比特率(Mbps) |
| 反向代理 | wrk + 日志分析 | 响应体大小 × QPS |
| 网络层 | sar -n DEV | 网卡吞吐量(KB/s) |
# 使用 wrk 测量吞吐量(关注 Transfer/sec 字段)
wrk -t4 -c100 -d30s http://target-server:8080/largefile.bin
Running 30s test @ http://target-server:8080/largefile.bin
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 120.34ms 45.67ms 450.00ms 68.50%
Req/Sec 20.50 5.20 35.00 70.00%
2450 requests in 30.00s, 2.40GB read
Requests/sec: 81.67
Transfer/sec: 81.92MB <-- 吞吐量指标
# 使用 sar 监控网卡吞吐量
$ sar -n DEV 1 5
Linux 5.10.0 (hostname) 2024-01-15
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s
Average: eth0 4500.00 4200.00 55000.00 48000.00
4.7 综合测量流程
在实际调优过程中,建议按照以下流程进行指标采集:
- 基线采集: 在默认调度器参数下,记录 QPS、并发连接数、P99 RT 和吞吐量。
- 单变量调整: 每次只修改一个调度器参数(如
worker_processes),重复测量。 - 多轮采样: 每个参数组合至少压测 3 次,取中位数作为有效数据。
- 关联分析: 绘制 QPS vs 并发连接数、RT vs 吞吐量的散点图,寻找拐点。
调优经验: 在 Nginx 调度器参数调优中,QPS 和吞吐量通常同步变化,但当响应时间开始急剧上升时(拐点),继续增加并发连接数反而会降低吞吐量。P99 响应时间超过 200ms 通常意味着系统已过载。