使用 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

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意