【VMware ESXi】如何查看启用内存分层功能的 ESXi 主机使用了多少 NVMe 内存。

VMware vSphere 8 U3 中作为技术预览所引入的功能“内存分层(Memory Tiering)”,相信大家已经在自己的测试或实验环境中应用并验证了,如果你还不知道,请跳转到这篇(把硬盘当内存用?VMware 内存分层(Memory Tiering),你值得拥有!)文章了解相关介绍以及如何启用它。需要注意的是,目前在启用内存分层功能的 ESXi 主机上无法创建虚拟机的“内存”快照,即只能创建虚拟机普通快照。有关更多关于内存分层的内容,请查看 VMware KB 95944 末尾处的技术指南。

如何查看有关内存分层(Memory Tiering)功能的配置信息?如果环境中有 vCenter Server,导航到 vCenter Server(vSphere Client)->启用了内存分层的 ESXi 主机->配置->硬件->概览,可以在“内存”信息栏中看到我们所配置的内存分层信息,层 0(Tier 0)表示物理内存(DRAM)容量,层 1(Tier 1)表示配置为内层分层的 NVMe 存储容量。

我相信你跟我一样有一个疑问,在启用了内存分层功能的 ESXi 主机上,如何知道虚拟机有没有使用 NVMe 存储内存?并且到底使用了多少 NVMe 内存容量?现在,刚好 VMware by Broadcom 工程师 William Lam 发布了这篇(How much Virtual Machine memory is using NVMe Tiering?)文章,下面一起来了解一下。

通过 SSH 连接到 ESXi 主机,使用memstats命令并选择vmtier-stats输出类型可查看 ESXi 主机上运行虚拟机所占用的 NVMe 内存。 

使用memstats命令具有许多选项,可以使用-h查看命令帮助。常用的有,-r指定输出类型,比如这里指定 vmtier-stats,不同的输出类型具有不同命令选项。-q选项将输出的结果以 CSV 格式显示,而不是默认的表格样式;-s选项输出指定的列,而不是全部输出;-u选项指定输出结果的单位,有 gb、mb、 kb、pg 单位可选,默认是 kb。

memstats -r vmtier-stats

上面是不加任何选项使用memstats输出vmtier-stats的结果,如果加上相关选项,我们可以得到以下输出。这里使用了-s选项指定了我们想要的列,使用了-u选项将输出结果的单位修改为 mb 显示。下面说一下输出列所代表的含义,“name”列表示 ESXi 主机上正在运行的虚拟机,不过是以 VM Cartel ID 形式显示;“memSize”列表示虚拟机分配的内存大小;“active”列表示虚拟机当前的活动内存;“tier0Consumed”列表示虚拟机占用的物理内存(DRAM)大小,“tier1Consumed”列表示虚拟机占用的 NVMe 内存大小。从输出的结果可以看到,ESXi 主机上一共运行了 11 个虚拟机,其中一共占用了物理内存(DRAM)大小为 139793 mb,大概 135 gb 左右,而 NVMe 内存的大小一共占用了 470 mb,大概 1 gb 左右。当前 NVMe 内存所占用的容量非常少,可能是由于虚拟机实际使用的内存比较少,而当前物理内存(DRAM)容量比较多的原因导致的,这样的话就没必要将更多活动内存放在 NVMe 内存上,而更多的放在物理内存(DRAM)上,以充分保证虚拟机的性能。

memstats -r vmtier-stats -u mb -s name:memSize:active:tier0Consumed:tier1Consumed

根据上面所输出的结果,虚拟机“name”列是以 VM Cartel ID 形式显示的,这样的话就不知道那个 VM Cartel ID 对应实际环境中那个虚拟机名字了。但是,我们可以通过命令生成 VM Cartel ID 与实际虚拟机名字的对应关系,然后再将该文件带入到memstats命令中去,这样就可以显示实际虚拟机的名字了。

esxcli --formatter csv vm process list | awk -F ',' '{print $2,$5}' > /tmp/vms

使用新的命令进行查看。

memstats -r vmtier-stats -u mb -s name:memSize:active:tier0Consumed:tier1Consumed | sed "$(while read -r name id; do echo "s/vm.$id/$name/g"; done < /tmp/vms)"