将虚拟持久内存附加到虚拟机¶
20.0.0 版本新增:(Train)
从 20.0.0 (Train) 版本开始,Nova 中的虚拟持久内存 (vPMEM) 功能允许使用 libvirt 计算驱动程序的部署为使用物理持久内存 (PMEM) 的实例提供 vPMEM,这些 PMEM 可以提供虚拟设备。
必须将 PMEM 分区为 PMEM 命名空间,应用程序才能使用。此 vPMEM 功能仅使用 devdax 模式下的 PMEM 命名空间,作为 QEMU vPMEM 后端。如果您想深入了解相关概念,建议阅读 NVDIMM Linux 内核文档。
要启用 vPMEM,请按照以下步骤操作。
依赖项¶
支持 vPMEM 功能需要以下内容
持久内存硬件
其中一种产品是 Intel® Optane™ DC 持久内存。 ipmctl 用于配置它。
Linux 内核版本 >= 4.18,并加载以下模块
dax_pmem,nd_pmem,device_dax,nd_btt
注意
Linux 内核 v4.0 或更高版本中存在 NVDIMM 支持。建议使用内核版本 4.2 或更高版本,因为 NVDIMM 支持默认启用。我们在旧版本中遇到了一些错误,并且我们已在 4.18 版本上完成了所有验证工作,因此 4.18 版本及更高版本可能保证其功能。
QEMU 版本 >= 3.1.0
Libvirt 版本 >= 5.0.0
ndctl 版本 >= 62
daxio 版本 >= 1.6
vPMEM 功能已在上述软件和硬件下得到验证。
配置 PMEM 命名空间(计算)¶
使用 ndctl 实用程序创建 PMEM 命名空间作为 vPMEM 后端。
例如,要创建一个名为
ns3的 30GiB 命名空间$ sudo ndctl create-namespace -s 30G -m devdax -M mem -n ns3 { "dev":"namespace1.0", "mode":"devdax", "map":"mem", "size":"30.00 GiB (32.21 GB)", "uuid":"937e9269-512b-4f65-9ac6-b74b61075c11", "raw_uuid":"17760832-a062-4aef-9d3b-95ea32038066", "daxregion":{ "id":1, "size":"30.00 GiB (32.21 GB)", "align":2097152, "devices":[ { "chardev":"dax1.0", "size":"30.00 GiB (32.21 GB)" } ] }, "name":"ns3", "numa_node":1 }
然后列出主机上可用的 PMEM 命名空间
$ ndctl list -X [ { ... "size":6440353792, ... "name":"ns0", ... }, { ... "size":6440353792, ... "name":"ns1", ... }, { ... "size":6440353792, ... "name":"ns2", ... }, { ... "size":32210157568, ... "name":"ns3", ... } ]
指定哪些 PMEM 命名空间应该可供虚拟机使用。
[libvirt] # pmem_namespaces=$LABEL:$NSNAME[|$NSNAME][,$LABEL:$NSNAME[|$NSNAME]] pmem_namespaces = 6GB:ns0|ns1|ns2,LARGE:ns3
配置的 PMEM 命名空间必须已在主机上创建,如上述所述。conf 语法允许管理员将一个或多个命名空间
$NSNAME与一个任意$LABEL关联,该标签随后可以用于 flavor 以请求其中一个命名空间。建议,但不是必需的,单个$LABEL下的命名空间大小相同。重新启动
nova-compute服务。Nova 将调用 ndctl 以识别配置的 PMEM 命名空间,并将 vPMEM 资源报告给 placement。
配置 flavor¶
将 libvirt.pmem_namespaces 中的 $LABEL 列表(用逗号分隔)指定到 flavor 的 hw:pmem 属性。请注意,允许使用相同标签的多个实例
$ openstack flavor set --property hw:pmem='6GB' my_flavor
$ openstack flavor set --property hw:pmem='6GB,LARGE' my_flavor_large
$ openstack flavor set --property hw:pmem='6GB,6GB' m1.medium
注意
如果指定了 NUMA 拓扑,则所有 vPMEM 设备都将放置在 guest NUMA 节点 0 上;否则 nova 将为 guest 自动生成一个 NUMA 节点。
基于上述示例,一个使用 my_flavor_large 的 openstack server create 请求将生成一个具有两个 vPMEM 的实例。一个,对应于 LARGE 标签,将是 ns3;另一个,对应于 6G 标签,将从 ns0、ns1 或 ns2 中任意选择。
注意
在虚拟机内部使用 vPMEM 需要以下内容
Guest 内核版本 4.18 或更高版本;
以下内核模块:
dax_pmem,nd_pmem,device_dax和nd_btt;ndctl 实用程序。
注意
调整具有 vPMEM 的实例大小,vPMEM 数据将不会迁移。
验证清单和分配¶
本节介绍如何检查
vPMEM 清单已在 placement 中正确创建,验证了 上述配置。
分配已在 placement 中正确创建,用于从 配置了 vPMEM 的 flavor 生成的实例。
注意
与 vPMEM 资源类相关的清单和分配位于与计算节点相关的根资源提供程序上。
获取资源提供程序列表
$ openstack resource provider list +--------------------------------------+--------+------------+ | uuid | name | generation | +--------------------------------------+--------+------------+ | 1bc545f9-891f-4930-ab2b-88a56078f4be | host-1 | 47 | | 7d994aef-680d-43d4-9325-a67c807e648e | host-2 | 67 | --------------------------------------+---------+------------+
检查每个资源提供程序的清单以查看资源类
在
libvirt.pmem_namespaces中配置的每个$LABEL用于生成名为CUSTOM_PMEM_NAMESPACE_$LABEL的资源类。Nova 将向 Placement 报告为每个$LABEL配置的 vPMEM 命名空间数量。例如,假设host-1的配置如上所述$ openstack resource provider inventory list 1bc545f9-891f-4930-ab2b-88a56078f4be +-----------------------------+------------------+----------+----------+-----------+----------+--------+ | resource_class | allocation_ratio | max_unit | reserved | step_size | min_unit | total | +-----------------------------+------------------+----------+----------+-----------+----------+--------+ | VCPU | 16.0 | 64 | 0 | 1 | 1 | 64 | | MEMORY_MB | 1.5 | 190604 | 512 | 1 | 1 | 190604 | | CUSTOM_PMEM_NAMESPACE_LARGE | 1.0 | 1 | 0 | 1 | 1 | 1 | | CUSTOM_PMEM_NAMESPACE_6GB | 1.0 | 3 | 0 | 1 | 1 | 3 | | DISK_GB | 1.0 | 439 | 0 | 1 | 1 | 439 | +-----------------------------+------------------+----------+----------+-----------+----------+--------+
您可以在此处看到以
CUSTOM_PMEM_NAMESPACE_前缀开头的 vPMEM 资源类。LARGE标签配置了一个命名空间(ns3),因此其清单为1。由于6GB标签配置了三个命名空间(ns0、ns1和ns2),因此CUSTOM_PMEM_NAMESPACE_6GB清单具有total和max_unit为3。检查正在使用 vPMEM 的每个服务器的分配
$ openstack server list +--------------------------------------+----------------------+--------+-------------------+---------------+-----------------+ | ID | Name | Status | Networks | Image | Flavor | +--------------------------------------+----------------------+--------+-------------------+---------------+-----------------+ | 41d3e139-de5c-40fd-9d82-016b72f2ba1d | server-with-2-vpmems | ACTIVE | private=10.0.0.24 | ubuntu-bionic | my_flavor_large | | a616a7f6-b285-4adf-a885-dd8426dd9e6a | server-with-1-vpmem | ACTIVE | private=10.0.0.13 | ubuntu-bionic | my_flavor | +--------------------------------------+----------------------+--------+-------------------+---------------+-----------------+ $ openstack resource provider allocation show 41d3e139-de5c-40fd-9d82-016b72f2ba1d +--------------------------------------+------------+------------------------------------------------------------------------------------------------------------------------+ | resource_provider | generation | resources | +--------------------------------------+------------+------------------------------------------------------------------------------------------------------------------------+ | 1bc545f9-891f-4930-ab2b-88a56078f4be | 49 | {u'MEMORY_MB': 32768, u'VCPU': 16, u'DISK_GB': 20, u'CUSTOM_PMEM_NAMESPACE_6GB': 1, u'CUSTOM_PMEM_NAMESPACE_LARGE': 1} | +--------------------------------------+------------+------------------------------------------------------------------------------------------------------------------------+ $ openstack resource provider allocation show a616a7f6-b285-4adf-a885-dd8426dd9e6a +--------------------------------------+------------+-----------------------------------------------------------------------------------+ | resource_provider | generation | resources | +--------------------------------------+------------+-----------------------------------------------------------------------------------+ | 1bc545f9-891f-4930-ab2b-88a56078f4be | 49 | {u'MEMORY_MB': 8192, u'VCPU': 8, u'DISK_GB': 20, u'CUSTOM_PMEM_NAMESPACE_6GB': 1} | +--------------------------------------+------------+-----------------------------------------------------------------------------------+
在此示例中,创建了两个服务器。
server-with-2-vpmems使用my_flavor_large请求一个6GBvPMEM 和一个LARGEvPMEM。server-with-1-vpmem使用my_flavor请求一个6GBvPMEM。