《陳明煜-2023RustChinaConf.pptx》由會員分享,可在線閱讀,更多相關《陳明煜-2023RustChinaConf.pptx(25頁珍藏版)》請在三個皮匠報告上搜索。
1、第三屆中國第三屆中國Rust開發者大會開發者大會RustRust異步并發框架在移動端的應用異步并發框架在移動端的應用陳明煜華為 公共開發部 嵌入式軟件能力中心本科就讀加州大學圣地亞哥分校,畢業時長兩年半,Rustacean在華為目前正在使用 Rust 開發并行調度框架等模塊。Rust異步并發框架在移動端的應用陳明煜華為 公共開發部 嵌入式軟件能力中心Applications of Rust Runtime in MobileOverview of asynchronous Rust#1 1 RustRust異步簡介異步簡介Ylong async runtime#3 3 Ylong Ylong
2、RuntimeRuntime并發框架并發框架目錄Table of Contents#2 2 社區并發框架社區并發框架介紹介紹以及以及與移動端的不適配性與移動端的不適配性Introduction to third party Runtime crates and their incompatibility with mobile environmentRust異步機制Asynchronous Rust異步并發框架是許多大型應用、系統具備的底層能力。異步并發框架是許多大型應用、系統具備的底層能力。區別于多線程編程模型,它帶來以下優勢:n任務調度顆粒度更小,充分利用線程資源n更可控的線程數n單個任務
3、資源占用:幾十KB-幾百Byten任務切換時間:10微秒-100納秒Rust語言并沒有提供異步并發框架,只提供異步所需的基本特性:nFuturenasync/awaitnWakerasyncasyncFutureFutureWakerWakerpollpollSyntax sugarwakeawaitRust異步機制Asynchronous RustRust異步機制Asynchronous RustWakerTaskFuturetaskQueuewakeWorkerFuture.poll()Reactorfdfdlistenlistenfind現有并發框架Third Party Runtime
4、目前Rust社區最廣泛使用的事件驅動型調度框架,擅長處理大量異步IO的場景。具有非常強大的生態。tokiotokio第一個適配Rust async/await原語的運行時庫,與tokio類似支持異步IO,目前已經半廢棄async-stdasync-std更輕量化的調度框架,功能被拆分到其他多個庫中,IO密集場景性能不如TokiosmolsmolRayon并非異步運行時。它通過同步多線程模型提供了并行迭代器功能,適用于處理CPU密集型計算任務rayonrayon現有框架無法完美適配移動端(一)CoreThreadThreadWorkerWorkertasktaskLocal queueLocal
5、 queueTokio采用了如右圖這種GMP模式:一核可以綁定多線程,每個線程擁有一個Worker,每個Worker擁有一個任務隊列 但線程擁有相同優先級 Worker只持有一個本地FIFO隊列移動端訴求:優先級 任務區分優先級:UI顯示 vs 后臺下載 大小核調度Incompatibility of the third party Runtime with Mobile現有框架無法完美適配移動端(二)移動端訴求:易用性IO密集性任務與CPU密集型任務融合異步并發框架如tokio大多用于處理大量異步IO場景,而CPU密集型任務一般使用rayon。當前單框架提供的接口無法使用戶在一個任務中同時處
6、理IO任務以及CPU任務。Incompatibility of the third party Runtime with Mobile現有框架無法完美適配移動端(二)Incompatibility of the third party Runtime with Mobilespawn_blocking調度模式spawn調度模式ThreadWorkertaskLocal queueThreadThreadtaskGlobal queuetaskNew taskGlobal queueNew tasktake&runtake&runWorkertake&runSteal&run兩種接口擁有兩套割裂
7、的調度模式和線程池華為華為YlongYlong異步并發框架異步并發框架Ylong Ylong RuntimeRuntime并發并發框架框架華為Rust異步并發框架,近期計劃在OpenHarmony上開源。與Tokio類似,同樣為事件驅動型調度框架,提供異步IO、定時器、同步原語等功能。但額外提供:n任務優先級調度n異步并行迭代器n結構化并發Ylong RuntimeYlong Runtime對外接口APP/SA調度器提交任務AsyncfunctionCPU TaskCPU TaskIO TaskIO TaskExecutor高中低線程池Reactorepollfd1fd2.結構化并發優先級de
8、adlineAsyncSyncAsyncIOAsyncTimerParallelCalc事件到達注冊事件任務優先級調度Task priority and quality of service任務優先級調度Linux CFS調度:線程優先級 設置線程的Nice值給予線程不同的權重2個線程A和B。A的權重是1024,B的權重是2048。那么A獲得CPU的時間比例是1024/(1024+2048)=33.3%Task priority and quality of service任務優先級調度對框架內的工作線程設置優先級,使其擁有不同權重。由Kernel決定調度時間高優先級任務由高權重線程調度,以此
9、獲得更多執行時間全局隊列區分高低優先級Task priority and quality of service高權重線程低權重線程task.task.Global queuetaskLocal queuetaskLocal queueCore高權重線程WorkerWorker任務優先級調度根據工作線程的優先級進行綁核(大小核)高優先級任務在大核執行,高性能低優先級任務在小核執行,節省能耗Task priority and quality of serviceBig CoreLittle Core高優先級線程低優先級線程普通優先級線程Set core-affinityIO&CPU融合北北向接口融
10、合:向接口融合:異步并行迭代異步并行迭代器器n將Rayon并行迭代器異步化n可以對Rust常規數據容器生成并行迭代器,對容器內的數據進行異步并行的操作Fusion of IO/CPU intensiveIO&CPU融合Fusion of IO/CPU intensiveIO&CPU融合Fusion of IO/CPU intensive南向調度融合:南向調度融合:異步并行迭代器異步并行迭代器n將數據容器內的數據進行遞歸二分,對左半和右半分別生成一個異步任務。最終對單個數據執行用戶業務邏輯IO&CPU融合南向調度融合南向調度融合nIO&CPU通過設置不同優先級,進入不同線程池調度n線程池根據負載
11、監控(任務平均等待時間等數據)進行線程池動態擴縮容。n任務竊取Fusion of IO/CPU intensive結構化并發Structured Concurrency 核心在于通過一種父子結構化的方法實現并發程序,用具有明確入口點和出口點的控制流結構來封裝并發任務(可以是線程也可以是協程)的執行,確保所有派生任務在出口之前完成。Structured concurrency結構化并發帶來的好處:n更高的易用性,用戶不再需要顯示調用awaitn提高程序的可讀性和可維護性n保證了變量生命周期合法,使子任務可以捕獲父任務的變量結構化并發Structured concurrencyScopenRust
12、線程中的結構化并發n阻塞等待所有Scope內的子線程任務完成n子線程執行的閉包中可以捕獲Scope外的變量AsyncScopen將std庫中thread scope的思想異步化n在同步環境阻塞等待子異步任務完成,在異步環境異步等待子異步任務完成n優先級繼承:子任務默認繼承父任務優先級,也可使用detached模式指定其他優先級n任務取消:取消父任務,也將取消所有子任務性能Performance耗時(單位 us)Tokioylong耗時比/tokio IO 低并發,低傳輸 40,27949,0181.217 IO 低并發,高傳輸54,91447,5940.867 IO 高并發,高傳輸541,731473,0610.873 IO 高并發,低傳輸 414,479209,7140.506CPU 低任務,低負載45,02339,7140.882CPU 低任務,高負載9,898,0759,859,0610.996CPU 高任務,低負載138,809155,1881.118CPU 高任務,高負載77,865,24476,335,5070.980Thank you!