量变引起质变。

项目需求

由于我们现在开发的云平台项目是一个跨云调度的重型计算平台,所以会用到不同的云服务厂商的计算实例服务器,比如阿里云的ECS、亚马逊的EC2或者谷歌云的compute engine等,同时也会在这些计算实例之间进行数据传输。 这些服务器之间的传输速度通常是不同的,即使是同一个云服务厂商内的不同区域服务器之间传输数据,带宽也会有所不同。 所以需要对这些服务器之间的带宽速度进行测量,以供调度进程分配任务和传输数据。 总结起来这个功能实现起来有3个要求:

  1. 对不同区域内的云服务器的TCP/UDP传输速度进行检测。
  2. 必须是满带宽的测速,也就是说两台服务器在测速的时候不能有其它网络程序运行。
  3. 多台服务器之间需要高效地建立两两连接。

针对这3个问题,我实行了以下解决方案。

基本结构

一种简单的设想就是启动测速所需的客户端和服务端,让这些程序之间互相争抢进行测速。

但是这种方式在进程的管理上很容易出现问题,因为每个进程既要操作自己的状态还需要操作其它进程的状态,同时一下子起4个进程也比较浪费,因为事实上每次测速只会有一个进程工作。 所以更好的方式是用主从结构,由一个主进程来启停负责测速的客户/服务端子进程。

这样不但能有效地避免资源的浪费和争抢,同时主进程中也可以集成很多逻辑功能,比如对外提供 REST API,记录日志、备份测试结果等。

当然为了方便部署和程序控制,所有的进程都是部署在 Docker 容器中。

由于主进程需要访问宿主机的 Docker 服务,所以需要开启 Docker 的 remote API 服务,对容器提供REST API进行操作。

功能实现

基本测速

TCP与UDP

网络协议是一层一层封装起来的,而TCP和UDP属于同一层的两种协议。 其中TCP协议在前后端开发中非常常用,因为REST API请求依赖的HTTP(S)协议就是TCP的上层协议,而UDP协议在视频、游戏、下载等业务中使用也非常多。 它们有一些共同点:请求的发起方称为客户端,请求的接收方称为服务端,服务端和客户端可以双向通信。 而它们的侧重点有所区别。TCP更注重稳定,客户端和服务端之间需要建立连接之后才能互相发送数据。 UDP则更注重速度,客户端不需要和服务端建立连接即可直接发送数据,但是如果发送速度太快或者网络不稳定可能会造成丢包,导致对方接收的数据部分丢失。

测速工具

常用的命令行测速工具有iperf和speedtest,相较之下选择了功能更强大的iperf。 iperf是一个比较理想的测速工具,支持TCP、UDP协议,还可以通过参数来制定传输数据大小、传输次数或者传输时间,以及输出结果的格式。 但是由于前面UDP协议的特性,测速会略微麻烦一些,需要找到合适的带宽。 比如按照1Gbps的速度发送数据,丢包率是70%和按照10Mbps的速度发送数据,丢包率是0,那么对数据完整性有要求的话肯定更偏向于后者。 当然实际情况并不是对于丢包率为0就是最好的,而是在可容忍的范围内采用最大速度传输(数据丢了还可以重传不是~)。 这就意味着需要根据实际网络状况不断调整和尝试。 而iperf并没有这么智能,所以UDP这一块采用团队内部开发的一款UDP传输工具,来找到理想的传输速度。

满带宽

要保证满带宽只需要保证测速时没有其它程序占用带宽即可。 由于我们可以启动一台独立的抢占式服务器来运行测速程序,所以其它非测速程序的进程不太可能占用带宽,而容易争抢带宽的是用来测速的子程序。 所以需要让子程序之间是互斥运行,甚至是互斥存在的。 采用状态管理基本上就可以实现,主程序在每次有进程启动的时候将状态置为"connecting",测速完成后置为"waiting",只有在"waiting"状态下才可以启动新的子程序进行测速。 但是这只是从代码逻辑层面控制,对于稳定健壮的程序而言,最好还有其它的硬性控制方式。 这时候使用容器的话就可以轻松办到。 凡是需要进行测速的进程都在容器中启动,同时容器的名称都统一,那么一旦程序出现bug,同时启动多个子程序时,Docke r服务则会报错,告知容器名称冲突,从而创建失败。 当然这种方式也有一定的风险,比如上一个进程测速过程中出现问题没有按时退出,那么则无法进行新的测速,所以需要需要设定一个超时时间,超过一段时间后主动停止当前测速子程序。 同时如果主程序意外退出,导致停止失败的话,也要进行处理:在每次启动主程序的时候进行检查,及时销毁未停止的子程序。

多节点

多节点算是非常棘手的问题。试想如果在一段时间内同时在多个云服务器上启动多个测速程序,如何保证他们有序的进行测速呢? 要解决这个问题,先思考一个简单些的问题: 在一段时间内,如何决定哪些云服务器启动服务端子程序哪些云服务器启动客户端子程序呢? 如果按照“主-从”模式的话需要建立一个中心节点来进行控制,但是这样的缺点很多,最重要的一个缺点是如果某个节点与中心节点无法通信那么就无法获得与其它节点通信的机会,及时它和其它节点之间网络畅通。 同时中心节点和其它节点之间也存在多节点通信的问题。 总而言之这种方式下通信的成本太高,服务端与客户端传输数据需要的中间环节太多,很容易出现问题。 所以简单的方式是让云服务器之间互相发起测速请求并响应。 这样的话,主程序的逻辑要分为两个模块,一个模块用来响应请求、、分配端口、启动服务端容器。 另一个用来轮询带测速队列并发起请求、启动客户端容器建立连接。

工作流程大致如下:

这种处理方式还有一种极端情况,就是两个云服务器之间互相请求进行测试,如果双方请求到达时间一致,那么就会同时给对方分配端口,然后同时受到对方分配的端口之后发现服务端已启动于是放弃连接。 于是出现了类似进程“死锁”的状态。 对于这种情况的处理方式是使用时间戳来记录请求发起的时刻,双方通过时间戳的先后来决定是否启动客户端或服务端。 即使更极端的情况出现——双方时间戳相同。那么通过超时回收或者发消息释放端口来建立下一次连接。

弱网络下的处理

弱网络指的是网络不稳定或者带宽较小的情况。 这种情况的处理方式原则上就是重测,但是关于重测有几个需要注意的地方:

  1. 对于带宽较小的情况需要考虑减小传输数据的体积以保证在制定的超时时间内完成测速。
  2. 对于测速失败的情况进行判断并重测,同时限定重测次数,避免无限重测。
  3. 重测时可以让客户端与服务端进行互换测试,通过限定一方发起重测可实现。

总结

很多时候实现一个功能并不困难,但是要把功能实现好却是一件不简单的事。 虽然理论上实现起来只是简单的调用测速工具就可以得到结果,但在实际场景下可用性会变得很低。 比如没有对弱网络的重测机制,那么偶然的网络抖动就会影响到测速结果。 如果没有考虑到多节点争抢连接的问题,那么实际运行在多个云服务器上可能会造成程序错误或测速结果不准确的问题。 要怎么样把功能实现好呢? 至少有两个考虑方向:

  • 倍数思维。比如当前框架支持10个页面没问题,那么如果100个、1000个会不会有性能问题?
  • 极限思维。就是一些极端情况下的处理机制,比如在本文中对超时的处理,对容器互斥的处理等。

原文链接:tech.gtxlab.com/test-speed.…


作者信息:朱德龙,人和未来高级前端工程师。

转载于:https://juejin.im/post/5ca1cab8f265da30b34090c3

多个跨云服务器之间满带宽测速的一种实现方案相关推荐

  1. 云服务器带宽测速那四种方法最常见

    服务器带宽测速的方法有下载测速.ping测试.第三方测速网站和路由追踪几种方法,服务器带宽网来详细说下服务器带宽测速方法: 服务器带宽测速 服务器可选传统IDC,也可以选择云服务器,如阿里云.腾讯云等 ...

  2. 阿里云服务器带宽测速四种方法

    服务器带宽测速的方法有下载测速.ping测试.第三方测速网站和路由追踪几种方法,服务器带宽网来详细说下服务器带宽测速方法: 服务器带宽测速 服务器可选传统IDC,也可以选择云服务器,如阿里云.腾讯云等 ...

  3. 国内云服务地域选择和测速

    国内云服务地域选择和测速 一.腾讯云服务器地域选择攻略 二.腾讯云服务器地域可用区选择考虑的几大因素: 因素一:地域影响访问速度 因素二:云服务器和其他产品内网互通 因素三:是否需要备案 因素四:业务 ...

  4. 云服务器网站搬家,云服务器之间的搬家

    云服务器之间的搬家 内容精选 换一换 如果您需要对您所拥有的ECS进行精细的权限管理,您可以使用统一身份认证服务(Identity and Access Management,简称IAM),通过IAM ...

  5. 云服务器带宽如何计算,云服务器怎么选择带宽

    原标题:云服务器怎么选择带宽 很多企业或站长在购买云服务器时,对带宽不是很了解.他们认为硬件配置高就行,访问速度就会快.其实访问快慢主要是带宽大小来决定,硬件主要是用来运算的,带宽是用来传输数据的.服 ...

  6. 腾讯云服务器公网6M带宽实际下载/上传速度详细解释

    腾讯云服务器6M公网带宽实际下载速度是多少?腾讯云服务器6M带宽下载峰值768KB/S,服务器带宽和实际下载速度是8倍关系,服务器带宽和对应的实际下载峰值速度之间的关系及计算方法: 一.腾讯云6M服务 ...

  7. 云服务器8M公网带宽下载速度分析

    云服务器8M公网带宽实际下载速度是多少?8M带宽下载速度峰值为1M/S,服务器带宽和实际下载速度是8倍的关系,本文分享服务器带宽和对应的实际下载峰值速度之间的关系及计算方法. 8M带宽的实际下载速度不 ...

  8. 云服务器之间传文件,云服务器之间传文件

    云服务器之间传文件 内容精选 换一换 云服务器创建后区域固定,不能将云服务器转移到另一个区域,也不能将云服务器转移到另一个帐号.您可以通过镜像迁移方式实现云服务器的跨帐号跨区域迁移.服务器迁移的常见场 ...

  9. 云服务器8M公网带宽实际下载/上传速度是多少?

    云服务器8M公网带宽实际下载速度是多少?8M带宽下载速度峰值为1M/S,服务器带宽和实际下载速度是8倍的关系,本文分享服务器带宽和对应的实际下载峰值速度之间的关系及计算方法. 8M带宽的实际下载速度不 ...

最新文章

  1. airpods固件更新方法_AirPods如何升级固件?AirPods更新固件方法教程
  2. 架构探险笔记7-事务管理简介
  3. 现代软件工程 第十六章 【IT 行业的创新】练习与讨论
  4. Python中os库的使用
  5. 浅入浅出Typescript Decorators
  6. oracle 自动表分析,其实 Oracle 直方图自动统计算法存在这些缺陷!
  7. ubuntu16.04卸载firefox,然后再次安装firefox
  8. 层层递进——宽度优先搜索(BFS)
  9. TcxButtonEditProperties取得TcxGridDBTableView
  10. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。...
  11. 【Spark Summit EU 2016】使用参数服务器在Spark上扩展因式分解机
  12. 复习HTTP状态码+301和302
  13. vs 2013远程调试
  14. 十分钟打造 3D 物理世界
  15. 实验三(无线局域网组成与管理实验)
  16. 【计算机网络】Linux系统连接吉林大学校园网
  17. springboot starter自定义实现公共模块
  18. CA65测试针对的是哪些产品呢
  19. 论文阅读笔记《Dynamic Few-Shot Visual Learning without Forgetting》
  20. MOGRT视频制作库 Premiere遮罩/转场/特效视频剪辑效果模板库预设

热门文章

  1. ssm+mybatis+mp
  2. cocos2d-js
  3. php上传图片(腾讯云对象存储)
  4. 常用的Latex格式(overleaf中使用)
  5. 【论文笔记】—毫米波雷达穿雾式高分辨率成像—Supervised—HawkEye系统—2020-CVPR
  6. PAT (Basic Level) Practise (中文)1062. 最简分数(20)
  7. 计算机控制技术实验装置,计算机控制技术实验指导书(PTO)
  8. 网络分析仪log mag的含义
  9. ERP中配额生单的简单了解
  10. 表格下划线怎么去掉html,怎么去掉这该死的下划线?_html/css_WEB-ITnose