博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。 |
有时候,我们需要确切地知道服务器在当前网络环境下所能达到的上行和下行的网络带宽是多少,这对于测试上传或下载作业是否最大化利用了带宽非常重要。我们以位于AWS VPC 环境中的 EC2 为例,介绍一下如何实测出 EC2 节点所能达到的最大带宽。我们以 m5.4xlarge 这一机型为例,根据 AWS 官方文档的介绍:https://aws.amazon.com/ec2/instance-types/m5/,该型实例可以达到的最高带宽是 10 Gbps,我们将使用两台 m5.4xlarge,通过 iperf 来实测一下两台服务器之间的最大上传和下载速率。
1. 内网双机互测
如果你在内网中拥有两台机器,那么,最准确的测试方法是:一台作为服务器,另一台做为客户端向其发送数据包,这样检测出的结果是最准确的,这能屏蔽掉外网上下行带宽的影响,这也是 iperf 的工作方式。
1.1. 安装 iperf
iperf 可以通过 yum 安装,但前提是 yum 已经安转了 epel 的 repo, 安装前,先使用命令:
yum repolist
确认一下当前 OS 是否已经安装过了 epel repo,如果没有,可以使用如下命令先安装 epel repo:
# for centos 7
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# for centos 6
wget https://dl.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install ./epel-release-*.noarch.rpm
然后就可以使用 yum 安装 iperf 了:
sudo yum -y install iperf
1.2. 启动 iperf 服务器端
iperf 使用的是 C/S 架构,通过客户端向服务器发送大量的数据包来实测网速,所以需要在一台服务台上启动 server 进程(默认端口 5001),在另一台服务器作为客户端发送数据。启动 server 的命令是:
iperf -s
1.3. 在 iperf 客户端上测速
服务器段启动后,登录另一台服务器,使用如下三组命令向服务器发送数据包,查看测速报告。其中, -P 参数用于指定线程数,这对于测出最大网速非常必要:
iperf -c <服务器IP>
iperf -c <服务器IP> -P 2
iperf -c <服务器IP> -P 3
命令执行结果如下:
从上述三轮测速报告中,我们可以得出如下结论:
- 首轮测速结果是 4.97 Gbps,这是最大网速吗?显然不是!
- 将并发线程调整为 2 后重测,得到了 9.92 Gbps,这是上轮测速的 2 倍,那这是这是最大网速了吗?不确定,再加线程看趋势!
- 将并发线程调整为 2 后重测,得到了 9.93 Gbps,这说明,9.9+ Gbps 已经是这台服务器在这个网络中的带宽极值了。
上述结论和 AWS 官方文档给出的数据是一致的:m5.4xlarge 机型的带宽极值就是 10 Gbps 了 (每秒传输 1280M 字节数据)
上述测试的是单向网络传输,也就是从客户端向服务器端发送数据,在实际的网络环境中,通信都是双向的,为了测试双向的通信带宽,iperf 允许我们让客户端同时作为服务器接收来自服务器端的数据,这样模拟的就是在上传过程中伴随下载的网络带宽表现。做法就是加一个 -d 参数表示双向传输,然后还要给客户端一个监听端口接收数据(用 -L 来设置)。同样执行如下三组命令:
iperf -c <服务器IP> -d -L 5002
iperf -c <服务器IP> -d -L 5002 -P 2
iperf -c <服务器IP> -d -L 5002 -P 3
命令执行结果如下:
从上述三轮测速报告中,我们可以得出如下结论:
- 在双工模式下,网络带宽基本是对半分配了
- 上传和下载速率加在一起等入总带宽
2. 本机自检
如果你不具备双机互为服务器/客户端模式的测速,或者你只是关心当前机器整体的下载和上传速率,那么 iftop 是更合适你的工具,它们准确反映出当前服务器整体的上传和下载速率。
2.1. 安装 iftop
和 iperf 一样,iftop 也可以通过 yum 安装,但前提是 yum 已经安转了 epel 的 repo, 安装前,先使用命令:
yum repolist
确认一下当前 OS 是否已经安装过了 epel repo,如果没有,可以使用如下命令先安装 epel repo:
# for centos 7
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# for centos 6
wget https://dl.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum -y install ./epel-release-*.noarch.rpm
然后就可以使用 yum 安装 iftop 了:
sudo yum -y install iftop
2.1. 启动 iftop
执行命令:
sudo iftop
会看到如下界面:
这正是我们前面使用 iperf 进行压测时,从客户端机器上截取的 iftop 的输出信息。解释一下各个位置的信息含义:
- 第一行,是带宽,下面带有标尺,用来标示每个连接上的实时流量占用的带宽(从实测看,iperf 的标尺只能显式到1.79 Gbps )
- 中间部分,是所有的连接,默认显示的是主机名,可以通过参数显示ip,箭头表示数据方向
- 中间右侧三列,分别是该连接2s、10s、40s的平均流量
- 底部三行,分别表示发送、接收、汇总的流量
- 底部三行第2列,为iftop启动到现在的流量汇总
- 底部三行第3列,为峰值速率
- 底部三行第4列,为2s、10s、40s的平均值
附录:iperf 命令参数
- 通用参数
-f, --format \[bkmaBKMA] # 格式化带宽数输出
-i, --interval # # 设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。
-l, --len #\[KM] # 设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。
-m, --print\_mss # 输出TCP MSS值(通过TCP\_MAXSEG支持)。MSS值一般比MTU值小40字节。通常情况
-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 # 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将作为服务运行。
-R(v1.2或更高版本,仅用于Windows) # 卸载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线程。需要客户端与服务器端同时使用此参数。
-S, --tos # # 出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值,使用以"0x"开始的16进制数,
# 或以"0"开始的8进制数或10进制数。 例如,16进制'0x10' = 8进制'020' = 十进制'16'。
# TOS值1349就是: IPTOS\_LOWDELAY minimize delay 0x10 IPTOS\_THROUGHPUT maximize
# throughput 0x08 IPTOS\_RELIABILITY maximize reliability 0x04 IPTOS\_LOWCOST minimize cost 0x02
-T, --ttl # # 出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1,链接本地。
-F (from v1.2 or higher) # 使用特定的数据流测量带宽,例如指定的文件。 $ iperf -c -F
-I (from v1.2 or higher) # 与-F一样,由标准输入输出文件输入数据。