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 大页面

  1. 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
  2. 接下来,将 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
  3. 重启 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. 大页面设置

以下程序示例显示了大页面设置的命令。
  1. 查看当前的大页面值:
    # cat /proc/meminfo | grep Huge
    AnonHugePages:      2048 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
  2. 大页面将以 2MB 为增量进行设置。将大页面的数量设置到 25,000,请运行以下命令:
    echo 25000 > /proc/sys/vm/nr_hugepages

    注意

    此外,如需进行永久设置,请使用 # sysctl -w vm.nr_hugepages=N 命令和显示为大页面数量的 N
  3. 大页面挂载:
    # mount -t hugetlbfs hugetlbfs /dev/hugepages
  4. 重启 libvirtd,之后再运行以下命令重启虚拟机:
    # systemctl start libvirtd
    # virsh start virtual_machine
  5. 验证 /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
大页面不仅可以使主机受益,也可以使客机受益。但它们的大页面值总量必须小于主机中的可用值。