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