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 输出。 原理简介 看数据手册,简单摘录…

激活函数数学详解以及应用场景解释

文章目录 激活函数1. Sigmoid 激活函数例子及推导过程代码 2. ReLU 激活函数例子及推导过程 3. Tanh 激活函数例子及推导过程代码 4. Softmax 激活函数例子及推导过程代码 CNN 中的卷积层工作原理卷积计算过程卷积后的输出及 ReLU 应用 激活函数 激活函数在神经网络中扮演着至…

IPSec 协议

在 TCP/IP 协议中,对 IP 数据包没有提供任何安全保护,攻击者可以通过网络嗅探、 IP 欺骗、连接截获等方法来攻击正常的 TCP/IP 通信。因此,通信过程中会存在以下危险:数据并非来自合法的发送者、数据在传输过程中被非法篡改、信息…

前端知识(十七)——入口函数和特定函数的区别

入口函数和特定函数是编程中常见的两种函数类型,它们在功能和使用场景上有所不同。下面我将通过Python代码示例来解释它们的区别。 1.入口函数:入口函数通常是一个程序或模块的起始点,它负责接收用户输入或外部数据,并启动程序的…

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

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

图中的最长环

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

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock项目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文网 (vitejs.cn) vite.config.ts import { defineConfig } from vite …

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

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

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

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

Flask笔记三之连接使用数据库

本文首发于公众号:Hunter后端 原文链接:Flask笔记三之连接使用数据库 这一节介绍 Flask 与数据库的连接,以及接口里查询数据的操作。 这里使用的是 SQLAlchemy pymysql 实现与数据库的连接,SQLAlchemy 的详细介绍见之前的笔记有…

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

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

Maven上传Jar到Nexus远程仓库的两种方式

Maven上传Jar到Nexus远程仓库的两种方式 文章目录 前言通过mvn clean deploy指令上传第一步 配置maven的setting.xml文件第二步 配置pom文件第三步 执行打包指令 手动上传 jar到远程仓库第一步 配置setting文件第二步 执行上传命令 前言 各个公司在开发项目时,一般…

Linux C/C++并发编程实战(8)CAS机制的ABA问题

文章目录 无锁队列中的ABA问题ABA问题解决方案 ABA问题:CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题,最开始的值是A,接着变成B,最后又变成了A。经过检查这个值确实没有修…

Leetcode每日一题

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

说说webpack中常见的loader?解决了什么问题?

在Webpack中,Loader是用于处理各种文件类型的模块加载器,它们用于对文件进行转换、处理和加载。常见的Loader解决了以下问题: 处理 JavaScript 文件:Babel Loader用于将最新的JavaScript语法转译为浏览器兼容的版本,以…

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