Fcopy: 基于Coke实现内网大文件分发

在工作中,我曾与小伙伴讨论过这样一个实际问题:数据制作流程产生了一份需要上线的文件,而线上有数十台甚至上百台机器,有什么朴素的办法以尽可能快的速度将文件分发到指定的机器上吗?根据作者已有的知识,分享一个内网大文件分发的想法。本文未讨论组播/广播等方法,因为作者还不会😅。

定义内网、大文件、朴素

本文中提到的内网为网络延迟基本在毫秒级、基本不丢包、传输基本不出错的网络环境。本文提到的朴素办法可以认为是依托现有条件,以无需额外增加硬件、也无需过多维护开销为前提的办法。本文提到的大文件约为1G-1T的文件,小文件直接传输也可朴素地快速完成,超大文件估计需要硬件支持。

  1. 小文件(1M以内): 写个简单循环,逐个向目标机器发送即可
  2. 中等文件(1M-1G): 一般可以搭建文件服务器,目标机器并发地从文件服务器拉取文件
  3. 大文件(1G-1T): 本文讨论的方法
  4. 超大文件(1T以上): 或许应当求助于技术部门协助解决

一对一文件复制

目前常见的企业级固态硬盘顺序读写速度一般能达到3-5GB/s,为了能快速读取和写入文件,可以将文件按固定大小(比如4MB)分块,并采用并行/并发的方式进一步提高吞吐率。通常来说,读写文件的开销不会达到CPU性能瓶颈,所以要么磁盘IO被打满,要么网卡被打满,传输速度一般可以达到极致。如果有高性能硬件支持,还可以考虑RDMA等技术,但如果使用频率不高,这样做的性价比估计会很低。

链式传输

即使一对一复制可以使传输速度达到极限,但逐个分发的总时长还是会随着目标机器数量的增加而线性增加,而实际需求是所有数据都就绪后才能继续操作,还有什么办法提速吗?

在一对一复制过程中,发送方确实已经很卖力地读取并发送数据了,它的出口带宽也无法支撑同时向几十个目标机器发送数据。但接收方的出口带宽是闲置的,如果由接收方负责将数据继续分发下去,最终形成一条传输链,就可以将所有硬件资源全部利用起来了。示意图如下,其中M0为数据源,M1 ~ Mn为目标机器。

fcopy-chain

树型传输

如果仅有几十台机器,链式传输基本可以达到令人满意的效果了,但如果机器数量更多呢?由于作者没有机器做测试,所以这里只能做一些思想实验。考虑一个足够长但粗细不一的水管,要想将水送的足够远,水源就要不断地增加压力,远离水源的水管有一点波动,压力就会传导到其前面的每个位置(类似水锤效应),所以这样做估计不行。

如果可以让渡一些传输速度,将传输链换成传输树,则最大传输长度就会大大降低,对于数千台机器的集群也可以在十几层内解决了。示意图如下

fcopy-tree

这种情况下,最大传输速度受限于出带宽的一半,但我们并未限制只能有一棵传输树😏,将每个叶结点和内部结点交换,可以再构成一棵传输树,还是能把带宽都跑满。

速度控制

一般来说,整个机房的网络设备会被多个业务共享,一个业务传输数据占用大量带宽是不礼貌的。一个优秀的工具既应该在需要时跑到慢速,也应该具备整体限速的功能。在上述想法中,由于数据发送源只有一个,很容易控制整体传输速度,而如果考虑p2p文件共享的思路,在整体限速功能上需要花费一定的精力。

具体实现

上面包了这么多饺子,实际上就是为了尝尝作者自己做的醋好不好吃。作者在fcopy项目中实现了上述想法的大部分功能,fcopy依赖于coke,而coke是C++ Workflow的C++ 20协程版本,所以该项目的主要目的是证明相比于直接使用C++ Workflow

  1. 使用coke封装后不会对性能有太大影响
  2. 使用coke可以让代码量更少,也无需到处传递上下文信息
  3. 使用coke时,函数不会因需要异步回调而截断,而是在合理的流程处自然分段

结语

有了这些办法,您每次上线的时间从3小时缩短到了5分钟,可以早点下班回家,陪妻子或丈夫吃了晚饭、给孩子辅导完功课、给父母和岳父母打了电话,发现还有半个小时的时间可以利用,您打开了coke,提出了一个富有建设性的issue、发起了一个极具创造性的PR、点了一个具有历史意义的Star,帮助了更多的人可以更好地工作和生活,这是多美好的一件事呀。

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

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

相关文章

普冉(PUYA)单片机开发笔记(5): 配置定时器PWM输出

概述 定时器的输出通道作为 PWM 驱动是 MCU 的常用功能。 PY32F003 有一个高级定时器 TIM1 和一个通用定时器 TIM3,这两个定时器都可以驱动4个输出通道。现在我们就利用 TIM1 的某一个通道实现可控占空比的 PWM 输出。 原理简介 看数据手册,简单摘录…

DM8/达梦 数据库管理员使用手册详解

1.1DM客户端存放位置 Windows:DM数据库安装目录中tool文件夹和bin文件夹中。 Linux:DM数据库安装目录中tool目录和bin目录中。 1.2DM数据库配置助手 1.2.1Windows创建数据库 打开数据库配置助手dbca 点击创建数据库实例 选择一般用途 浏览选择数据库…

图中的最长环

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是处于什么原因,算法学习需要持续保持,今天让我们一起来看看这一道题目————图中的最长环,图论题目中比较常见的环路…

C语言笔试例题_指针专练30题(附答案解析)

C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在,是掌握C语言的必经之路,收集30道C语言指针题目分享给大家,测试环境位64位ubuntu18.04环境,如有错误,恳请指出,文明讨论!&am…

基于SSM+JSP网上订餐管理系统(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

蓝桥杯2021年5月青少组Python程序设计国赛真题

30 个人在一条船上,超载,需要 15 人下船于是人们排成一队,排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15 人为止,问都有哪些编号的人下船了呢? 2】判断101-200之间有多少个素数,并输出所有素数…

Leetcode每日一题

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 这道题目需要我们自行进行创建一个数组,题目也给出我们需要自己malloc一个数组来存放,这样能达到我们遍历的效果,我们来看看他的接口函数给的是什么。 可以看到的是这个接口函…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本课目标(Objective) 掌握CSS三大特性理解什么是盒子模型掌握内边距padding的用法掌握外边距margin的用法 1. CSS的层叠,继承,优先级 1.1 CSS层叠 层叠:是指多个CSS样式叠加到同一个元…

Web(8)SQL注入

Web网站(对外门户) 原理:not>and>or(优先级) 一.低级注入 order by的作用是对字段进行排序,如order by 5,根据第五个字段 进行排序,如果一共有4个字段,输入order by 5系统就会报错不 …

详细介绍开源固件-TF-A

什么是TF-A? TF-A(Trusted Firmware-A)是一种用于嵌入式系统的开源固件,而不是Linux的一部分。TF-A主要用于ARM架构的处理器和设备,它提供了一组安全和可信任的软件组件,用于引导和初始化系统。 如下是其…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中,可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元,当合理地划分任务并正确地执行时,这…

qt可以详细写的项目或技术

1.QT 图形视图框架 2.QT 模型视图结构 3.QT列表显示大量信息 4.QT播放器 5.QT 编解码 6.QT opencv

Bypass open_basedir

讲解 open_basedir是php.ini中的一个配置选项,可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…

洛谷 P8674 [蓝桥杯 2018 国 B] 调手表

文章目录 [蓝桥杯 2018 国 B] 调手表题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题意解析CODE分析一下复杂度 [蓝桥杯 2018 国 B] 调手表 题目描述 小明买了块高端大气上档次的电子手表,他正准备调时间呢。 在 M78 星云,时间的计量…

JVM虚拟机:命令行查看JVM垃圾回收器的执行信息

在eclipse中打开命令行窗口 window->show view->Terminal 这样就打开了Terminal窗口,效果如下所示: java -XX:PrintCommandLineFlags -version 这个命令可以查看一些配置信息,其中最重要的配置信息就是,当前使用的G1回收器…

键盘打字盲打练习系列之成为大师——5

一.欢迎来到我的酒馆 盲打,成为大师! 目录 一.欢迎来到我的酒馆二.关于盲打你需要知道三.值得收藏的练习打字网站 二.关于盲打你需要知道 盲打系列教程,终于写到终章了。。。一开始在看网上视频,看到up主熟练的打字技巧&#xff…

LabVIEW与Tektronix示波器实现电源测试自动化

LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域,自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器,开发一个自动化测试项目。该项目旨在自动…

MYSQL练题笔记-高级查询和连接-指定日期的产品价格

这依旧是中等题,想了好久,终于理解了很开心! 一、题目相关内容 1)相关的表和题目 2)帮助理解题目的示例,提供返回结果的格式 二、自己初步的理解 题目是找出2019-08-16 时全部产品的价格,所以…

使用最小花费爬楼梯

1.状态表示 2.状态转移方程 3.初始化 保证填表时, 不越界 4.填表顺序 从左往右 5.返回值 解法2: 1.状态表示 2.状态转移方程 3.初始化 4.填表 从右往左 5.返回值 min( dp[0] , dp[1] ) ----------------------------------------------------…

java+springboot+ssm学生社团管理系统76c2e

本系统包括前台和后台两个部分。前台主要是展示社团列表、社团风采、社团活动、新闻列表等,前台登录后进入个人中心,在个人中心能申请加入社团、查看参加的社团活动等;后台为管理员与社团负责人使用,应用于对社团的管理及内容发布…