使用 iperf 和 iftop 测试网络带宽

2023-12-10 17:20

本文主要是介绍使用 iperf 和 iftop 测试网络带宽,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名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

命令执行结果如下:

image-20231209145734185

从上述三轮测速报告中,我们可以得出如下结论:

  1. 首轮测速结果是 4.97 Gbps,这是最大网速吗?显然不是!
  2. 将并发线程调整为 2 后重测,得到了 9.92 Gbps,这是上轮测速的 2 倍,那这是这是最大网速了吗?不确定,再加线程看趋势!
  3. 将并发线程调整为 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

命令执行结果如下:

image-20231209161731557

从上述三轮测速报告中,我们可以得出如下结论:

  1. 在双工模式下,网络带宽基本是对半分配了
  2. 上传和下载速率加在一起等入总带宽

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一样,由标准输入输出文件输入数据。 

这篇关于使用 iperf 和 iftop 测试网络带宽的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/477781

相关文章

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件