滴滴開源 Levin:數據閃電加載方案

1.背景

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

如同閃電(Levin)通常快速加載啓動是根治這類問題的靈丹妙藥。Levin是針對上述低頻更新、靜態使用、大規模數據的快速加載方案,高效託管大規模靜態數據,加速大內存服務冷啓動和熱加載。github

2.原理

服務啓動惟快不破,可是在單純的服務變動場景中(好比上線、回滾、故障恢復)雖然並不涉及任何數據變動,服務進程重啓致使堆和棧內存數據都會隨之消亡,啓動後須要從新加載數據。那麼數據能不能在進程間傳遞複用呢?最高效的進程間數據傳遞方式就是共享內存,共享內存能夠突破進程生命週期實現跨進程重用,而且具備內存對象訪問效率和充足的可用地址空間(下圖Memory Mapping Area),魚(啓動速度)與熊掌(查詢效率)能夠兼得。安全

再考慮數據更新場景,一般指數據版本切換,此時磁盤數據讀取在所不免,那麼從數十G的數據文件到內存數據對象(一般爲STL容器),是否存在更高效的轉換方式?思考若是直接離線編譯出數據對象內存佈局寫入二進制文件,在線服務啓動時進行一次性共享內存分配和IO讀取,能夠進一步提升加載效率。session

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

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

3.功能與特性

▍STL-like共享內存容器性能

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

Levin2.jpg優化

file

▍離線數據編譯3d

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

▍在線數據加載

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

Levin3.jpg

file

▍管理模塊

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

▍版本切換

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

4.內部實踐

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

5.項目頁面

GitHub: github.com/didi/levin Documentation: github.com/didi/levin/… 歡迎Star,歡迎Issue。

相關文章
相關標籤/搜索