磨刀不误砍柴工,带你搞定云网络系统性能测试
[TOC]
一、前言
在部署或管理网络系统时,我们更多的是关心网络的连通性,而对于其整体的性能往往考虑不多,或者即使考虑到性能、异常或稳定性的问题,但却发现没有合适的手段去测试或监控网络健康状况。在本文中,首先简单介绍一下网络性能测试指标重点会关注哪些指标、在开展性能测试时,如何预估系统性能以便合理的规划和部署测试环境,然后会介绍基本的网络连通性测试工具、网络性能测试工具以及在开展性能测试时如何部署监控,更加直观的统计性能指标等。因为社区中已经有非常完善的文档,本文不再重复造*,只是简单地介绍并辅以几个简单demo实例,旨在雁过留声,抛砖引玉。平时遇到问题时能够提供一些解决方案或思路,欢迎各位大佬指教。
1.1 网络性能测试指标
性能测试的目的是以性能指标预期为前提,对系统进行施压,验证系统在无资源性能瓶颈的情况下,是否能达到预期目标。对于不同的服务或应用场景,可能关注的指标侧重点存在一定差异,对于底层系统网络性能测试来说,通常会重点关注以下指标:
- 可用性,可用性是对一个系统最基本的要求,开展工作之前首先需要确认一下网络连通性,常规的工具主要有ping、fping、telnet、curl等工具判断网络链路是否通畅。需要注意的是,由于ping是基于ICMP协议实现的,能ping通只能说明网络是能通的,不能说明具备对应的端口访问权限。通常情况下需要结合telnet、curl等工具来判断网络连通性及服务可用性。
- 带宽BPS,每秒所能传送的比特数。通常所说的带宽指的是网络中节点之间的极限带宽,由于节点之间的链路通畅是不完全可见的,因此极限带宽通常是由组成网络的设备能力所决定的。
-
吞吐量(throughput),网络吞吐量是指在某个时刻,在网络中的两个节点之间,提供给网络应用的剩余带宽,通过网络吞吐量可以寻找出网络瓶颈。吞吐量的衡量符合马桶效应,比如,即使
client
和server
都被分别连接到各自的100M
以太网卡上,但是如果这两个100M
的以太网卡被10M
的交换机连接起来,那么10M
的交换机就是网络的瓶颈。吞吐量受带宽限制,吞吐量/带宽就是该网络链路的使用率 - PPS(packet per second),表示以网络包单位的传输速率。PPS通常用来评估网络的转发能力,而基于Linux服务器的转发,很容器受到网络包大小的影响,通常选择1bytes的数据包测试系统极限场景下的pps。
- 时延,表示从一端发出请求后直到收到远端响应所需要的时间。这个指标在不同场景中可能会有不同含义。它可以表示建立连接需要的时间(比如TCP握手延迟),或者一个数据包往返所需时间(比如RTT)
- 丢包率,网络丢包率是指测试中所丢失数据包数量占所发送数据包的比率,通常在吞吐量范围内测试。丢包率主要与客户端到网站服务器之间每段路由的网络拥塞程度有关。由于交换机和路由器的处理能力有限,当网络流量过高来不及处理时就将一部分数据包丢弃造成丢包。由于TCP/IP网络能够自动实现重发,这样发生丢包后不断重发,将造成更大量的丢包。因此,网络拥塞发生后经常会发生丢包率越来越高的现象,和马路上的交通堵塞十分相似。
- 抖动率:抖动率是网络延迟的变化量,它是由同一应用的任意两个相邻数据包在传输路由中经过网络延迟而产生;计算方法:抖动率由相邻数据包延迟时间差除以数据包序号差得到。
1.2 系统的网络性能评估
系统的性能指标,一般情况下会在产品需求文档中有较明确定义,QA同学以此为依据部署环境,开展测试任务。对于探索式的性能测试来讲,通常需要QA同学横向了解一下相关指标的合理范围,例如需要测试指定网卡性能表现,带宽跟物理网卡配置是直接关联的,网卡确定后,带宽也就确定了(实际带宽受限于整个网络链路中最小的那个模块),为了更加有效的预估,可以参考说明文档、竞品公布的性能数据或者根据经验值分析。比如测试网关的极限带宽,假设网关节点网卡配置为两张82599 10Gb网卡做bond1,那么理论极限带宽不会超过20Gb,加上物理损耗,实际评估的带宽约为15Gb~18Gb之间,假设客户端与服务端均采用相同规格物理机部署,单台物理机带宽上限约为8Gb,要想获得网关节点的真实极限带宽,客户端与服务端需要至少分别部署三台物理机。
二、 网络连通性测试工具
在完成测试方案设计、评审以及环境部署之后,首先需要做的是测试服务可用性,相关的测试工具上文中已有提及,这里主要简单介绍ping常规的使用方法,其它工具如mtr、NMap、Netcat、fping、paping等可通过man命令查看。
2.1.1 ping
首先简单介绍一下ICMP协议,ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ping命令是基于ICMP协议实现的。使用这个命令判断网络的连通性以及网速,也可实现域名解析,默认使用该命令会一直发送ICMP包直到用户手动中止,可以使用以下常用参数控制数据包的传输:
-
-c
命令指定发送数据包的个数 -
-W
指定最长等待时间,如果有多张网卡 -
-I
指定发送包的网卡 -
-s
可以指定发送包的大小,默认包大小为64bytes
在ping过程中按下ctrl+|
会打印出当前的summary信息,统计当前发送包数量、接收数量、丢包率等。示例,如下一台云主机eth0配置了secondaryIP,需要测试一下网络连通性
root@pytest-likailiang-1t3j9c-2:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:b7:b2:ca brd ff:ff:ff:ff:ff:ff
inet 172.16.1.2/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.16.1.3/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:feb7:b2ca/64 scope link
valid_lft forever preferred_lft forever
root@pytest-likailiang-1t3j9c-2:~# ping 192.168.1.70 -I 172.16.1.3 -c 10 -i 2 -w 10 -s 64
PING 192.168.1.70 (192.168.1.70) from 172.16.1.3 : 56(84) bytes of data.
64 bytes from 192.168.1.70: icmp_seq=1 ttl=63 time=1.51 ms
64 bytes from 192.168.1.70: icmp_seq=2 ttl=63 time=0.972 ms
2/2 packets, 0% loss, min/avg/ewma/max = 0.972/1.242/1.444/1.512 ms
64 bytes from 192.168.1.70: icmp_seq=3 ttl=63 time=0.766 ms
64 bytes from 192.168.1.70: icmp_seq=4 ttl=63 time=0.716 ms
64 bytes from 192.168.1.70: icmp_seq=5 ttl=63 time=0.681 ms
5/5 packets, 0% loss, min/avg/ewma/max = 0.681/0.929/1.204/1.512 ms
--- 192.168.1.70 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 8010ms
rtt min/avg/max/mdev = 0.681/0.929/1.512/0.309 ms
root@pytest-likailiang-1t3j9c-2:~#
需要说明的是与ping要等待某一主机连接超时或发回反馈信息不同,fping给一个主机发送完数据包后,马上给下一个主机发送数据包,实现多主机同时ping。如果某一主机ping通,则此主机将被打上标记,并从等待列表中移除,如果没ping通,说明主机无法到达,主机仍然留在等待列表中,等待后续操作。Fping程序类似于ping。Fping与ping不同的地方在于,fping可以在命令行中指定要ping的主机数量范围,也可以指定含有要ping的主机列表文件。
2.1.2 mtr
mtr(全称 my traceroute,是一个把 ping 和 traceroute 合并到一个程序的网络诊断工具,功能更强大。mtr默认发送ICMP数据包进行链路探测,用户还可以通过-u参数来指定使用UDP数据包用于探测。相比traceroute只会做一次链路跟踪测试,mtr会对链路上的相关节点做持续探测并给出相应的统计信息。mtr能避免节点波动对测试结果的影响,所以其测试结果更正确。
mtr有Linux和Windows两种版本,在Windows系统下可以直接使用WinMTR工具,WinMTR是Windows下关于mtr的图形化工具,WinMTR下载地址。WinMTR无需安装,下载完毕后,直接解压运行即可。Linux环境下直接使用mtr命令即可,安装及命令行操作参考:
安装mtr工具
apt-get install mtr -y
mtr (My traceroute)几乎是所有 Linux 发行版本预装的网络测试工具,集成了 tracert 与 ping 这两个命令的图形界
root@slaver1:~# mtr -h
usage: mtr [--help] [--version] [-4|-6] [-F FILENAME]
[--report] [--report-wide] [--displaymode MODE]
[--xml] [--gtk] [--curses] [--raw] [--csv] [--json] [--split]
[--no-dns] [--show-ips] [-o FIELDS] [-y IPINFO] [--aslookup]
[-i INTERVAL] [-c COUNT] [-s PACKETSIZE] [-B BITPATTERN]
[-Q TOS] [--mpls]
[-a ADDRESS] [-f FIRST-TTL] [-m MAX-TTL] [-U MAX_UNKNOWN]
[--udp] [--tcp] [--sctp] [-P PORT] [-L LOCALPORT] [-Z TIMEOUT]
[-G GRACEPERIOD] [-M MARK] HOSTNAME
See the man page for details.
如上图所示,mtr测试结果每列数值的说明如下:
root@slaver1:~# mtr -c 2 -r 114.114.114.114
Start: Wed Aug 19 15:35:05 2020
HOST: slaver1 Loss% Snt Last Avg Best Wrst StDev
1.|-- ??? 100.0 2 0.0 0.0 0.0 0.0 0.0
2.|-- ??? 100.0 2 0.0 0.0 0.0 0.0 0.0
3.|-- ??? 100.0 2 0.0 0.0 0.0 0.0 0.0
4.|-- ??? 100.0 2 0.0 0.0 0.0 0.0 0.0
5.|-- ??? 100.0 2 0.0 0.0 0.0 0.0 0.0
6.|-- 61.164.31.126 0.0% 2 1.7 2.8 1.7 3.9 1.4
7.|-- 220.191.200.207 0.0% 2 5.2 5.4 5.2 5.7 0.0
8.|-- 202.97.76.2 0.0% 2 11.5 11.6 11.5 11.7 0.0
9.|-- 222.190.59.206 0.0% 2 14.3 16.3 14.3 18.2 2.6
10.|-- 58.213.224.170 0.0% 2 27.6 22.1 16.5 27.6 7.9
11.|-- public1.114dns.com 0.0% 2 14.3 14.3 14.3 14.4 0.0
Host:节点IP地址和域名(按n键可以切换显示);
Loss%:节点丢包率;
Snt:每秒发送数据包数,默认值是10,可以通过参数-c指定;
Last:最近一次的探测延迟值;
Avg:探测延迟的平均值;
Best:探测延迟的最小值;
Wrst:探测延迟到最大值;
StDev:标准偏差值,越大说明相应节点越不稳定。
更多内容参考云社区
2.1.3 网猫netcat
NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接,在linux和window环境下均可使用,社区文档非常丰富,实例参考下文链接。
netcat
使用的基本形式为:
nc 参数 目的地址 端口
常用的参数说明如下:
-k 在当前连接结束后保持继续监听
-l 用作端口监听,而不是发送数据
-n 不使用 DNS 解析
-N 在遇到 EOF 时关闭网络连接
-p 指定源端口
-u 使用 UDP 协议传输
-v (Verbose)显示更多的详细信息
-w 指定连接超时时间
-z 不发送数据
实例参考:Linux 中的 netcat 网络工具简介,“瑞士军刀”Netcat使用方法总结
2.1.4 xxxping
ping命令是一个很好用并且常用的网络测试工具,它是基于ICMP协议,但是出于网络安全等因素,大部分网络环境以及云环境可能都会禁止ICMP协议,所以在工作中,我们必须掌握一些其他比较流行的网络测试工具,比如tcpping、tcping、psping、hping、paping等几款网络测试工具。社区文档比较丰富,这里不再详细介绍。
三 、 网络性能测试工具
网络性能测试工具这里主要介绍两个常用的工具iperf和netperf,相关的工具如wrk 、pktgen等后续会加以补充
3.1 iperf
3.1.1 iperf简介
iperf(iperf3)是一个网络性能测试工具,采用C/S(客户端/服务器端)架构模式,可以测试TCP和UDP带宽、模拟网络故障等。利用iperf这一特性,可以用来测试一些网络设备如路由器,防火墙,交换机等的性能,评估系统QOS。iperf分为两种版本,Unix/Linux版和Windows版,Unix/Linux版更新比较快,版本最新。Windows版更新慢。Windows版的iperf叫jperf,或者xjperf。jperf是在iperf基础上开发了更好的UI和新的功能。
3.1.2 iperf安装及使用说明
源码安装参考iperf,推荐命令行直接安装
~# apt-get install -y iperf3
常用的参数说明如下:
命令行选项 | 描述 |
---|---|
客户端与服务器共用选项 | |
-i, --interval # | 设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。 |
-l, --len #[KM] | 设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。 |
-p, --port # | 设置端口,与服务器端的监听端口一致。默认是5001端口,与ttcp的一样。 |
-u, --udp | 使用UDP方式而不是TCP方式。参看-b选项。 |
-w, --window #[KM] | 设置套接字缓冲区为指定大小。对于TCP方式,此设置为TCP窗口大小。对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值。 |
-B, --bind host | 绑定到主机的多个地址中的一个。对于客户端来说,这个参数设置了出栈接口。对于服务器端来说,这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下,此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。 |
-C, --compatibility | 与低版本的Iperf使用时,可以使用兼容模式。不需要两端同时使用兼容模式,但是强烈推荐两端同时使用兼容模式。某些情况下,使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。 |
-M, --mss #[KM} | 通过TCP_MAXSEG选项尝试设置TCP最大信息段的值。MSS值的大小通常是TCP/ip头减去40字节。在以太网中,MSS值 为1460字节(MTU1500字节)。许多操作系统不支持此选项。 |
-N, --nodelay | 设置TCP无延迟选项,禁用Nagle's运算法则。通常情况此选项对于交互程序,例如telnet,是禁用的。 |
-V (from v1.6 or higher) | 绑定一个IPv6地址。 服务端:$ iperf -s –V 客户端:$ iperf -c -V 注意:在1.6.3或更高版本中,指定IPv6地址不需要使用-B参数绑定,在1.6之前的版本则需要。在大多数操作系统中,将响应IPv4客户端映射的IPv4地址。 |
服务器端专用选项 | |
-s, --server | Iperf服务器模式 |
-D (v1.2或更高版本) | Unix平台下Iperf作为后台守护进程运行。在Win32平台下,Iperf将作为服务运行。 |
-o(v1.2或更高版本,仅用于Windows) | 重定向输出到指定文件 |
-c, --client host | 如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。 |
-P, --parallel # | 服务器关闭之前保持的连接数。默认是0,这意味着永远接受连接。 |
客户端专用选项 | |
-b, --bandwidth #[KM] | UDP模式使用的带宽,单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。 |
-c, --client host | 运行Iperf的客户端模式,连接到指定的Iperf服务器端。 |
-d, --dualtest | 运行双测试模式。这将使服务器端反向连接到客户端,使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。 |
-n, --num #[KM] | 传送的缓冲器数量。通常情况,Iperf按照10秒钟发送数据。-n参数跨越此限制,按照指定次数发送指定长度的数据,而不论该操作耗费多少时间。参考-l与-t选项。 |
-r, --tradeoff | 往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。当客户端连接终止时,反向连接随即开始。如果需要同时进行双向测试,请尝试-d参数。 |
-t, --time # | 设置传输的总时间。Iperf在指定的时间内,重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。 |
-L, --listenport # | 指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。 |
-P, --parallel # | 线程数。指定客户端与服务端之间使用的线程数。默认是1线程。需要客户端与服务器端同时使用此参数。 |
关于网络性能测试推荐参考阿里云网络性能测试方法。这样在横向数据对比时更具有参考价值,更多资料参考
3.1.3 iperf实例
带宽测试通常采用UDP模式,因为能测出极限带宽、时延抖动、丢包率。在进行测试时,首先以链路理论带宽作为数据发送速率进行测试,例如,从客户端到服务器之间的链路的理论带宽为100Mbps,先用-b 100M
进行测试,然后根据测试结果(包括实际带宽,时延抖动和丢包率),再以实际带宽作为数据发送速率进行测试,会发现时延抖动和丢包率比第一次好很多,重复测试几次,就能得出稳定的实际带宽。
UDP模式
服务器端:
iperf -u -s
客户端:
iperf -u -c 192.168.1.1 -b 100M -t 60
在udp模式下,以100Mbps为数据发送速率,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。
iperf -u -c 192.168.1.1 -b 5M -P 30 -t 60
客户端同时向服务器端发起30个连接线程,以5Mbps为数据发送速率。
iperf -u -c 192.168.1.1 -b 100M -d -t 60
以100M为数据发送速率,进行上下行带宽测试。
TCP模式
服务器端:
iperf -s
客户端:
iperf -c 192.168.1.1 -t 60
在tcp模式下,客户端到服务器192.168.1.1上传带宽测试,测试时间为60秒。
iperf -c 192.168.1.1 -P 30 -t 60
客户端同时向服务器端发起30个连接线程。
iperf -c 192.168.1.1 -d -t 60
进行上下行带宽测试
pps
iperf3 -s -p 3000
iperf3 -c server-ip -i 1 -t 2000 -V -p 3000 -b 1000000000 -l 100 -M 89
for i in $(seq 3200 3300) ; do screen -d -m iperf -s -p $i ; done
for i in $(seq 3200 3300 ); do screen -d -m iperf -c server-ip -i 1 -t 2000 -V -p $i -b 1000000000 -l 100 -M 89 ; done
3.1.4 参考
- 阿里云网络性能测试方法:https://www.alibabacloud.com/help/zh/faq-detail/55757.htm#top
- 腾讯云网络性能测试方法:https://cloud.tencent.com/document/product/213/11460
- iperf命令:https://man.linuxde.net/iperf
- https://github.com/esnet/iperf
3.2 netperf
3.2.1 netperf简介
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。
Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试.在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果:在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,进行来回传递特殊的流量模式,以测试网络的性能。
社区提供的开源Netperf只能满足两个9的时延数据统计,当进行精度较高的专项性能测试时显得无能为力,为此网易杭研云计算同学对此进行了二次开发,能够满足9999值数据统计,项目地址参考netperf-9999 。
netperf常用命令行参数如下选项:
-H host :指定远端运行netserver的server IP地址。
-l testlen:指定测试的时间长度(秒)
-t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR
-s size 设置本地系统的socket发送与接收缓冲大小
-S size 设置远端系统的socket发送与接收缓冲大小
-m size 设置本地系统发送测试分组的大小
-M size 设置远端系统接收测试分组的大小
-D 对本地与远端系统的socket设置TCP_NODELAY选项
3.2.2 netperf 网络测试模式说明
- TCP_STREAM Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM。测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量
-
UDP_STREAM UDP_STREAM用来测试进行UDP批量传输时的网络性能。注意:此时测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示
-
测试UDP_STREAM模式下pps
pssh -i -h client-ips -O StrictHostKeyChecking=no 'for node in $(cat server-ips); do for i in $(seq 12010 12015); do screen -d -m netperf -H $node -p $i -t UDP_STREAM -l 100 -- -m 1 -R 1 ; done ; done'
-
-
TCP_RR ,TCP_RR方式的测试对象是建立一次连接之后多次TCP request和response的交易过程,该模式下可以得到长连接极限带宽或pps
-
测试TCP_RR长连接模式下pps
pssh -i -h client-ips -O StrictHostKeyChecking=no 'for node in $(cat server-ips); do for i in $(seq 12010 12015); do screen -d -m netperf -H $node -p $i -t TCP_RR -l 100 -- -r 1B,1B; done ; done'
-
测试网络延迟和吞吐量
./netperf_client_9999 -t TCP_RR -H <server-ip> -l 60 -- -r 1B,1B -O " MIN_LAETENCY, MAX_LATENCY,MEAN_LATENCY, P90_LATENCY, P99_LATENCY ,P999_LATENCY,P9999_LATENCY,STDDEV_LATENCY ,THROUGHPUT ,THROUGHPUT_UNITS"
-
-
TCP_CRR 与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接
-
测试TCP_CRR短连接模式下pps
pssh -i -h client-ips -O StrictHostKeyChecking=no 'for node in $(cat server-ips); do for i in $(seq 12010 12015); do screen -d -m netperf -H $node -p $i -t TCP_CRR -l 100 -- -r 1B,1B; done ; done'
-
- UDP_RR UDP_RR方式使用UDP分组进行request/response的交易过程
3.2.3 实例
测试网络带宽bps
在对端机器上启动netserver,这是netperf自带的一个服务端程序。可以不带任何参数启动。
root@lkl-stress-test-nginx-017:~# netserver -p 49999
Starting netserver with host 'IN(6)ADDR_ANY' port '49999' and family AF_UNSPEC
在本机输入以下命令启动netperf:
$netperf -H $(对端IP)
root@lkl-stress-test-nginx-016:~# netperf -H 172.16.0.153
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.0.153 () port 0 AF_INET : demo
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
8192 65536 65536 10.00 15955.55
可以看到,带宽的吞吐量基本上达到了约15G。输出结果各个字段的含义如下:
字段名 | 含义 | 备注 |
---|---|---|
Socket size(bytes) | 缓冲区的大小 | – |
Message size(bytes) | 数据包的大小 | – |
Elapsed Time(secs) | 测试时间 | – |
Messages Okay(个) | 发送成功的数据包数目 | – |
Messages Errors(个) | 发送失败的数据包数目 | – |
Throughtput(10^6bits/sec) | 吞吐量 | – |
-
PPS
- PPS 为每秒钟发送成功的数据包个数
- 具体计算方法:PPS = 数据包发送成功的数目/测试时间
- 可以在 Server 端用 sar 命令来统计实际收到的数据包,具体命令如下所示,其表示每隔 1 秒统计一次,统计 300 次,sar 命令最后会对 300 次的统计结果求平均
sar -n DEV 1 300
测试延迟
在对端机器上启动netserver。 在本机输入以下命令启动netperf:
root@lkl-stress-test-nginx-016:~# netperf -H 172.16.0.153 -t omni -- -d rr -O "THROUGHPUT, THROUGHPUT_UNITS, MIN_LATENCY, MAX_LATENCY, MEAN_LATENCY"
OMNI Send|Recv TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 172.16.0.153 () port 0 AF_INET : demo
Throughput Throughput Minimum Maximum Mean
Units Latency Latency Latency
Microseconds Microseconds Microseconds
22547.84 Trans/s 36 3605 44.23
可以看到,在resquest/response测试模式下,每秒的吞吐量为22547.84次,最小的时延为36微秒,最大为3605微秒,平均时延为44.23微秒。结果显示,有比较少的报文的延迟比较厉害,达到了毫秒级,但是大部分都在100微秒级
3.2.4 参考
- 物理专线网络性能测试方法:https://help.aliyun.com/document_detail/58625.html
- netperf 与网络性能测量:https://www.ibm.com/developerworks/cn/linux/l-netperf/index.html
- https://www.cnblogs.com/xieshengsen/p/6493277.html
- https://www.ibm.com/developerworks/cn/linux/l-netperf/index.html
- https://sq.163yun.com/blog/article/190965728772210688
- 三层网络PPS极限测试:https://blog.csdn.net/minxihou/article/details/84930250
- netperf 和 iperf 网络性能测试小结:https://wsgzao.github.io/post/netperf/
- https://blog.didiyun.com/index.php/2018/12/07/netperf/
- 网络性能测试方法: https://www.alibabacloud.com/help/zh/faq-detail/55757.htm
- http 性能测试 wrk使用教程:https://juejin.im/post/6844903550288396296
四、网络数据监控工具
4.1 netdata
Netdata是Linux系统实时性能监测工具,以web的可视化方式展示系统及应用程序的实时运行状态(包括cpu、内存、硬盘输入/输出、网络等linux性能的数据)Netdata是一个高度优化的Linux守护进程,它为Linux系统,应用程序,SNMP服务等提供实时的性能监测。它用可视化的手段,将被监测者最细微的细节,展现了出来。这样,你便可以清晰地了解你的系统和应用程序此时的状况。图片来源
netdata部署直接参考github。
实际效果参考:下图是通过netdata监控云主机eth0网卡的流量,可是直观的看到收方向和发方向的流量状况,相比sar
工具统计更为直观。
Fping类似于ping,但比ping强大。Fping与ping不同的地方在于,fping可以在命令行中指定要ping的主机数量范围,也可以指定含有要ping的主机列表文件。与ping要等待某一主机连接超时或发回反馈信息不同,fping给一个主机发送完数据包后,马上给下一个主机发送数据包,实现多主机同时ping。如果某一主机ping通,则此主机将被打上标记,并从等待列表中移除,如果没ping通,说明主机无法到达,主机仍然留在等待列表中,等待后续操作。
下图是netdata集成fping 监控网络连通性,其中 fping.conf 的配置文件为:
~# cat fping.conf
fping="/usr/local/bin/fping"
hosts="172.16.1.2 10.10.10.10" # 这边配置需要ping的地址,通过空格隔离ip地址或域名
update_every=1
ping_every=1000
fping_opts=" -b 56 -r 0 -t 5000"
- 支持fping 监控
docker run -d --name=netdata \
-p 19999:19999 \
-v /etc/passwd:/host/etc/passwd:ro \
-v /etc/group:/host/etc/group:ro \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /root/fping.conf:/etc/netdata/fping.conf:ro \
--cap-add SYS_PTRACE \
--security-opt apparmor=unconfined \
hub.c.163.com/nvsoline2/netdata:fping
- 监控数据持久化保留30天数据
需要配置dbengine,理论上5G硬盘可以支持 每秒2000个数据点,30天。
root@jiande1-dgw-jiande1:~# cat netdata.conf
[global]
memory mode = dbengine
page cache size = 32
dbengine disk space = 4999
启动时使用上面这个netdata.conf配置。
- portcheck配置
这些都属于 https://learn.netdata.cloud/docs/agent/collectors/go.d.plugin 插件。
~# cat portcheck.conf
update_every: 1
jobs:
- name: server1
host: 127.0.0.1
ports:
- 22
- name: server2
host: 59.111.96.215
ports:
- 9009
- name: nlb-beta-test
host: 59.111.245.80
update_every: 1
ports:
- 80
go.d.conf ,里面把需要监控的项目打开
~# cat go.d.conf
# netdata go.d.plugin configuration
#
# This file is in YaML format.
# Enable/disable the whole go.d.plugin.
enabled: yes
# Enable/disable default value for all modules.
default_run: yes
# Maximum number of used CPUs. Zero means no limit.
max_procs: 0
# Enable/disable specific g.d.plugin module
# If you want to change any value, you need to uncomment out it first.
# IMPORTANT: Do not remove all spaces, just remove # symbol. There should be a space before module name.
modules:
example: yes
nginx: yes
portcheck: yes
nginx监控demo
~# cat nginx.conf
jobs:
- name: local
url: http://10.199.128.66/nginx_status
docker 启动命令
docker run -d --name=netdata -p 19999:19999 \
-v /etc/passwd:/host/etc/passwd:ro \
-v /etc/group:/host/etc/group:ro \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v /root/fping.conf:/etc/netdata/fping.conf:ro \
-v /root/example.conf:/etc/netdata/go.d/example.conf:ro \
-v /root/portcheck.conf:/etc/netdata/go.d/portcheck.conf:ro \
-v /root/nginx.conf:/etc/netdata/go.d/nginx.conf:ro \
-v /root/go.d.conf:/etc/netdata/go.d.conf:ro \
-v /root/netdata.conf:/etc/netdata/netdata.conf:ro \
--cap-add SYS_PTRACE \
--security-opt apparmor=unconfined \
hub.c.163.com/nvsoline2/netdata:fping
4.2 Prometheus
参考写的另外一篇文章:
4.3 参考
- 实时系统性能监控工具:https://github.com/netdata/netdata
- https://www.hi-linux.com/tags/#NetData
- https://cloud.tencent.com/developer/article/1409664
续...