Show Table of Contents
7.3. 虚拟机内存调试
7.3.1. 内存监控工具
在裸机环境中使用的监控内存的工具也可以在虚拟机中使用。以下工具可以被用来监控内存的使用情况,以及诊断与内存相关的问题:
topvmstatnumastat/proc/
注意
关于使用以上性能工具的详细信息,请参照《Red Hat Enterprise Linux 7 性能调节指南 》和上述命令的手册页。
7.3.2. 使用 virsh 调试内存
客机 XML 配置中可选的
<memtune> 元素允许管理员手动配置客户虚拟机内存设置。如果省略 <memtune>,内存设置将被默认应用。
通过
virsh memtune 命令显示或设置虚拟机 <memtune> 元素中的内存参数,依据环境替换属性值:
# virsh memtune virtual_machine --parameter size
可选的参数包括:
hard_limit- 虚拟机可以使用的最大内存,单位是千字节(1,024 字节块)
警告
该限制设置过低可导致虚拟机被内核终止。 soft_limit- 发生内存争用时,内存限制使用的单位是千字节(1,024字节块)。
swap_hard_limit- 虚拟机加上转化可使用的最大内存,单位是千字节(1,024 字节块)。
swap_hard_limit参数值必须大于hard_limit参数值。 min_guarantee- 保证分配给虚拟机可以使用的最小内存,单位是千字节(1,024 字节块)。
注意
使用
virsh memtune 命令的更多信息请参照 # virsh help memtune。
可选的
<memoryBacking> 元素可能包含若干影响主页存储备份虚拟内存页面的元素。
设置
locked 会阻止主机交换属于客机的内存页面。向客机 XML 添加以下命令,锁定主机内存中的虚拟内存页面:
<memoryBacking>
<locked/>
</memoryBacking>重要
设置
locked 时,必须在 <memtune> 元素中设置 hard_limit,使其达到客机配置的最大内存,以及该进程本身所消耗的内存。
设置
nosharepages 阻止主机合并在客机间使用的相同内存。通过向客机的 XML 添加以下命令,指示虚拟机监控程序禁用与客机的共享页面:
<memoryBacking>
<nosharepages/>
</memoryBacking>7.3.3. 大页面和透明大页面(THP)
x86 CPU 通常会在 4kB 页面中处理内存,但可以使用更大的 2MB 或 1GB 页面,即 huge page(大页面)。大页面内存可以支持 KVM 客机部署,通过增加点击转换后备缓冲器(TLB)的 CPU 缓存以改善性能。
kernel 功能将在 Red Hat Enterprise Linux 7 中默认启用,大页面可以大幅提高性能,尤其是对于较大的内存和内存密集型的负载。Red Hat Enterprise Linux 7 可以通过使用大页面增加页面大小,以便有效管理大量内存。
过程 7.1. 为客机启用 1GB 大页面
- Red Hat Enterprise Linux 7.1 系统支持 2MB 或 1GB 大页面,分配将在启动或运行时进行。页面大小均可以在运行时被释放。例如,在启动时分配 4 个 1GB 的大页面和 1,024 个 2MB 的大页面,请使用以下命令行:
'default_hugepagesz=1G hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=1024'
此外,大页面还可以在运行时分配。运行时分配允许系统管理员选择从何种 NUMA 模式分配页面。然而由于内存碎片的存在,运行时的页面分配会比启动时分配更容易造成分配失败。以下运行时的分配示例显示了从node1分配 4 个 1GB 的大页面以及从node3分配 1,024 个 2MB 的大页面:# echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages # echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
- 接下来,将 2MB 和 1GB 的大页面挂载到主机:
# mkdir /dev/hugepages1G # mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G # mkdir /dev/hugepages2M # mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M
- 重启 libvirtd,使 1GB 大页面可以在客机上启用:
# systemctl restart libvirtd
1GB 大页面现在对客机不可用。配置 NUMA 节点特定大页面,请参照第 8.4.9 节 “向多个客机 NUMA 节点指定主机大页面”。
7.3.3.1. 透明大页面配置
透明大页面(THP,transparent huge page)将为性能自动优化系统设置。通过允许所有的空余内存被用作缓存以提高性能。
一旦
/sys/kernel/mm/transparent_hugepage/enabled 被设置为 always,透明大页面将被默认使用。运行以下命令禁用透明大页面:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
透明大页面支持不能阻止 hugetlbfs 的使用。但在 hugetlbfs 未使用时,KVM 将使用透明大页面来替代常规的 4KB 页面大小。
7.3.3.2. 静态大页面配置
在某些情况下,更优的选择是增加对大页面的控制。在客机中使用静态大页面,使用
virsh edit 向客机 XML 配置添加以下命令:
<memoryBacking>
<hugepages/>
</memoryBacking>
以上命令使主机使用大页面向客机分配内存,以替代使用默认的页面大小。
在 Red Hat Enterprise Linux 7.1 中,主机中的大页面可以被分配到客机的 NUMA 节点。在客机 XML 的
<memoryBacking> 元素中指定大页面的大小、单位和客机的 NUMA 节点集。关于配置的更多信息和具体示例,请参照第 8.4.9 节 “向多个客机 NUMA 节点指定主机大页面”。
查看当前的大页面值,请运行以下命令:
cat /proc/sys/vm/nr_hugepages
过程 7.2. 大页面设置
以下程序示例显示了大页面设置的命令。
- 查看当前的大页面值:
# cat /proc/meminfo | grep HugeAnonHugePages: 2048 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB - 大页面将以 2MB 为增量进行设置。将大页面的数量设置到 25,000,请运行以下命令:
echo 25000 > /proc/sys/vm/nr_hugepages注意
此外,如需进行永久设置,请使用# sysctl -w vm.nr_hugepages=N命令和显示为大页面数量的 N。 - 大页面挂载:
# mount -t hugetlbfs hugetlbfs /dev/hugepages - 重启 libvirtd,之后再运行以下命令重启虚拟机:
# systemctl start libvirtd# virsh start virtual_machine - 验证
/proc/meminfo中的更改:# cat /proc/meminfo | grep HugeAnonHugePages: 0 kB HugePages_Total: 25000 HugePages_Free: 23425 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
大页面不仅可以使主机受益,也可以使客机受益。但它们的大页面值总量必须小于主机中的可用值。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.