1. 环境准备
这里使用的系统是Ubuntu 20.04,在配置之前建议先安装如下工具 ipmctl
,ndctl
, daxctl
。这三个工具都可以使用apt install的方式安装(强烈建议)。如果实在无法联网,也可以使用源码安装的方式。
ipmctl源码下载链接 https://github.com/intel/ipmctl
ndctl 源码下载链接 https://github.com/intel/ndctl
2. 安装步骤
2.1 查看numa节点
在安装之前,可以使用numactl -H
命令查看系统中的numa节点信息。这里可以看到,目前系统中只有2个numa节点。
2.2 删除存在的namespace
系统中可能已经存在 namespace,可以使用 ndctl list
命令进行查看。为了避免出现问题,不过还是建议删除已有的 namespace 从新开始。
// 这里的all是删除所有的namespace,也可以指定 namespaceX.Y 删除具体的某一个
sudo ndctl destroy-namespace --force all
sudo ndctl destroy-namespace --force namespace1.0
2.2 新建namespace
使用下面的命令新建namespace,这里的mode选择dax
sudo ndctl create-namespace --mode=dax
使用ndctl list
再次查看系统里的namespace
2.3 修改chardev的映射模式从dev到mem
使用如下命令将映射模式从dev改为mem,注意这一步骤可能会出现问题,如果出现错误,下面有给出一些解决方案。
另外这里给出daxctl的使用指南。NDCTL User Guide 这里面有一些常见的用法以及示例。
sudo daxctl reconfigure-device --mode=system-ram dax1.0
2.4 完成
再次使用 numactl -H
查看内存节点信息,可以看到系统中已经多出了2个numa节点node2以 及 node3 ,大小分别为128G。
3. 一些可能出现的问题
3.1 在删除存在的namespace删除不成功
可能的原因是系统中这块内存已经被挂载,可以使用df -h
进行查看。如果已经被挂载,使用umount
先取消挂载,再进行删除。
3.2 修改chardev的映射模式从dev到mem不成功
# daxctl reconfigure-device --mode=system-ram --no-online dax0.0
libdaxctl: daxctl_dev_disable: dax0.0: error: device model is dax-class
libdaxctl: daxctl_dev_disable: dax0.0: see man daxctl-migrate-device-model
dax0.0: disable failed: Operation not supported
error reconfiguring devices: Operation not supported
reconfigured 0 devices
这个问题比较常见,可能的原因可能下面两个
- node节点始终分配到node0,但是系统中node0是已经存在的,所以会出错。
可以在之前的命令中加上--no-online
,下面给出一个该问题的issue链接
daxctl always map system-ram into target_node 0 - 某些 Linux 发行版默认情况下可能不会启用所需的“设备迁移模型”功能。使用如下命令,然后再删除已有的namespace,重新开始操作。
$ daxctl migrate-device-model
success: installed /etc/modprobe.d/daxctl.conf
4. 参考资料
如何用 ndctl/ipmctl 管理工具 配置不同访问模式的pmem设备
How To Extend Volatile System Memory (RAM) using Persistent Memory on Linux