性能测试网络篇总结

Posted 字节匠人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能测试网络篇总结相关的知识,希望对你有一定的参考价值。

网络模型


开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。

为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,OSI 模型把网络互联的框架分为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层等七层,每个层负责不同的功能。

  • 应用层,负责为应用程序提供统一的接口。

  • 表示层,负责把数据转换成兼容接收系统的格式。

  • 会话层,负责维护计算机之间的通信连接。

  • 传输层,负责为数据加上传输表头,形成数据包。

  • 网络层,负责数据的路由和转发。

  • 数据链路层,负责MAC寻址、错误侦测和改错。

  • 物理层,负责在物理网络中传输数据帧。

TCP/IP 网络模型

TCP/IP 模型,把网络互联的框架分为应用层、传输层、网络层、网络接口层等四层

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。

  • 传输层,负责端到端的通信,比如 TCP、UDP 等。

  • 网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。

  • 网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。

过 TCP 协议通信的网络包,应用程序数据在每个层的封装格式


性能测试网络篇总结

  • 传输层在应用程序数据前面增加了 TCP 头;

  • 网络层在 TCP 数据包前增加了 IP 头;

  • 而网络接口层,又在 IP 数据包前后分别增加了帧头和帧尾。

 Linux 通用 IP 网络栈


  • 最上层的应用程序,需要通过系统调用,来跟套接字接口进行交互;

  • 套接字的下面,就是我们前面提到的传输层、网络层和网络接口层;

  • 最底层,则是网卡驱动程序以及物理网卡设备。

网络包的收发流程




性能指标


我们通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。

  • 带宽,表示链路的最大传输速率,单位通常为 b/s (比特/秒)。

  • 吞吐量,表示没丢包时的最大数据传输速率,单位通常为 b/s(比特/秒)或者 B/s(字节/秒)。吞吐量受带宽限制,而吞吐量/带宽,也就是该网络的使用率。

  • 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。

  • PPS,是 Packet Per Second(包/秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。

除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。

相关命令


可以使用 ifconfig 或者 ip 命令,来查看网络的配置


ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。通常情况下它们会在发行版中默认安装。但如果你找不到 ifconfig 或者 ip 命令,可以安装这两个软件包。

$ ifconfig eth0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.240.0.30 netmask 255.240.0.0 broadcast 10.255.255.255 inet6 fe80::20d:3aff:fe07:cf2a prefixlen 64 scopeid 0x20<link> ether 78:0d:3a:07:cf:3a txqueuelen 1000 (Ethernet) RX packets 40809142 bytes 9542369803 (9.5 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32637401 bytes 4815573306 (4.8 GB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ip -s addr show dev eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 78:0d:3a:07:cf:3a brd ff:ff:ff:ff:ff:ff inet 10.240.0.30/12 brd 10.255.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20d:3aff:fe07:cf2a/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 9542432350 40809397 0 0 0 193 TX: bytes packets errors dropped carrier collsns 4815625265 32637658 0 0 0 0


套接字信息

可以用 netstat 或者 ss ,来查看套接字、网络栈、网络接口以及路由表的信息

# head -n 3 表示只显示前面3行# -l 表示只显示监听套接字# -n 表示显示数字地址和端口(而不是名字)# -p 表示显示进程信息$ netstat -nlp | head -n 3Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 840/systemd-resolve
# -l 表示只显示监听套接字# -t 表示只显示 TCP 套接字# -n 表示显示数字地址和端口(而不是名字)# -p 表示显示进程信息$ ss -ltnp | head -n 3State Recv-Q Send-Q Local Address:Port Peer Address:PortLISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=840,fd=13))LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1459,fd=3))

其中,接收队列(Recv-Q)和发送队列(Send-Q)需要你特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态下,它们的含义不同。

当套接字处于连接状态(Established)时,

  • Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。

  • 而 Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

  • 当套接字处于监听状态(Listening)时,

  • Recv-Q 表示 syn backlog 的当前值。

  • 而 Send-Q 表示最大的 syn backlog 值。

而 syn backlog 是 TCP 协议栈中的半连接队列长度,相应的也有一个全连接队列(accept queue),它们都是维护 TCP 状态的重要机制。

顾名思义,所谓半连接,就是还没有完成 TCP 三次握手的连接,连接只进行了一半,而服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

而全连接,则是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要再被 accept() 系统调用取走,这样,服务器就可以开始真正处理客户端的请求了。

网络吞吐和 PPS

推荐使用 sar

# 数字1表示每隔1秒输出一组数据$ sar -n DEV 1Linux 4.15.0-1035-azure (ubuntu) 01/06/19 _x86_64_ (2 CPU)
13:21:40 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil13:21:41 eth0 18.00 20.00 5.79 4.25 0.00 0.00 0.00 0.0013:21:41 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0013:21:41 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  • rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包/秒。

  • rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是KB/秒。

  • rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包/秒。

  • %ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。

网络性能的评估方法

性能评估是优化网络性能的前提,只有在你发现网络性能瓶颈时,才需要进行网络性能优化。根据 TCP/IP 协议栈的原理,不同协议层关注的性能重点不完全一样,也就对应不同的性能测试方法。比如,

  • 在应用层,你可以使用 wrk、Jmeter 等模拟用户的负载,测试应用程序的每秒请求数、处理延迟、错误数等;

  • 而在传输层,则可以使用 iperf 等工具,测试 TCP 的吞吐情况;

  • 再向下,你还可以用 Linux 内核自带的 pktgen ,测试服务器的 PPS。

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



以上是关于性能测试网络篇总结的主要内容,如果未能解决你的问题,请参考以下文章

性能测试总结--工具选型篇

性能测试总结--工具选型篇

性能测试总结---基础理论篇

测试面试题集锦| 自动化测试与性能测试篇(附答案)

性能测试总结---基础理论篇

性能测试总结---基础理论篇