3. 性能指标与度量:吞吐量、延迟、CPU占用率、丢包率、RPS、PPS
在TCP通信性能调优中,没有度量就没有优化。本章将系统定义六大核心性能指标,并给出工程化的度量方法与工具选型。这些指标是后续所有调优案例的“仪表盘”,必须准确理解其含义、测量方式与相互制约关系。
3.1 六大核心指标定义与对比
下表从定义、单位、典型测量工具三个维度对六大指标进行横向对比:
| 指标 | 英文 | 定义 | 常用单位 | 典型工具 |
|---|---|---|---|---|
| 吞吐量 | Throughput | 单位时间内成功传输的数据量 | Mbps, Gbps | iperf3, netperf |
| 延迟 | Latency | 数据从发送端到接收端的单向耗时 | ms, μs | ping, sockperf |
| CPU占用率 | CPU Utilization | 处理网络I/O占用的CPU时间百分比 | % | top, perf, mpstat |
| 丢包率 | Packet Loss | 丢失数据包占发送总量的比例 | % | ping -c, tcpdump + 统计 |
| 每秒请求数 | RPS | 应用层每秒完成的请求-响应事务数 | req/s | wrk, ab, wrk2 |
| 每秒数据包数 | PPS | 网络接口每秒收发的数据包数量 | pkt/s | sar -n DEV, pktgen |
工程经验:在调优实践中,吞吐量和延迟是最常被关注的“黄金双指标”,但CPU占用率和丢包率往往是定位瓶颈的“探针”。RPS和PPS则分别从应用层和网络层提供更细粒度的视角。
3.2 吞吐量(Throughput)
吞吐量衡量的是网络链路或系统在单位时间内成功传输的有效数据量。在TCP场景中,吞吐量受带宽、RTT(往返时间)、窗口大小、拥塞控制算法共同影响。
理论最大吞吐量公式:
Throughput_max = TCP_RWND / RTT
其中 TCP_RWND = min(接收窗口, 拥塞窗口)
测量方法:
- iperf3:最常用的带宽测试工具,支持TCP/UDP,可指定并行流数、窗口大小。
- netperf:支持更丰富的测试模式(如TCP_STREAM、TCP_RR)。
- sar -n DEV:查看历史吞吐量统计。
调优案例提示:当吞吐量远低于链路带宽时,优先检查:① 接收窗口是否过小(net.core.rmem_max);② 是否存在丢包导致拥塞窗口收缩;③ CPU是否成为瓶颈(软中断过高)。
3.3 延迟(Latency)
延迟是数据包从源端到目的端所经历的时间。TCP通信中延迟由四部分组成:
- 传播延迟:物理距离决定(光速/电信号速度)。
- 传输延迟:数据包大小 / 链路带宽。
- 处理延迟:网卡、协议栈、应用程序处理耗时。
- 排队延迟:缓冲区中等待转发的时间。
测量方法:
- ping:测量RTT(往返时间),单向延迟 ≈ RTT / 2(需对称路径假设)。
- sockperf:更精确的TCP/UDP延迟测量,支持微秒级精度。
- tcpdump + wireshark:通过时间戳分析TCP握手、数据段确认延迟。
常见误区:ping测量的ICMP延迟不能完全代表TCP应用延迟。TCP延迟还受Nagle算法、延迟确认(Delayed ACK)、拥塞控制影响。建议使用sockperf或应用层埋点测量真实TCP延迟。
3.4 CPU占用率
CPU占用率反映网络I/O对CPU资源的消耗程度。在高速网络场景下,CPU往往是第一瓶颈。
关键细分指标:
| 指标 | 含义 | 调优关注点 |
|---|---|---|
| %usr | 用户态CPU占用 | 应用程序处理逻辑、数据拷贝 |
| %sys | 内核态CPU占用 | 协议栈处理、系统调用、软中断 |
| %softirq | 软中断CPU占用 | 网卡驱动、协议栈处理(高PPS时关键) |
| %iowait | 等待I/O的CPU占用 | 磁盘I/O瓶颈(如日志写入) |
测量方法:
- top / htop:实时查看CPU各状态占比。
- mpstat -P ALL 1:查看每个CPU核心的详细占用。
- perf top:定位CPU热点函数(如tcp_v4_rcv、copy_user_enhanced_fast_string)。
3.5 丢包率(Packet Loss)
丢包率是丢失数据包数量占发送总量的比例。TCP的拥塞控制对丢包极其敏感——即使0.1%的丢包率也可能导致吞吐量下降50%以上。
丢包原因分类:
- 物理层:网线故障、光模块信号衰减、电磁干扰。
- 缓冲区溢出:网卡Ring Buffer、套接字接收/发送缓冲区、交换机队列溢出。
- 拥塞丢弃:路由器/交换机因拥塞主动丢包(RED/WRED)。
- 校验错误:数据包在传输中损坏,被接收端丢弃。
测量方法:
- ping -c 1000:统计丢包百分比。
- netstat -s | grep -i loss:查看TCP协议栈统计的丢包。
- ethtool -S eth0:查看网卡硬件统计(rx_dropped、tx_dropped)。
- tcpdump + 后处理:通过序列号分析重传和丢包。
调优案例提示:当丢包率 > 0.1% 时,TCP吞吐量会急剧下降。优先检查:① 网卡Ring Buffer大小(ethtool -g);② 套接字缓冲区大小(net.core.rmem_max);③ 是否存在中断合并(coalescing)导致延迟抖动。
3.6 每秒请求数(RPS)
RPS(Requests Per Second)是应用层视角的关键指标,衡量服务器每秒能处理的完整请求-响应事务数。对于HTTP、Redis、MySQL等应用,RPS直接反映服务容量。
RPS与吞吐量的关系:
RPS = Throughput / 平均请求大小
例如:吞吐量 1 Gbps,平均请求大小 10 KB
RPS ≈ (1 * 10^9 / 8) / (10 * 1024) ≈ 12,207 req/s
测量方法:
- wrk / wrk2:现代HTTP基准测试工具,支持多线程、长连接、延迟分布。
- ab (Apache Bench):简单HTTP压力测试。
- redis-benchmark:Redis专用RPS测试。
- 自定义压测客户端:使用Python asyncio或C libevent实现。
注意:RPS测试必须关注延迟分布(P50/P95/P99),不能只看平均值。高RPS但P99延迟飙升,说明系统已接近瓶颈。
3.7 每秒数据包数(PPS)
PPS(Packets Per Second)是网络层的关键指标,衡量网络接口每秒能处理的数据包数量。对于小包场景(如DNS查询、物联网消息),PPS往往比吞吐量更早达到瓶颈。
PPS瓶颈分析:
| 场景 | 典型PPS | 瓶颈位置 |
|---|---|---|
| 10G网卡(大包) | ~1.2M pps | PCIe带宽 |
| 10G网卡(64B小包) | ~14.88M pps | 网卡硬件极限 |
| 软件协议栈(单核) | ~1-2M pps | CPU软中断 |
| DPDK优化 | ~10-40M pps | 内存访问延迟 |
测量方法:
- sar -n DEV 1:查看每秒收发包数(rxpck/s, txpck/s)。
- pktgen:Linux内核自带的高性能发包工具,用于PPS极限测试。
- ethtool -S eth0:查看网卡硬件PPS统计。
3.8 六大指标关系与SVG全景图
六大指标并非孤立存在,它们之间存在相互制约与权衡。下图展示了指标间的典型关系:
3.9 指标权衡与调优策略
在实际工程中,六大指标之间存在典型的权衡关系:
| 权衡对 | 关系描述 | 典型场景 |
|---|---|---|
| 吞吐量 vs 延迟 | 高吞吐通常伴随高延迟(排队效应) | 大文件传输 vs 实时音视频 |
| 吞吐量 vs CPU | 高吞吐需要更多CPU处理协议栈 | 10G网络 vs 低功耗嵌入式 |
| 延迟 vs 丢包率 | 激进发送降低延迟但增加丢包风险 | TCP_NODELAY vs Nagle算法 |
| RPS vs PPS | 小请求场景PPS先到瓶颈,大请求场景吞吐量先到瓶颈 | 微服务API vs 视频流 |
| CPU vs PPS | 每包处理开销固定,PPS越高CPU占用越大 | DPDK vs 内核协议栈 |
调优策略总结:
- 明确目标:先确定优化目标指标(如降低P99延迟),再考虑对其他指标的影响。
- 测量基线:在调优前记录所有六项指标的基线值。
- 单一变量:每次只调整一个参数,观察所有指标的变化。
- 端到端验证:在真实流量或仿真环境下验证调优效果。
3.10 工程度量工具速查表
| 工具 | 主要测量指标 | 安装方式 | 典型命令示例 |
|---|---|---|---|
| iperf3 | 吞吐量 | apt/yum/brew | iperf3 -c 10.0.0.1 -t 30 -P 4 |
| ping | 延迟、丢包率 | 系统内置 | ping -c 100 -i 0.1 10.0.0.1 |
| sockperf | TCP/UDP延迟 | 源码编译 | sockperf pp -i 10.0.0.1 -t 10 |
| wrk2 | RPS、延迟分布 | 源码编译 | wrk2 -t 4 -c 100 -d 30s -R 10000 http://10.0.0.1:8080 |
| sar | PPS、CPU、网络统计 | sysstat包 | sar -n DEV 1 10 |
| ethtool | 网卡统计、丢包 | 系统内置 | ethtool -S eth0 | grep drop |
| perf | CPU热点、软中断 | linux-tools | perf top -C 0-3 |
| tcpdump | 抓包分析、重传统计 | 系统内置 | tcpdump -i eth0 -w capture.pcap |
推荐工作流:先使用sar和ethtool做快速健康检查,发现异常后使用iperf3或wrk2进行针对性压测,最后用perf和tcpdump定位根因。