非易失性内存在阿里生产环境的首次应用:Tair NVM最佳实践总结
?
阿里妹導(dǎo)讀:本文介紹了非易失性內(nèi)存在阿里巴巴集團(tuán)生產(chǎn)環(huán)境的首次應(yīng)用:線上運(yùn)行的情況;使用NVM遇到的問題和優(yōu)化的過程;最后,總結(jié)性地給出了基于NVM構(gòu)建緩存服務(wù)的設(shè)計(jì)要點(diǎn),希望這些實(shí)踐總結(jié)能對(duì)大家的工作有所啟發(fā)。
簡(jiǎn)介
Tair MDB是阿里巴巴生態(tài)系統(tǒng)內(nèi)廣泛使用的緩存服務(wù),它采用非易失性內(nèi)存 Non-volatile memory (NVM)作為DRAM的補(bǔ)充,輔助DRAM作為后端存儲(chǔ)介質(zhì),從天貓618購物節(jié)開始在生產(chǎn)環(huán)境上線灰度,經(jīng)歷了2次全鏈路壓測(cè),至今運(yùn)行穩(wěn)定。在使用NVM的過程中,Tair MDB遇到了寫不均衡、鎖開銷等問題,經(jīng)過優(yōu)化之后取得了非常顯著的效果。
通過這一系列優(yōu)化工作和生產(chǎn)環(huán)境的實(shí)踐,Tair工程團(tuán)隊(duì)總結(jié)出了一些在Non-volatile memory (NVM) / Persistent memory (PMEM)上實(shí)現(xiàn)緩存服務(wù)的設(shè)計(jì)準(zhǔn)則,相信這些準(zhǔn)則對(duì)其它有意愿使用Non-volatile memory來進(jìn)行優(yōu)化的產(chǎn)品會(huì)非常有指導(dǎo)意義。
背景
Tair Mdb主要服務(wù)于緩存場(chǎng)景,在阿里巴巴集團(tuán)內(nèi)部有著大量的部署和使用。隨著用戶態(tài)網(wǎng)絡(luò)協(xié)議棧、無鎖數(shù)據(jù)結(jié)構(gòu)等特性的引入,單機(jī)QPS極限能力已經(jīng)達(dá)到了1000w+的級(jí)別。Tair Mdb所有的數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中,隨著單機(jī)QPS極限能力的上升,內(nèi)存容量逐漸成為限制集群規(guī)模的主要因素。
NVM產(chǎn)品單根DIMM的容量相對(duì)于DRAM DIMM要大很多,價(jià)格相對(duì)于DRAM更有優(yōu)勢(shì),將Tair Mdb的數(shù)據(jù)存放在NVM上,是突破單機(jī)內(nèi)存容量的限制的一個(gè)方向。
生產(chǎn)環(huán)境
效果
端到端,讀寫平均延時(shí)和相同軟件版本下使用DRAM的節(jié)點(diǎn)數(shù)據(jù)持平;服務(wù)行為表現(xiàn)正常。生產(chǎn)環(huán)境的壓力并沒有達(dá)到Tair MDB節(jié)點(diǎn)的極限,后面的章節(jié)會(huì)介紹壓測(cè)時(shí)我們遇到的問題和解決方案。
成本
前面提到了單根NVM DIMM最大容量比DRAM DIMM要高,相同容量的價(jià)格會(huì)比DRAM便宜。Tair MDB容量型的集群,如果采用NVM來補(bǔ)充內(nèi)存容量的不足,規(guī)模可以大幅減少。算上機(jī)器價(jià)格、電費(fèi)、機(jī)架等因素,成本大約可以降低30% ~ 50%左右 。
原理
使用方式
Tair MDB使用NVM設(shè)備的方式,是把NVM以塊設(shè)備的形式使用Pmem-Aware File System掛載(DAX掛載模式)。分配NVM空間對(duì)應(yīng)的操作是在對(duì)應(yīng)的文件系統(tǒng)路徑上創(chuàng)建并打開文件,使用posix_fallocate分配空間。
?
內(nèi)存分配器
NVM本身具備非易失的特性,對(duì)于緩存服務(wù)Tair MDB,是把NVM當(dāng)作易失性設(shè)備,不需要去考慮操作的原子性和crash之后的recovery操作,也不需要顯式地調(diào)用clflush/clwb等命令將CPU Cache中的內(nèi)容強(qiáng)制刷回介質(zhì)。
使用DRAM空間時(shí),有tcmalloc/jemalloc等內(nèi)存分配器可供選擇,現(xiàn)在NVM的空間暴露給上層的是一個(gè)文件(或者是一個(gè)字符設(shè)備),所以如何使用內(nèi)存分配器是首先需要考慮的事情。開源項(xiàng)目pmem[1]中維護(hù)了易失性的內(nèi)存管理庫libmemkind,有易用的類malloc/free的API,大部分應(yīng)用接入時(shí)可以考慮這種方式。
Tair MDB在實(shí)現(xiàn)時(shí)并沒有使用libmemkind[2]。下面介紹Tair MDB的內(nèi)存布局,說明做出這種選擇的原因。
內(nèi)存布局
Tair MDB在內(nèi)存管理上使用了slab機(jī)制,不是在使用時(shí)動(dòng)態(tài)地分配匿名內(nèi)存,而是在系統(tǒng)啟動(dòng)時(shí)先分配一大塊內(nèi)存,內(nèi)置的內(nèi)存管理模塊會(huì)把元數(shù)據(jù)、數(shù)據(jù)頁等在這一大塊內(nèi)存上連續(xù)分布,如下圖所示:
?
Tair MDB使用的內(nèi)存主要分為以下幾部分:
- Cache Meta,存放了一些最大分片數(shù)之類的元數(shù)據(jù)信息,還有Slab Manager的索引信息。
- Slab Manager,每個(gè)Slab Manager中管理固定大小的Slab。
- Hashmap,全局哈希表索引,使用線性沖突鏈的方式處理哈希沖突,所有key的訪問都需要經(jīng)過Hashmap。
- Page pool,內(nèi)存池,啟動(dòng)之后會(huì)將內(nèi)存劃分成以1M為單位的頁,Slab Manager會(huì)從Page pool中申請(qǐng)頁,并格式化成指定的slab大小。
Tair Mdb會(huì)在啟動(dòng)時(shí)對(duì)所有可用的內(nèi)存進(jìn)行初始化,后續(xù)數(shù)據(jù)存儲(chǔ)部分不需要?jiǎng)討B(tài)地從操作系統(tǒng)分配內(nèi)存了。
在使用NVM時(shí),把對(duì)應(yīng)的文件mmap到內(nèi)存,獲取虛擬地址空間,內(nèi)置的內(nèi)存管理模塊就可以透明地利用這塊空間了。所以在這個(gè)過程中,并不需要再調(diào)用malloc/free來管理NVM設(shè)備上的空間。
壓測(cè)
Tair MDB在使用NVM作為DRAM的補(bǔ)充,輔助DRAM作為后端存儲(chǔ)之后,在壓測(cè)過程中遇到了一些問題,在這一章節(jié)會(huì)介紹這些問題的具體表現(xiàn)和優(yōu)化的方法。
問題
使用了NVM之后,使用100 bytes的條目對(duì)Tair MDB進(jìn)行了壓測(cè),得到如下的數(shù)據(jù):
引擎內(nèi)延遲
客戶端觀測(cè)QPS
基于NVM的Read QPS /latency和DRAM相當(dāng),Write TPS大概是DRAM的1/3。
分析
寫性能的損耗從perf的結(jié)果上看都在鎖上,這個(gè)鎖管理的臨界區(qū)包含的是對(duì)上文內(nèi)存布局中提到的Page的寫操作。懷疑這種情況是NVM上的寫延遲比DRAM上高導(dǎo)致的。
?
在壓測(cè)的過程中,使用pcm[3]查看NVM DIMMS的帶寬統(tǒng)計(jì),觀察到在某一根DIMM上的寫非常不均衡,穩(wěn)定情況下大約是其它DIMM的兩倍。
具體情況如下圖所示:
?
這里先大概介紹下NVM DIMM的放置策略。
放置策略
現(xiàn)在使用單socket放置了4根 NVM DIMM,具體分布類似下圖:
?
這種放置策略被稱為2-2-1。每一個(gè)socket有4根 DIMM,分別屬于四個(gè)不同的通道。在使用多個(gè)通道時(shí),為了有效利用內(nèi)存帶寬CPU會(huì)進(jìn)行interleave。當(dāng)前放置策略和配置下,CPU以4K為單位,按照DIMM順序進(jìn)行interleave。
?
不均衡原因
從memory interleaving的策略,可以推斷每次都會(huì)寫同一個(gè)區(qū)域,而這片區(qū)域位于那根不均衡的DIMM上,導(dǎo)致這根DIMM的寫入量會(huì)明顯高于其它的DIMM。
那么接下來需要解決的問題就是找到導(dǎo)致寫熱點(diǎn)的處理邏輯。trivial的方法就是找些可疑的點(diǎn),然后一個(gè)個(gè)排除下去,下面介紹下Tair工程團(tuán)隊(duì)使用的方法。
優(yōu)化
上面提到了,寫熱點(diǎn)導(dǎo)致NVM DIMM訪問不均衡,所以優(yōu)化的第一步是先把寫熱點(diǎn)找出來,進(jìn)行一些處理,比如說打散熱點(diǎn)訪問,或者把熱點(diǎn)訪問的區(qū)域放到DRAM中。
查找寫熱點(diǎn)
對(duì)于寫熱點(diǎn)的查找,Tair工程團(tuán)隊(duì)使用了Pin[4]。上面提到Tair MDB是對(duì)文件進(jìn)行mmap獲取邏輯地址來操作內(nèi)存。于是我們可以使用Pin抓取mmap的返回值,進(jìn)而得到NVM在程序內(nèi)存空間中的邏輯地址。之后我們繼續(xù)使用Pin對(duì)所有操作內(nèi)存的程序指令進(jìn)行插樁,統(tǒng)計(jì)對(duì)NVM映射到的地址空間中的每個(gè)字節(jié)的寫入次數(shù)。
最終,發(fā)現(xiàn)寫熱點(diǎn)的確存在,相應(yīng)的區(qū)域是Page的元數(shù)據(jù)。解決寫熱點(diǎn)的方案考慮過:加padding把熱點(diǎn)交錯(cuò)到各個(gè)DIMM上、基本一樣熱的數(shù)據(jù)分DIMM存放、將熱點(diǎn)移回DRAM等,最終選擇將slab_manager和page_info移回DRAM。修改后結(jié)構(gòu)如下:
?
至此,不均衡問題解決,TPS從85w提升至140w,此時(shí)引擎內(nèi)寫延遲從40us降低到12us。
鎖開銷過大
當(dāng)TPS在140w時(shí),注意到上面提到過的pthread_spin_lock的開銷依然非常大。通過perf record的結(jié)果可以看到,pthread_spin_lock消耗的調(diào)用棧是:
?
通過分析batch_alloc_item發(fā)現(xiàn)臨界區(qū)內(nèi)對(duì)page中item的初始化操作會(huì)對(duì)NVM產(chǎn)生大量寫入。由于NVM的寫入速度比DRAM慢,所以這里成為一個(gè)很耗時(shí)的地方。
其實(shí)按照Tair MDB的邏輯,只有將page link進(jìn)slab_manager的時(shí)候才需要加鎖。因此這里將對(duì)item的初始化操作移出臨界區(qū)。之后又對(duì)Tair MDB代碼中臨界區(qū)內(nèi)所有對(duì)NVM的寫入操作進(jìn)行了排查,并進(jìn)行了相應(yīng)的優(yōu)化。
優(yōu)化之后pthread_spin_lock開銷降低到正常范圍內(nèi),TPS提升至170w,此時(shí)引擎內(nèi)寫延遲為9us。
優(yōu)化結(jié)果
均衡寫負(fù)載、鎖粒度細(xì)化等優(yōu)化有效地降低了Latency,TPS上升到了170w,相較之前的數(shù)據(jù),TPS提高了100%。由于介質(zhì)的差異,和DRAM的寫性能相比依然有30%左右的差距,但是對(duì)于緩存服務(wù)讀多寫少的場(chǎng)景,這個(gè)差距對(duì)整體的性能并不會(huì)有太大的影響。
設(shè)計(jì)指引
基于上述的優(yōu)化工作和生產(chǎn)環(huán)境的實(shí)踐,Tair工程團(tuán)隊(duì)總結(jié)了基于NVM實(shí)現(xiàn)緩存服務(wù)的設(shè)計(jì)準(zhǔn)則,這些準(zhǔn)則是和使用的硬件特性有緊密聯(lián)系的。
硬件特性
對(duì)緩存服務(wù)設(shè)計(jì)有影響的特有的NVM硬件特性:
- 相對(duì)于DRAM密度更高,更便宜
- 延遲相較DRAM高,帶寬比DRAM低
- 讀寫不均衡,寫延遲相較讀高
- 硬件有磨損,頻繁寫單一位置會(huì)加大磨損
設(shè)計(jì)準(zhǔn)則
準(zhǔn)則A:避免寫熱點(diǎn)
Tair MDB在使用NVM的過程中遇到過寫熱點(diǎn)的問題,寫熱點(diǎn)會(huì)加大介質(zhì)的磨損,而且會(huì)導(dǎo)致負(fù)載不均衡(寫壓力在某一根DIMM上,不能充分利用所有DIMM的帶寬)。除了內(nèi)存布局(元數(shù)據(jù)和數(shù)據(jù)混合存放)會(huì)導(dǎo)致寫熱點(diǎn)外,業(yè)務(wù)的訪問行為也會(huì)導(dǎo)致寫熱點(diǎn)。
這里,Tair工程團(tuán)隊(duì)總結(jié)了幾種避免寫熱點(diǎn)的方法:
- 分離元數(shù)據(jù)和數(shù)據(jù),將元數(shù)據(jù)移到DRAM中。元數(shù)據(jù)訪問頻率會(huì)相對(duì)于數(shù)據(jù)更高,前面提到的Tair MDB 中page_info屬于元數(shù)據(jù)。這樣可以從上層緩解NVM寫延遲相較DRAM高的劣勢(shì)。
- 上層實(shí)現(xiàn)Copy-On-Write的邏輯。這樣在一些場(chǎng)景下會(huì)減少對(duì)特定區(qū)域硬件的磨損,Tair MDB中更新一條數(shù)據(jù)時(shí),并不會(huì)in-place update之前的條目,而是會(huì)新增條目添加到hashmap沖突鏈的頭部,異步刪除之前的條目。
- 常態(tài)檢測(cè)熱點(diǎn)寫,動(dòng)態(tài)遷移到DRAM,執(zhí)行寫合并。對(duì)于上面提到的業(yè)務(wù)訪問行為導(dǎo)致的熱點(diǎn)寫,Tair MDB會(huì)常態(tài)化檢測(cè)熱點(diǎn)寫,并把熱點(diǎn)寫進(jìn)行合并,減少對(duì)下層介質(zhì)的訪問。
準(zhǔn)則B:減少臨界區(qū)訪問
由于NVM的寫延遲相較DRAM高,所以當(dāng)臨界區(qū)中包含了對(duì)NVM的操作時(shí),臨界區(qū)的影響會(huì)放大,導(dǎo)致上層的并發(fā)度降低。
前面提到的鎖開銷,Tair MDB運(yùn)行在DRAM上時(shí)并沒有觀測(cè)到,原因是運(yùn)行在DRAM上,假設(shè)了這個(gè)臨界區(qū)的開銷比較小,但是使用NVM時(shí),這個(gè)假設(shè)不成立了。這也是在使用新介質(zhì)時(shí)經(jīng)常會(huì)遇到的問題,以往軟件流程中可能沒有意識(shí)到的一些假設(shè),在新介質(zhì)上不成立了,這時(shí)候就需要對(duì)原有的流程進(jìn)行一些調(diào)整。
鑒于上面的原因,Tair工程團(tuán)隊(duì)建議緩存服務(wù)使用NVM時(shí),應(yīng)該盡量地結(jié)合數(shù)據(jù)存儲(chǔ)做無鎖化的設(shè)計(jì),減少臨界區(qū)的訪問,規(guī)避延遲升高帶來的級(jí)聯(lián)影響。
Tair MDB引入了用戶態(tài)RCU,對(duì)大部分訪問路徑上的操作進(jìn)行了無鎖化改造,極大地降低了NVM延遲對(duì)上層帶來的影響。
準(zhǔn)則C:實(shí)現(xiàn)合適的分配器
分配器是業(yè)務(wù)使用NVM設(shè)備的基礎(chǔ)組件,分配器的并發(fā)度會(huì)直接影響軟件的效率,分配器的空間管理會(huì)決定空間利用率。設(shè)計(jì)實(shí)現(xiàn)或者選擇適合于軟件特性的分配器,是緩存服務(wù)使用NVM的關(guān)鍵。
從Tair MDB的實(shí)踐上來看,適用于NVM的分配器應(yīng)該具備以下功能和特性:
- 碎片整理:由于NVM有密度更高、容量更大,所以在相同碎片率下,相較于DRAM會(huì)浪費(fèi)更多的空間。由于碎片整理機(jī)制的存在,所以需要上層應(yīng)用避免in-place update,而且盡量保證分配器分配的空間是fixed size。
- 需要有Threadlocal的quota:和上面說的減小臨界區(qū)訪問類似,如果沒有Threadlocal的quota,從全局的資源池中分配資源的延時(shí)會(huì)降低分配操作的并發(fā)度。
- Capacity-aware,分配器需要感知所能管理的空間: 緩存服務(wù)需要對(duì)管理的空間進(jìn)行擴(kuò)容或者縮容,分配器需要提供相應(yīng)的功能以適配這個(gè)需求。
以上這些設(shè)計(jì)準(zhǔn)則都是在實(shí)踐中檢驗(yàn)過,切實(shí)可行,而且會(huì)對(duì)應(yīng)用帶來有利的影響,相信對(duì)其它希望使用NVM的產(chǎn)品也會(huì)有非常大的幫助。
未來的工作
上面提到了Tair MDB使用NVM時(shí)還是當(dāng)作易失性的設(shè)備,利用了密度大價(jià)格低的優(yōu)勢(shì)來降低整體服務(wù)的成本。未來Tair工程團(tuán)隊(duì)會(huì)致力于更好地利用NVM的非易失特性,挖掘新硬件的紅利,賦能于業(yè)務(wù)和其它上層的服務(wù)。
本文是阿里巴巴集團(tuán)存儲(chǔ)技術(shù)事業(yè)部Tair團(tuán)隊(duì)關(guān)于NVM的系列分享的開篇,接下來會(huì)陸續(xù)推出我們?cè)贜VM領(lǐng)域的思考和成果。
分布式在線存儲(chǔ)系統(tǒng)Tair 專注于承擔(dān)超大流量下的在線訪問加速,阿里巴巴集團(tuán)大規(guī)模使用,在每秒數(shù)億次訪問請(qǐng)求的背后,提供著超低延時(shí)的響應(yīng)。場(chǎng)景包括各類在線緩存,內(nèi)存數(shù)據(jù)庫,高性能持久化NoSQL數(shù)據(jù)庫等,在高并發(fā),快速響應(yīng)和高可用上追求極致。在這里,你會(huì)遇到億級(jí)別訪問的尖峰時(shí)刻,不同類型業(yè)務(wù)錯(cuò)綜復(fù)雜的場(chǎng)景需求,萬臺(tái)規(guī)模服務(wù)器集群的運(yùn)營(yíng)支撐,業(yè)務(wù)全球化等各類技術(shù)挑戰(zhàn)。
最后,我們也歡迎各位牛人加入我們團(tuán)隊(duì),
歡迎訪問:https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP052397
看看是否有你心儀的崗位!
參考資料:
[1]https://github.com/pmem
[2]https://github.com/memkind/memkind
[3]https://github.com/opcm/pcm
[4]https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool
[5]《揭秘!雙11萬億流量下的分布式緩存系統(tǒng) Tair》
[6]《Persistent Memory Programming: The Current State of the Ecosystem》
(http://storageconference.us/2017/Presentations/Rudoff.pdf)
[7]《Persistent Memory: What’s Done, Coming Soon, Expected Long-term》
(https://blog.linuxplumbersconf.org/2015/ocw/system/presentations/3015/original/plumbers_2015.pdf)
?
每天一篇技術(shù)文章,
看不過癮?
關(guān)注“阿里巴巴機(jī)器智能”微信公眾號(hào)
發(fā)現(xiàn)更多AI干貨。
總結(jié)
以上是生活随笔為你收集整理的非易失性内存在阿里生产环境的首次应用:Tair NVM最佳实践总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACL 2018 收录论文 | 如何高效
- 下一篇: 从计算机知识到落地能力,你欠缺了什么?