溫馨提示×

溫馨提示×

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

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

開源 Levin中數(shù)據(jù)加載的示例分析

發(fā)布時(shí)間:2021-09-10 13:54:13 來源:億速云 閱讀:155 作者:柒染 欄目:大數(shù)據(jù)

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

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

Levin是針對上述低頻更新、靜態(tài)使用、大規(guī)模數(shù)據(jù)的快速加載方案,高效托管大規(guī)模靜態(tài)數(shù)據(jù),加速大內(nèi)存服務(wù)冷啟動和熱加載。

1.原理

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

Levin1.jpg開源 Levin中數(shù)據(jù)加載的示例分析

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

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

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

2.功能與特性

▍STL-like共享內(nèi)存容器

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

Levin2.jpg開源 Levin中數(shù)據(jù)加載的示例分析

▍離線數(shù)據(jù)編譯

高效使用數(shù)據(jù)是在線服務(wù)的目標(biāo),數(shù)據(jù)規(guī)范化是構(gòu)建復(fù)雜系統(tǒng)的前提。 很多以數(shù)據(jù)為核心的系統(tǒng)都會將數(shù)據(jù)流程劃分為離線編譯和在線加載,其中離線數(shù)據(jù)編譯是數(shù)據(jù)高效轉(zhuǎn)換的重要一環(huán),利用離線單節(jié)點(diǎn)把數(shù)據(jù)轉(zhuǎn)換為可以方便使用的格式,省掉在線服務(wù)多節(jié)點(diǎn)重復(fù)的轉(zhuǎn)換和構(gòu)建工作。 Levin支持離線數(shù)據(jù)編譯功能,將原始數(shù)據(jù)編譯為進(jìn)程可直接讀入的共享容器對象內(nèi)存布局二進(jìn)制文件,為在線服務(wù)提供更加高效的數(shù)據(jù)服務(wù)。

▍在線數(shù)據(jù)加載

加載離線階段編譯產(chǎn)出的數(shù)據(jù)文件至命名共享內(nèi)存區(qū)域,支持共享容器對象申請、校驗(yàn)、加載、釋放。 Levin在線數(shù)據(jù)加載進(jìn)行一次性共享內(nèi)存分配和讀取,省掉構(gòu)建過程大量brk/mmap內(nèi)存分配系統(tǒng)調(diào)用,減少IO次數(shù),為在線服務(wù)數(shù)據(jù)加載進(jìn)一步提速。下圖是以上介紹的數(shù)據(jù)使用流程,推薦這種方式。

Levin3.jpg開源 Levin中數(shù)據(jù)加載的示例分析

▍管理模塊

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

▍版本切換

使用Levin管理模塊對同版本容器數(shù)據(jù)進(jìn)行g(shù)roup管理,卸載特定版本時(shí)可安全、統(tǒng)一釋放相應(yīng)的共享容器集合,完美支撐用戶數(shù)據(jù)版本熱切換需求實(shí)現(xiàn)。

3.內(nèi)部實(shí)踐

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

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI