使用 iperf 和 iftop 测试网络带宽

news2025/1/25 7:04:25
《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名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一样,由标准输入输出文件输入数据。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# WPF上位机开发(串口界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果只是把上位机看成是纯软件开发&#xff0c;本身不和硬件打交道的话&#xff0c;那么这就把上位机的操作范围给限定死了。事实上&#xff0c;上…

Java基础-JDK的组成

目录 1. JDK的组成2.Java的跨平台、工作原理 1. JDK的组成 JVM&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方核心类库&#xff1a;Java自己写好的程序&#xff0c;给程序员自己的程序调用的JRE&#xff1a;Java的运行环境JDK&#xff1a;Java开发工具包 JDK是由J…

LinuxBasicsForHackers笔记 -- 文件系统和存储设备管理

设备目录/dev Linux 有一个特殊的目录&#xff0c;其中包含代表每个连接设备的文件&#xff1a;相应命名的 /dev 目录。 /dev中有很多设备列表。 特别令人感兴趣的是设备 sda1、sda2、sda3、sdb 和 sdb1&#xff0c;它们通常是硬盘驱动器及其分区以及 USB 闪存驱动器及其分区…

嵌入式设备OTA升级的大致过程!

OTA概述 大家好&#xff0c;我是一个软件升级包。这几天呢&#xff0c;我将会进行一次神奇的网络之旅&#xff0c;从开发者的电脑中&#xff0c;一直跑到终端嵌入式设备中。 大家都把我的这个旅游过程叫做 OTA&#xff0c;也就是在线升级。 那么啥叫 OTA 呢&#xff1f;全称…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

KUKA机器人在编程时添加需要等待的输入信号的2种方法

KUKA机器人在编程时添加需要等待的输入信号的2种方法 第一种方法:手动输入法 如下图所示,选中某个程序后,点击下方的“打开”, 如下图所示,将光标定位到所需位置,然后按下左上角的“编辑”按钮,此时示教器上会弹出输入键盘, 如下图所示,在键盘上手动输入语句:wait fo…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#xff0c;目前市面上一些主流的内网穿透工具有&#xff1a;Ngrok&#xff0c;Natapp&…

西南科技大学C++程序设计实验十二(文件流操作)

一、实验目的 1. 熟悉文件的基本操作; 2. 在类中添加打开文件、保存文件、读取文件等处理函数; 二、实验任务 1. 分析完善程序:主函数创建一个文件对象,每次打开文件,在其尾部添加数据。如果文件不存在,则新建该文件。请将空白处需要完善的功能补充完整。 #include …

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台&#xff0c;但是由于还没有拿到EVT。所以&#xff0c;就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后&#xff0c;充满剩余时间异常的问题。 问题描述&#xff0c;在充电过程中&#xff0c;显示充满时间为“0 min left unt…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下&#xff1a;【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试&#xff0c;使用该类的实例执行关闭server时&#xff0c;并没有释放端口号&#xff0c;会导致第二次启动时失败。另外&#xff0c;使用该…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error&#xff01;新建messages_zh_CN.properties文件 user.login.error帐户或密码错误&#xff01;2. 新建LocaleConfig.java文件 Configurati…

geolife笔记:整理处理单条轨迹

以 数据集笔记 geolife &#xff08;操作篇&#xff09;_geolife数据集-CSDN博客 轨迹为例 1 读取数据 import pandas as pd data pd.read_csv(Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt,headerNone, skiprows6,names[Latitude, Longitude, Not_Im…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

如何提高Pycharm的使用体验?

汉化 文件---设置---插件---chinese---安装---重启ide 代码补全 tabnine 文件---设置---插件---tabnine---安装---重启ide 重启ide后生效&#xff0c;补全效果如下 自定义背景 文件---设置---外观---背景图像---选择图片---调整透明度保存即可 设置头部声明 英文版…

JVM学习笔记-如何在IDEA打印JVM的GC日志信息

若要在Idea上打印JVM相应GC日志&#xff0c;其实只需在Run/Debug Configurations上进行设置即可。 拿《深入Java虚拟机》书中的3-7代码例子来演示&#xff0c;如 1 public class JvmTest {2 private static final int _1MB1024*1024;3 public static void main(String…

理解基于 Hadoop 生态的大数据技术架构

转眼间&#xff0c;一年又悄然而逝&#xff0c;时光荏苒&#xff0c;岁月如梭。当回首这段光阴&#xff0c;不禁感叹时间的匆匆&#xff0c;仿佛只是一个眨眼的瞬间&#xff0c;一年的旅程已成为过去&#xff0c;而如今又到了画饼的时刻了 &#xff01; 基于 Hadoop 生态的大数…

快速认识什么是:Docker

Docker&#xff0c;一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢&#xff1f;今天就来一起学快速入门一下Docker吧&#xff01;希望本文对您有所帮助。 假设您使用 Cobol 构建了一个在某种奇怪风格的 Linux 上运行的应用程序。您…

Spring Boot Async:从入门到精通,原理详解与最佳实践

Spring Boot 的异步功能&#xff08;Async&#xff09;允许我们将某些任务异步执行&#xff0c;而不会阻塞主线程。这对于处理耗时的操作非常有用&#xff0c;如发送电子邮件、生成报表、调用外部 API 等。通过异步处理&#xff0c;我们可以释放主线程&#xff0c;让它继续处理…