Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
7.3. 虚拟机内存调试
7.3.1. 内存监控工具
在裸机环境中使用的监控内存的工具也可以在虚拟机中使用。以下工具可以被用来监控内存的使用情况,以及诊断与内存相关的问题:
top
vmstat
numastat
/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 Huge
AnonHugePages: 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 Huge
AnonHugePages: 0 kB HugePages_Total: 25000 HugePages_Free: 23425 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
大页面不仅可以使主机受益,也可以使客机受益。但它们的大页面值总量必须小于主机中的可用值。