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.pswp.cn/news/212517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212517.shtml
英文地址,請注明出處:http://en.pswp.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