专栏首页程序员小助手通信老鸟:你一直在用的网速测量方法,有可能打原理上就是错的!

通信老鸟:你一直在用的网速测量方法,有可能打原理上就是错的!

引言

有时需要测试网速,但是在开始使用文件传输工具来测量之前,请考虑一下,你实际测量的是什么

为了说明这一点,请假设一位数据库管理员DBA,他一直在使用千兆以太网适配器,在几个节点之间配置集群数据库。事情不太顺利,他自然而然怀疑是硬件出了问题。

所以他把你叫过去,告诉你使用sftp在节点之间移动文件时,传输速率与千兆以太网的传输速率极不匹配。

他自认为测量了网络吞吐量,但是他可能只是测量了远程系统磁盘的读写速率。因此,需要移除限制因素,即磁盘(可能还有sftp的加密开销)。

Netcat

为了消除磁盘内文件转移对测量的影响,我们将使用netcat。Netcat被称为一个“功能丰富的网络调试和探索工具”。它可以从网上获得,或者已经在你所使用的发行版里了。

 which nc
 /usr/bin/nc

为了测试,我们使用两台主机,一台用于监听连接,另一台用于连接和发送数据流。在每个测试中,我们将使用一个10秒的会话,并且我们将在三个速度不同的lan上进行。为了从测试中消除磁盘读写的消耗,输出文件将是/dev/null。

百兆带宽

在主机A(192.168.0.8),以普通用户身份启动netcat:

nc -v -v -l -n -p 2222 >/dev/null
listening on [any] 2222 ..

在主机B上,通过端口2222使用yes命令将数据发送到机器A,并使用netcat对会话进行计时。

time yes|nc -v -v -n 192.168.0.8 2222 >/dev/null
(UNKNOWN) [192.168.0.8] 2222 (?) open

在主机 A上注意到:

connect to [192.168.0.8] from (UNKNOWN) [192.168.0.4] 34111

10秒钟后,通过键入ctl-c停止,并记下所花的时间:

sent 87478272, rcvd 0

real 0m9.993s
user 0m2.075s
sys 0m0.939s

在主机A上,记下发送的数据(以字节为单位):

 sent 0, rcvd 87478392

现在将字节rcvd乘以8得到总位数,然后除以时间:结果是70MB/s。

千兆带宽

主机A执行:

nc -v -v -l -p 2222 >/dev/null
listening on [any] 2222 ...

主机B执行:

yes|nc cfms5-p 2222 >/dev/null
punt!

主机A显示:

connect to [192.168.1.5] from cfms6-p [192.168.1.6] 33855
sent 0, rcvd 1155325952

同上,计算结果是 0.9Gb/s。

最后,慢速的10M带宽

配置结果如上,省略若干步骤。

.
.
.
nc -v -v -l -p 80 > /dev/null
listening on [any] 80 ...
.
.
.
sent 0, rcvd 8437760

根据时长和接收字节数,计算结果是 6.7Mb/s。

写在最后

我们已经看到了一种使用netcat测试网速的简单方法。

至少可以表明,网速在一定程度上,与它们各自的局域网段速度一致。

那我们怎么解释,为什么达不到广告上标榜的速度呢?也许是主机上的网络驱动程序的效率不高,再加上处理器开销,拖慢了整体速度。

本文分享自微信公众号 - 程序员小助手(mql45ea),作者:罗卜生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 3分钟短文 | PHP判断null,别再 == 了,你真控制不住

    PHP 程序中很多地方会用到判断是否为空,比如字符串为空,数组为空,对象为空,或者其他数据类型为默认空值。

    程序员小助手
  • 3分钟短文 | PHP位运算和逻辑运算,一个符号写两遍这么简单?

    我们经常在程序流程中进行逻辑判断,与或非,用的是炉火纯青,相信你也不少用。那么在PHP中,有两个操作符非常接近,就是 | 和 ||,那么他们有什么区别呢?

    程序员小助手
  • Linux炫技:左手密码生成器,解放右手生产力!

    Linux的一大优点是,你可以用数百种不同的方式,达到相同的目的。甚至可以使用几十种不同的命令,完成生成随机密码这样简单的操作。

    程序员小助手
  • 手撕Rtmp协议细节(6)——connect后续三剑客

    在讲解connect消息的时候,我们说过服务器收到connect消息之后,会向客户端发送Window Acknowledgement Size消息和Set Pe...

    视界音你而不同
  • 如何Vue-cli开始使用在Vue.js项目中启动TDD(测试驱动开发)

    通常,使用测试驱动开发(TDD)最困难的部分是开始。你必须下载带有奇怪依赖项的软件包,让测试套件与你的构建系统协同工作,然后你必须弄清楚如何编写一个测试!难怪这...

    笔阁
  • python3实现excel里面读数据进

    py3study
  • 微商城流程

    订单模块 订单审核:订单审核,订单合并,订单拆分,批量设快递,历史订单,导出订单

    达达前端
  • 764. Largest Plus Sign

    思路: 动态规划,分别记录4个方向上的最大连续1的个数。比如”1001111”, 每个位置出现的最大连续1的个数分别为:”1001234”,有了4个方向的最...

    用户1147447
  • 四种比特币硬件钱包实现源码资源

    数字货币代表着一种趋势,不仅仅在金融领域,其背后的区块链技术未来一定会在社会发展中的其他领域深刻的改变着这个世界! 和在现实生活中一样,必须保护好自己的钱包。使...

    安智客
  • 纠结才能写出好代码

    程序员的代码修炼应该有两个目标,一个是代码的执行效率,另一个是代码的可读性。朝着这两个目标努力的人很多,但是能够达到目标的人很少。

    技术小黑屋

扫码关注云+社区

领取腾讯云代金券