Linux网络性能评估压测
性能评估是优化网络性能的前提,只有在你发现网络性能瓶颈时,才需要进行网络性能优化。
由于低层协议是高层协议的基础。所以,一般情况下,我们需要从上到下,对每个协议层进 行性能测试,然后根据性能测试的结果,结合 Linux 网络协议栈的原理,找出导致性能瓶颈的根源,进而优化网络性能。

性能指标
- 带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。
- 网卡确定后,带宽也就确定 了(当然,实际带宽会受限于整个网络链路中最小的那个模块)
- 吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字 节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。
- 很多地方听说过“网络带宽测试”,这里测试的实际上不是带宽,而是网络 吞吐量。Linux 服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说, 吞吐量一般会接近带宽。
- 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景 中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。
- PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以 达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影 响。通常用在需要大量转发的场景中。而 对 TCP 或者 Web 服务来说,更多会用并发连接数和每秒请求数(QPS,Query per Second)等指标,它们更能反应实际应用程序的性能。
- 除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢 包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。
各协议层的性能测试--网络基准测试--通过性能测试来确定这些指标的基准值
应该弄清楚,要评估的网络性能,究竟属于协议栈的 哪一层?换句话说,应用程序基于协议栈的哪一层呢?
- 基于 HTTP 或者 HTTPS 的 Web 应用程序,显然属于应用层,需要我们测试 HTTP/HTTPS 的性能;
- 大多数游戏服务器来说,为了支持更大的同时在线人数,通常会基于 TCP 或 UDP ,与客户端进行交互,这时就需要我们测试 TCP/UDP 的性能;
- 把 Linux 作为一个软交换机或者路由器来用的。更关注网络包的处理能力(即 PPS),关注网络层的转发性能。
低层协议的性能,也就决定了高层的网络性能。
转发性能--PPS--网络接口层和网络层
主要负责网络包的封装、寻址、路由以及发送和 接收。在这两个网络协议层中,每秒可处理的网络包数 PPS,就是最重要的性能指标。特 别是 64B 小包的处理能力,
hping3 不仅仅是作为一个 SYN 攻击的工具来使用。是作为一个测试网络包处理能力的性能工具。
Linux 内核自带的高性能网络测试工具 pktgen
可以根据实际需要构造所需网络包。pktgen 作为一个内核线 程来运行,需要你加载 pktgen 内核模块后,再通过 /proc 文件系统来交互。
pktgen 启动两个内核线程
[root@aliyun ~]# modprobe pktgen
[root@aliyun ~]# ps -ef | grep pktgen | grep -v grep
root 22852 2 0 18:10 ? 00:00:00 [kpktgend_0]
root 22853 2 0 18:10 ? 00:00:00 [kpktgend_1]
/proc 文件系统的交互文件:pktgen 在每个 CPU 上启动一个内核线程,并可以通过 /proc/net/pktgen 下面的同名文 件,跟这些线程交互;而 pgctrl 则主要用来控制这次测试的开启和停止。
[root@aliyun ~]# ls /proc/net/pktgen/
kpktgend_0 kpktgend_1 pgctrl
使用 pktgen 测试网络性能时,需要先给每个内核线程 kpktgend_X 以及测试网卡,配 置 pktgen 选项,然后再通过 pgctrl 启动测试。
以发包测试为例,假设发包机器使用的网卡是 eth0,而目标机器的 IP 地址为 192.168.0.30,MAC 地址为 11:11:11:11:11:11。


稍等一会儿,测试完成后,结果可以从 /proc 文件系统中获取。
通过下面代码段中的内 容,我们可以查看刚才的测试报告:

第一部分的 Params 是测试选项; 第二部分的 Current 是测试进度,其中, packts so far(pkts-sofar)表示已经发送了 100 万个包,也就表明测试已完成。 第三部分的 Result 是测试结果,包含测试所用时间、网络包数量和分片、PPS、吞吐量 以及错误数。 根据上面的结果,我们发现,PPS 为 12 万,吞吐量为 61 Mb/s,没有发生错误。
作为对比,你可以计算一下千兆交换机的 PPS。交换机可以达到线速(满负载时,无差错 转发),它的 PPS 就是 1000Mbit 除以以太网帧的大小,即 1000Mbps/((64+20)*8bit) = 1.5 Mpps(其中,20B 为以太网帧前导和帧间距的大小)。
即使是千兆交换机的 PPS,也可以达到 150 万 PPS,比我们测试得到的 12 万大多 了。
现在的多核服务器和万兆网卡已经很普遍了,稍做 优化就可以达到数百万的 PPS。如果用了DPDK 或 XDP ,还能达 到千万数量级。
TCP/UDP 性能-传输层
iperf 和 netperf 都是最常用的网络性能测试工具,测试 TCP 和 UDP 的吞吐量。都以客户端和服务器通信的方式,测试一段时间内的平均吞吐量。
以 iperf 为例,看一下 TCP 性能的测试方法。
yum install iperf3
-s 表示启动服务端,
-i 表示汇报间隔,
-p 表示监听端口
iperf3 -s -i 1 -p 10000
-c 表示启动客户端,192.168.0.30 为目标服务器的 IP
-b 表示目标带宽 (单位是 bits/s)
-t 表示测试时间
-P 表示并发数,
-p 表示目标服务器监听端口
iperf3 -c 192.168.0.30 -b 1G -t 15 -P 2 -p 10000
稍等一会儿(15 秒)测试结束后,回到目标服务器,查看 iperf 的报告:

最后的 SUM 行就是测试的汇总结果,包括测试时间、数据传输量以及带宽等。
按照发送和 接收,这一部分又分为了 sender 和 receiver 两行。
从测试结果你可以看到,这台机器 TCP 接收的带宽(吞吐量)为 860 Mb/s, 跟目标的 1Gb/s 相比,还是有些差距的。
HTTP 性能--应用层
有的应用程序,会直接基于 TCP 或 UDP 构建服务。
也有大量的应用,基于应用层的协议来构建服务,HTTP 就是最常用的一个应用层协议。
比如,常用的 Apache、Nginx 等各种 Web 服务,都是基于 HTTP。
ab、webbench 等,都是常用的 HTTP 压力测试工具。其中,ab 是 Apache 自带的 HTTP 压测工具,主要测试 HTTP 服务 的每秒请求数、请求延迟、吞吐量以及请求延迟的分布情况等。
yum install -y httpd-tools
docker run -p 80:80 -itd nginx
-c 表示并发请求数为 1000,-n 表示总的请求数为 10000
ab -c 1000 -n 10000 http://192.168.0.30/


- 在请求汇总部分,Requests per second 为 1074;每个请求的延迟(Time per request)分为两行,第一行的 927 ms 表示平均延迟,包 括了线程运行的调度时间和网络请求响应时间,而下一行的 0.927ms ,则表示实际请求 的响应时间;Transfer rate 表示吞吐量(BPS)为 890 KB/s。
- 连接时间汇总部分,则是分别展示了建立连接、请求、等待以及汇总等的各类时间,包括最 小、最大、平均以及中值处理时间。
- 请求延迟汇总部分,则给出了不同时间段内处理请求的百分比,比如, 90% 的请求,都可以在 274ms 内完成。
应用负载性能
为了得到应用程序的实际性能,就要求性能工具本身可以模拟用户的请求负载,而 iperf、ab 这类工具就无能为力了。还可以用 wrk、TCPCopy、Jmeter 或 者 LoadRunner 等实现这个目标。
以 wrk 为例,它是一个 HTTP 性能测试工具,内置了 LuaJIT,方便你根据实际需求,生成 所需的请求负载,或者自定义响应的处理方法。
像 Jmeter 或者 LoadRunner(商业产品),则针对复杂场景提供了脚本录制、回放、GUI 等更丰富的功能,使用起来也更加方便。
posted on 2025-10-12 21:36 chuchengzhi 阅读(26) 评论(0) 收藏 举报
浙公网安备 33010602011771号