中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

開源 Levin中數據加載的示例分析

發布時間:2021-09-10 13:54:13 來源:億速云 閱讀:157 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關開源 Levin:數據閃電加載方案,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

互聯網某些業務場景下,我們常會遇到這種情況:服務啟動需要加載大量數據到內存,數據規模達數十G,數據更新頻率較低(天級、小時級、分鐘級),使用方式為靜態查詢。如業務訂單數據、線下挖掘的策略規則,地圖路網數據等。而在線服務基于穩定性考慮通常至少加載雙版本數據,服務啟動通常需要數分鐘之久。暴露的問題包括服務上線曠日持久,人力成本高;需求排隊無法快速迭代,時間成本高;回滾速度慢,由于要加載大量數據故障實例無法快速恢復造成穩定性隱患。

Levin是針對上述低頻更新、靜態使用、大規模數據的快速加載方案,高效托管大規模靜態數據,加速大內存服務冷啟動和熱加載。

1.原理

服務啟動唯快不破,但是在單純的服務變更場景中(比如上線、回滾、故障恢復)雖然并不涉及任何數據變更,服務進程重啟導致堆和棧內存數據都會隨之消亡,啟動后需要重新加載數據。那么數據能不能在進程間傳遞復用呢?最高效的進程間數據傳遞方式就是共享內存,共享內存可以突破進程生命周期實現跨進程重用,并且具有內存對象訪問效率和充足的可用地址空間(下圖Memory Mapping Area),魚(啟動速度)與熊掌(查詢效率)可以兼得。

Levin1.jpg開源 Levin中數據加載的示例分析

再考慮數據更新場景,通常指數據版本切換,此時磁盤數據讀取在所難免,那么從數十G的數據文件到內存數據對象(通常為STL容器),是否存在更高效的轉換方式?思考如果直接離線編譯出數據對象內存布局寫入二進制文件,在線服務啟動時進行一次性共享內存分配和IO讀取,可以進一步提高加載效率。

在確定了使用共享內存和容器數據離線編譯之后,關鍵的問題來了,如何將容器放入共享內存?最大的障礙是指針和容器內存不連續性。Levin的武器是降維:容器對象內存布局一維化,在一維世界中只需首地址加長度就可以表達、讀取和復制整個容器對象。由于同一塊共享內存會映射到不同進程的不同虛擬地址,使用偏移量代替容器中的指針,實現地址無關的容器。

我們也對造好的輪子(Boost interprocess容器)進行調研,發現其基線測試性能表現不佳:最常用的vector/hashmap查詢效率較標準容器慢10%~20%左右。最終Levin選擇了自定義共享內存容器,并在數據靜態使用方式的前提下做了一系列優化,具備簡單易用、效率高、性能好、內存省的優點。并實現了工程化應用落地不可或缺的功能:如共享容器內存校驗、版本管理。

2.功能與特性

▍STL-like共享內存容器

支持托管在共享內存片段上的容器,包括常用容器vector、set、map、hashset、hashmap等。并支持使用適配、組合、特化等手段自定義共享內存容器。 基線測試表明Levin容器查詢性能較標準容器有所提升,內存使用效率優勢明顯(詳見benchmark)

Levin2.jpg開源 Levin中數據加載的示例分析

▍離線數據編譯

高效使用數據是在線服務的目標,數據規范化是構建復雜系統的前提。 很多以數據為核心的系統都會將數據流程劃分為離線編譯和在線加載,其中離線數據編譯是數據高效轉換的重要一環,利用離線單節點把數據轉換為可以方便使用的格式,省掉在線服務多節點重復的轉換和構建工作。 Levin支持離線數據編譯功能,將原始數據編譯為進程可直接讀入的共享容器對象內存布局二進制文件,為在線服務提供更加高效的數據服務。

▍在線數據加載

加載離線階段編譯產出的數據文件至命名共享內存區域,支持共享容器對象申請、校驗、加載、釋放。 Levin在線數據加載進行一次性共享內存分配和讀取,省掉構建過程大量brk/mmap內存分配系統調用,減少IO次數,為在線服務數據加載進一步提速。下圖是以上介紹的數據使用流程,推薦這種方式。

Levin3.jpg開源 Levin中數據加載的示例分析

▍管理模塊

用戶大量使用共享容器時,共享容器使用情況全景不透明,逐個釋放容易遺漏,服務出現異常等情況下會導致無用數據駐留內存空間,浪費節點內存資源。 Levin提供管理模塊,支持共享容器以集合(group)的方式進行管理,相同生命周期的共享容器可交由同一管理模塊實例托管,進行統一的創建、加載,釋放。管理模塊還支持共享容器全局搜索功能。支持安全釋放、清理功能,避免容器數據異常銷毀或無用容器駐留系統。支持可定制的數據文件校驗方式,降低文件校驗耗時。

▍版本切換

使用Levin管理模塊對同版本容器數據進行group管理,卸載特定版本時可安全、統一釋放相應的共享容器集合,完美支撐用戶數據版本熱切換需求實現。

3.內部實踐

Levin內部應用實踐效果:落地服務冷啟動和熱加載耗時均由分鐘級降至秒級。內存用量方面優化明顯,Levin容器靜態數據轉而由共享內存托管,與服務session動態數據分離。觀察數據版本切換場景,磁盤IO次數大幅降低,切換導致的cpu抖動也明顯緩解。以上,本文開頭提到的人力、時間成本浪費和穩定性隱患問題迎刃而解。

關于開源 Levin:數據閃電加載方案就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太原市| 柳州市| 富锦市| 靖州| 紫金县| 灵宝市| 临颍县| 巴东县| 赫章县| 天祝| 庆城县| 盐津县| 铜梁县| 马鞍山市| 于田县| 濮阳县| 阿尔山市| 泌阳县| 万荣县| 郧西县| 平山县| 雅江县| 彭州市| 临漳县| 四会市| 正安县| 西宁市| 阿合奇县| 新闻| 泾阳县| 合作市| 通州区| 贡觉县| 涟源市| 泰州市| 万全县| 铁岭县| 政和县| 永州市| 彰武县| 简阳市|