Linux网络性能评估压测

性能评估是优化网络性能的前提,只有在你发现网络性能瓶颈时,才需要进行网络性能优化。


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

1625661975139-7aad6ea2-7c6b-4da3-95e7-650d6f3a2107.png

性能指标

  • 带宽,表示链路的最大传输速率,单位通常为 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。

1625653129902-0f122afa-7c2a-49e6-bb00-6f454bb32ed2.png

1625653141120-7177af03-1d75-430a-8c7e-43856bc67333.png

稍等一会儿,测试完成后,结果可以从 /proc 文件系统中获取。

通过下面代码段中的内 容,我们可以查看刚才的测试报告:

1625653176515-bd9ed8e2-0e75-478c-adc9-1de7cc615975.png

第一部分的 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 的报告:

1625661271310-f37ca83a-beff-44d2-8cf4-3d7e86afe966.png

最后的 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/

1625661520197-c07e702f-a170-411f-83c9-d1af0f7ca4ee.png

1625661529065-5cfdcd6c-7982-4a94-840c-04e988d47e63.png

  • 在请求汇总部分,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)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客