持久内存支持的使用方式和实例规格有关,本文介绍如何配置将持久内存配置为本地盘以及可以配置为本地盘的持久内存型实例(ecs.re7p规格)使用llpl库分配内存池失败的解决方案。

前提条件

实例镜像的版本满足以下要求:
  • 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-redis
    说明 作为内存使用:
    • 购买后无需进行初始化即可使用
    • 无持久化特性,在停机或重启后,数据会丢失。
  • 作为本地盘使用的规格:ecs.re6p
关于实例规格的更多信息,请参见实例规格族
本文示例中使用的配置如下:
  • 实例规格:ecs.re6p.2xlarge
  • 镜像:Alibaba Cloud Linux 2.1903 LTS 64位

将持久内存配置为一块本地盘

  1. 登录实例。
    具体操作,请参见连接方式概述
  2. 安装持久内存管理工具并将清理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配置
  3. 查看持久内存大小。
    ndctl list -R

    如下图所示,size值即为持久内存大小。

    查询持久内存大小
  4. 将使用模式配置为fsdax。
    sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --force
    说明 {region-size}请替换成上一步查询的size值。
  5. 格式化并挂载磁盘。
    sudo mkfs -t ext4 /dev/pmem0 && \
    sudo mkdir /mnt/sdb && \
    sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb
  6. 查看已挂载的磁盘。
    df -h
    pmem-as-ssd

    挂载完成后,您可以使用磁盘性能测试工具测试磁盘性能。

    基于持久内存的本地盘与本地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级别
    读IOPS100万级别50万级别2~3万级别
    读写IOPS100万级别30万级别2~3万级别
    写IOPS100万级别30万级别2~3万级别
    读延时300~400纳秒级别100000纳秒级别250000纳秒级别
    写延时300~400纳秒级别20000纳秒级别150000纳秒级别

使用llpl库分配内存池失败

问题现象

可以配置为本地盘的ECS持久内存型实例(ecs.re7p规格)使用llpl库分配内存池失败,提示信息Failed to create heap. Cannot read unsafe shutdown count**,如下图所示。问题现象

可能原因

llpl源码默认启用unsafe shutdown detection,而非易失性存储器NVM虚拟化后不支持启用unsafe shutdown detection。更多信息,请参见llpl

解决方案

在llpl源码中关闭unsafe shutdown detection,操作步骤如下。

  1. 在llpl源码的src/main/cpp/com_intel_pmem_llpl_AnyHeap.cpp文件中添加如下代码。
    int sds_write_value = 0;
    pmemobj_ctl_set(NULL, "sds.at_create", &sds_write_value)

    代码添加完毕后,结果如图所示。

    AnyHeap
  2. 登录实例。
    具体操作,请参见连接方式概述
  3. 执行如下命令,使用llpl库运行测试用例。
    mvn clean && mvn test -Dtest.heap.path=/mnt/sdb
    命令执行完毕,如果未出现该错误提示,表示您可以继续分配内存池。