持久內存支持的使用方式和實例規格有關,本文介紹如何將持久內存配置為本地盤以及可以配置為本地盤的持久內存型實例(ecs.re6p規格和ecs.i4p規格)使用llpl庫分配內存池失敗的解決方案。
前提條件
持久內存適用于特定的實例規格和鏡像版本,要求如下:
實例規格
作為內存使用的規格:ecs.re6p-redis、ecs.re7p、ecs.r7p
重要作為內存使用時:
購買后無需進行初始化即可使用。
無持久化特性,在停機或重啟后,數據會丟失。
作為本地盤使用的規格:ecs.re6p、ecs.i4p
重要作為本地盤使用時:
購買后需要進行盤的初始化,具體操作,請參見將持久內存配置為一塊本地盤。
具備持久化特性,但作為本地盤存儲數據有丟失數據的風險,建議您做好必要的數據備份。關于本地盤的更多信息,請參見本地盤。
鏡像:
Alibaba Cloud Linux 2
CentOS 7.6及更高版本
Ubuntu 18.04、Ubuntu 20.04
背景信息
持久內存的訪問速度比普通內存慢,但性價比更高,可以作為本地存儲使用。作為本地存儲使用時,在停機或重啟后,持久內存中的數據不會丟失。持久內存的使用方式包括:
作為內存使用:您可以將部分原本存放在普通內存中的數據存放到持久內存中,例如對訪問速度要求較低的非熱點數據。持久內存容量大,單GiB價格更實惠,可以幫助您大幅降低單GiB內存的整體擁有成本(TCO)。
作為本地盤使用:持久內存作為本地盤使用時,支持塊數據讀寫,IO性能極高,讀寫延時低至170 ns。因此,您可以為需要更高穩定RT(響應時間)的核心應用數據庫選用持久內存。您也可以將原有的NVMe SSD盤換成基于持久內存的本地盤,獲得更高的IOPS和帶寬、更低的延時,解決性能瓶頸問題。
持久內存中數據的可靠性取決于物理服務器和持久內存設備的可靠性,因此存在單點故障風險。建議您在應用層做好數據冗余,將需要長期保存的業務數據存儲到云盤上,以保證應用數據的可靠性。
將持久內存配置為一塊本地盤
本文示例中使用的配置如下:
實例規格:ecs.re6p.2xlarge
鏡像:Alibaba Cloud Linux 2.1903 LTS 64位
登錄已創建的ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
分別執行以下命令,安裝持久內存管理工具并清理namespace和label配置。
sudo yum install -y ndctl daxctl sudo ndctl disable-namespace all && sudo ndctl destroy-namespace all #清理namespace sudo ndctl disable-region all && sudo ndctl zero-labels all && sudo ndctl enable-region all #清理label配置
查看持久內存大小。
ndctl list -R
如下圖所示,size值即為持久內存大小。
將使用模式配置為fsdax。
sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --force
說明{region-size}請替換成上一步查詢的size值。
分別執行以下命令,格式化并掛載磁盤。
sudo mkfs -t ext4 /dev/pmem0 sudo mkdir /mnt/sdb sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb
查看已掛載的磁盤。
測試i4p實例本地盤性能
本文示例中使用的配置如下:
實例規格:ecs.i4p.2xlarge
鏡像:Alibaba Cloud Linux 2.1903 LTS 64位
測試工具:fio,FIO(Flexible I/O Tester)是一個開源的、強大的I/O性能測試工具,可以用來對存儲設備進行隨機讀寫、順序讀寫等負載測試。
直接使用FIO壓測會導致數據丟失。因此在測試本地盤性能前,請確保不要將含有數據的本地盤作為測試對象。
在測試本地盤性能前,請確保已經對測試對象進行數據備份。具體操作,請參見備份本地盤文件。
遠程連接ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
運行以下命令,安裝測試工具FIO。
sudo yum install -y ndctl daxctl ipmctl libpmem librpmem libpmemblk libpmemlog libpmemobj libpmempool pmempool fio
測試本地盤性能。
測試命令示例,請參見測試IOPS,測試吞吐量,測試訪問時延。
重要如果連續測試,請在每次測試后執行
sudo rm /mnt/sdb/* -rf
命令清理本地盤上一輪遺留的測試結果,以便為下一輪測試準備干凈的環境。基于持久內存的本地盤與本地NVMe SSD盤、ESSD云盤的性能對比如下表所示。
說明表中列出的性能級別供您參考,單次測試的具體結果請以您自行測試時的結果為準。
指標
持久內存(容量128 GiB)
NVMe SSD(容量1788 GiB)
ESSD云盤(容量800 GiB,性能級別PL1)
讀帶寬
8~10 GByte/s級別
2~3 GByte/s級別
0.2~0.3 GByte/s級別
讀寫帶寬
8~10 GByte/s級別
1~2 GByte/s級別
0.2~0.3 GByte/s級別
寫帶寬
2~3 GByte/s級別
1~2 GByte/s級別
0.2~0.3 GByte/s級別
讀IOPS
100萬級別
50萬級別
2~3萬級別
讀寫IOPS
100萬級別
30萬級別
2~3萬級別
寫IOPS
100萬級別
30萬級別
2~3萬級別
讀延時
300~400納秒級別
100000納秒級別
250000納秒級別
寫延時
300~400納秒級別
20000納秒級別
150000納秒級別
測試IOPS
順序讀
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
順序寫
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=write --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
隨機讀
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randread --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
隨機寫
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randwrite --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
測試吞吐量
順序讀
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=read --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
順序寫
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=8 --iodepth=1 --rw=write --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
隨機讀
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randread --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
隨機寫
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randwrite --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
測試訪問時延
順序讀
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
順序寫
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=write --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
使用llpl庫分配內存池失敗
問題現象
可以配置為本地盤的ECS持久內存型實例(ecs.re7p規格和ecs.i4p規格)使用llpl庫分配內存池失敗,提示Failed to create heap. Cannot read unsafe shutdown count**
錯誤信息,如下圖所示。
可能原因
llpl源碼默認啟用unsafe shutdown detection
,而非易失性存儲器NVM虛擬化后不支持啟用unsafe shutdown detection
,導致出現該問題。更多信息,請參見llpl。
解決方案
在llpl源碼中關閉unsafe shutdown detection
,操作步驟如下。
在llpl源碼的src/main/cpp/com_intel_pmem_llpl_AnyHeap.cpp文件中添加如下代碼。
intsds_write_value=0; pmemobj_ctl_set(NULL,"sds.at_create",&sds_write_value)
代碼添加完畢后,結果如下圖所示。
登錄ECS實例。
具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
執行如下命令,使用llpl庫運行測試用例。
mvn clean && mvn test -Dtest.heap.path=/mnt/sdb
如果未出現該錯誤提示,表示您可以繼續分配內存池。