吞吐测试基础概念

各位同学好,我是老张。做了十几年网络性能优化,今天咱们来聊聊吞吐测试最基础的东西。别小看这些概念,我见过太多人连吞吐量和带宽都分不清,就开始调优,结果越调越乱。

什么是吞吐量

吞吐量,说白了就是单位时间内实际传输的数据量。你想想看,一条高速公路限速120km/h,但实际能跑多快?那得看车流量、路况、收费站效率。吞吐量就是那个"实际速度"。

在计算机网络里,吞吐量通常用bps(bits per second)来衡量。我习惯看实际场景:

  • TCP吞吐量:应用层实际能收到的数据速率
  • UDP吞吐量:发送端到接收端的有效载荷速率
  • 磁盘吞吐量:读写IO的MB/s

核心要点:吞吐量是"实际测出来的",不是"理论上标出来的"。我在项目里经常跟开发说:别信网卡标称值,上机跑一跑才知道真本事。

带宽与吞吐量的区别

这两个词经常被混用,但本质完全不同。我做个表格对比一下:

维度 带宽 吞吐量
定义 理论最大传输能力 实际有效传输速率
单位 bps(如1Gbps、10Gbps) bps 或 pps(包/秒)
影响因素 物理介质、调制方式 协议栈、CPU、内存、网卡
典型值 1Gbps 网卡 = 1000Mbps 实际可能只有 600-800Mbps
比喻 水管粗细 实际水流速度

嗯,这里要注意:带宽是上限,吞吐量是下限。我曾经帮一家公司排查问题,他们买了10G网卡,结果吞吐只有2Gbps。老板问我是不是网卡坏了。我说:网卡没坏,是你的协议栈和CPU扛不住。

影响吞吐的关键因素

吞吐量上不去,别急着怪网络。我总结四个核心瓶颈:CPU、内存、网卡、协议栈。咱们一个一个说。

1. CPU

CPU是协议栈的大脑。每个数据包进来,都要经过中断处理、协议解析、数据拷贝。CPU忙不过来,吞吐自然上不去。

  • 中断处理:网卡每收一个包就触发中断,CPU得停下手里活去处理。包多了就是"中断风暴"。
  • 上下文切换:应用进程和内核之间来回切换,每次切换都有开销。
  • 缓存命中率:L1/L2/L3缓存命中率低,CPU就得等内存,性能直接腰斩。

我的经验:做吞吐测试时,先看CPU的%soft和%irq。如果这两个加起来超过30%,CPU大概率是瓶颈。我曾经调一个项目,把中断绑到特定核心上,吞吐直接翻倍。

2. 内存

内存影响吞吐的方式比较隐蔽,但杀伤力很大。你想想看,数据从网卡到应用,要经过多少次内存拷贝?

  1. 网卡DMA到内核缓冲区
  2. 内核协议栈处理
  3. 拷贝到用户空间
  4. 应用处理

每一步都在吃内存带宽。如果内存频率低、通道少,或者NUMA架构下跨节点访问,吞吐直接打折扣。

避坑指南:我曾经在AMD EPYC平台上做测试,发现吞吐只有Intel的一半。查了半天,原来是内存跨CCD访问,延迟高了30%。解决方案:用numactl绑定内存和CPU在同一NUMA节点。

3. 网卡

网卡不只是"插上去就能用"。现代网卡有很多特性,用好了是神器,用不好是累赘。

特性 作用 注意事项
RSS(接收端缩放) 多队列分发到多CPU核心 需要配置哈希策略
TSO/GRO 减少CPU参与的分段/合并 某些场景下反而增加延迟
LRO 大包合并减少中断 可能破坏TCP时间戳
XDP/DPDK 绕过内核直接处理包 需要应用配合改造

我个人习惯:拿到新网卡先看固件版本,再看驱动参数。很多性能问题就是驱动默认参数太保守导致的。

4. 协议栈

协议栈是吞吐的"隐形杀手"。Linux内核协议栈默认是为通用场景优化的,不是为高性能吞吐优化的。

  • TCP缓冲区:默认只有几十KB,高延迟链路下根本跑不满带宽
  • 拥塞控制算法:CUBIC适合长肥网络,BBR适合有丢包的场景
  • 套接字选项:SO_RCVBUF、SO_SNDBUF、TCP_NODELAY 这些不调,性能差一大截
  • epoll vs select:高并发下epoll是必须的,select撑不住

一句话总结:协议栈调优就是让内核少干活、让网卡多干活、让CPU干对活。

知识体系总览

下面这张图把吞吐测试的核心逻辑串起来了。我建议你保存下来,后面每学一章都回来对照一下。

吞吐测试知识体系 吞吐测试知识体系 吞吐量(实际速率) 带宽(理论上限) CPU 内存 网卡 协议栈 中断处理 · 上下文切换 DMA拷贝 · NUMA访问 RSS · TSO · 驱动参数 TCP缓冲区 · 拥塞控制 调优目标:让吞吐量尽可能接近带宽上限

这张图把今天的内容串起来了。带宽是天花板,吞吐量是实际水位。CPU、内存、网卡、协议栈这四个因素,任何一个掉链子,水位就上不去。

好了,第一章就到这里。记住我今天说的:别迷信标称值,动手测才是王道。后面我们会一步步深入每个因素的调优方法。