【开源推荐】XMM Go语言环境中完全自主实现的第三方内存管理库
XMM (eXtensible) Memory Manager - 完全自主第三方 Go 內存分配管理器
XMM 是什么?
XMM - X(eXtensible) Memory Manager(完全自主研發的第三方 Go 內存分配管理器)
XMM 是一個在 Go 語言環境中完全自主實現的第三方內存管理庫,不依賴于 Go 本身的任何內存管理能力,純自主實現的 Go 內存管理庫;能夠應對各種場景下大小內存的 分配/釋放/管理
等工作,能夠幫助適用于任何復雜數據結構的構建(鏈表/數組/樹/hash 等場景),能夠良好完美的逃逸掉 Go 內置的 GC 機制,保證程序的超高性能,是構建高性能程序基礎設施。
XMM 主要具備以下特點
XMM 是一個在 Go 語言環境中完全自主實現的第三方內存管理庫,不依賴于 Go 本身的任何內存管理能力,通過 6000 行純 Go 代碼自主實現的 Go 內存管理庫,適合不用 Go 的 GC 想要自己管理內存的場景。
XMM 能夠應對各種場景下大小內存的 分配/釋放/管理 等工作,能夠幫助適用于任何復雜數據結構的構建,比如鏈表/數組/樹/哈希表等等場景;XMM 可以讓你像 C/C++ 一樣方便便捷使用系統內存,并且不用擔心性能問題。
XMM 能夠良好完美的逃逸掉 Go 內置的 GC 機制,保證程序的超高性能,是構建高性能程序基礎設施;但與 sync.Pool 等實現機制完全不同,sync.Pool 等使用字節流實現來逃逸 GC,XMM 是純使用 Linux 系統的
mmap 作為底層內存存儲,XMM 更像 TcMalloc 等內存分配器。
XMM 協程安全,且分配性能超高,目前在普通 Linux 服務器上面可以達到 350w alloc/s,就是每秒可以進行 350 萬次的內存分配操作不卡頓,非常適合想要自主管理內存且超高性能場景。
XMM 內存庫使用接口簡單,兼容性強,能夠兼容 Go 1.8 以上版本,容易上手(推薦 go 1.12+ 版本更好),可以在 XMM 之上重構你所有想要的高性能數據結構,比如 map/slice
等等。(案例部分可以做一些數據結構實現的參考)
為什么要設計 XMM?
為什么要設計自主的內存管理器?
為了應對在多種內存管理的場景下的使用,可能需要有一些除了內置數據結構外的一些內存自主調度使用的場景,比如構建復雜的高性能的數據結構,在大規模內存占用,或者是非常多的小內存塊占用場景下,能夠盡量減少 Go 的 GC
機制,保障服務性能穩定不會因為 GC 而產生抖動。
為什么不使用內置的 map/slice 等數據結構?
Golang 本身為了性能和內存可控,整個內存管理是完全封閉不對外的,并且有自主的 GC 機制,需要自主內存管理比較麻煩;Go 中自帶的 GC 機制經過很多個版本的迭代,到目前性能已經很不錯,但是在大規模的碎片化內存塊下面,GC
還是會有一定損耗,在極端高性能場景下,GC 會讓整個后臺應用服務性能上不去(或偶爾卡頓)。所以一句話,Go 本身指針等還有性能會受到 GC 的影響,導致服務性能總是上不去。
為什么不使用其他開源的內存池?
除 Go 本身的內存模塊,調研了解現有大部分的第三方 對象池/內存池/字節池 等需要某塊自主內存操作的場景中基本是 Map/sync.Pool/Bytes[] 等方式。
Map 數據結構適合保存各類型數據,但 GC 概率大; sync.Pool 這類保存復用臨時對象,也可以各種數據機構,可適當減少 GC(無法避免 GC); Bytes[]
方式來保存字節數據,并且只能保存字節數據,通過某些處理,盡量逃避 GC 掃描;(對比參考 Go 語言基于 channel 實現的并發安全的字節池 )
現有開源庫包括:依賴于 sync.Pool 的比如字節的
mcache gopkg/mcache.go;采用 Bytes[] 方式的比如 MinIO
的的 bpool minio/bpool.go ,都可以學習參考。
結論:XMM 與他們實現機制完全不同,XMM 更靠近 Go 內置內存分配機制原理
XMM 的最終設計結論是什么?
為了完全實現最終為了逃逸掉 Golang 的 GC 機制,以及擁有完全自主可控的內存管理分配操作,在面對成千上萬的小對象場景中,不會因為 Go 本身 GC 機制帶來任何的抖動,所以自主從零開始實現了 XMM 模塊,達到在 Go 程序中調用
XMM 模塊可以達到完美的自主內存 申請/釋放/管理 的功能,并可以完美逃逸掉 Go 的 GC 機制。
XMM 設計的目標是什么?
為了保證高性能,XMM 設計之初,就定下了三個核心目標:
單機(6 核心 KVM 或物理機)內存分配性能達到 350w+ alloc/s;(每秒內存分配速度,已實現);
可以支持調用用戶手工強制Free某個申請內存塊,也可以支持XMM自身自動GC某些未手工Free的內存庫;(自主實現GC功能,目前建議手動Free(), 未來版本實現)
不會內存泄露,并且內存管理不是粗糙的,而顆粒度細致的,完全盡量可媲美行業主流的內存管理分配器。(已實現)
XMM性能測試數據
XMM性能測試情況
XMM 快速使用入門
☆ XMM 使用案例 ☆
說明:XMM 測試程序快速預覽下載使用
XMM 實現原理介紹
1. XMM 的核心設計與實現流程
1. XMM 設計實現技術調研參考
1. XMM 內部技術設計問題Q&A
總結
以上是生活随笔為你收集整理的【开源推荐】XMM Go语言环境中完全自主实现的第三方内存管理库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python朝圣之路-内置函数
- 下一篇: [Practical.Vim(2012.