基于KVM虚拟化的cpu&内存超分&超卖技术的研究

目录

一、简介

二、内存超分(过量使用)

三、cpu超分(过量使用) 

四、内核同页合并(KSM) 

4.1 KSM 服务

4.2 KSM 调优服务

4.3 KSM变量和监控

4.4 停用 KSM


一、简介

KVM 虚拟机管理程序会自动过量分配 CPU 和内存。这意味着,与系统上的物理资源相比,可以分配给虚拟机的虚拟化 CPU 和内存更多。这是可能的,因为大多数进程不会始终访问 100% 的已分配资源。

因此,未充分利用的虚拟化服务器或桌面可以在较少的主机上运行,从而节省了大量系统资源,最终效果是减少功耗、冷却和服务器硬件投资。

二、内存超分(过量使用)

在 KVM 虚拟机管理程序上运行的虚拟机没有为其分配专用的物理 RAM 块。相反,每个虚拟机都充当一个 Linux 进程,其中主机物理机的 Linux 内核仅在请求时分配内存。此外,主机物理机的内存管理器可以在其自己的物理内存和交换空间之间移动虚拟机的内存。

过量使用要求在主机物理机上分配足够的swap交换空间来容纳所有虚拟机,并为主机物理机的进程分配足够的内存。作为基本规则,主机物理机的操作系统需要最大 4 GB 的内存以及至少 4 GB 的swap交换空间。有关确定交换分区的适当大小的高级说明,请参阅 Red Hat 知识库

重要

对于一般内存问题来说,过量使用并不是一个理想的解决方案。处理内存不足的推荐方法是为每个虚拟机分配较少的内存,向物理主机添加更多物理内存,或利用交换空间。

如果频繁交换虚拟机,则虚拟机的运行速度会变慢。此外,过量使用可能会导致系统内存不足 (OOM),从而导致 Linux 内核关闭重要的系统进程。如果您决定超额使用内存,请确保执行了足够的测试。请联系 Red Hat 支持部门,以获取有关过量使用的帮助。

过量使用不适用于所有虚拟机,但已发现在桌面虚拟化设置中工作,使用密集程度最低,或使用 KSM 运行多个相同的客户机。有关 KSM 和过量使用的更多信息,请参阅《Red Hat Enterprise Linux 7 虚拟化调优和优化指南》。 

重要

设备分配不支持内存过量使用。这是因为在使用设备分配时,必须静态预分配所有虚拟机内存,以便与分配的设备启用直接内存访问 (DMA)。

三、cpu超分(过量使用) 

KVM 虚拟机管理程序支持超额使用虚拟化 CPU (vCPU)。只要虚拟机的负载限制允许,虚拟化 CPU 可能会超额使用。超额使用 vCPU 时要小心,因为负载接近 100% 可能会导致请求丢失或响应时间不可用。

在 Red Hat Enterprise Linux 7 中,可能会对具有多个 vCPU(称为对称多处理 (SMP) 虚拟机)的虚拟机过量使用。但是,在虚拟机上运行的内核数多于物理 CPU 上存在的核心数时,可能会遇到性能下降的情况。

例如,具有四个 vCPU 的虚拟机不应在具有双核处理器的物理主机上运行,而应在四核物理主机上运行。由于程序获得的 CPU 时间少于所需时间,因此过度使用超过 SMP 虚拟机的物理处理核心数会导致性能显著下降。此外,不建议每个物理处理器核心分配的 vCPU 总数超过 10 个。

使用 SMP 虚拟机时,一些处理开销是固有的。CPU 过量使用可能会增加 SMP 开销,因为使用时间切片将资源分配给虚拟机可能会使虚拟机内部的 CPU 间通信变慢。随着拥有更多vCPU或者更高超配比的虚拟机增加,这种开销也会增加。。。

当单个物理主机具有多个虚拟机,并且每个虚拟机的 vCPU 数量与物理主机 CPU 数量相比较少,虚拟化 CPU 的过量使用效果最好。KVM 应以 5 个 vCPU(在 5 个虚拟机上)对 1 个物理主机上的 1 个物理 CPU 的比率安全地支持负载低于 100% 的虚拟机。KVM 虚拟机管理程序将在所有虚拟机之间切换,确保负载均衡。

为了获得最佳性能,Red Hat 建议仅为虚拟机分配运行每个虚拟机内部的程序所需的 vCPU。

重要

使用 100% 内存或处理资源的应用程序可能会在过度使用的环境中变得不稳定。请勿在未经大量测试的生产环境中过度使用内存或 CPU,因为 CPU 过度使用率和 SMP 量取决于工作负载。

四、内核同页合并(KSM) 

内核同页合并(KSM),由KVM虚拟机监控程序使用,允许KVM虚拟机共享相同的内存页面。这些共享页面通常是常用的公共库或其他相同的高使用率数据。KSM通过避免内存重复使用,允许在相同或相似的虚拟机操作系统中实现更高的虚拟机密度。

共享内存的概念在现代操作系统中非常普遍。例如,当一个程序首次启动时,它会与父程序共享其所有内存。当子程序或父程序尝试修改这段内存时,内核会分配一个新的内存区域,复制原始内容,并允许程序修改这个新区域。这被称为按需复制(copy on write)。

KSM是一个Linux特性,它以相反的方式使用此概念。KSM使内核能够检查两个或多个已经运行的程序并比较它们的内存。如果发现任何内存区域或页面是相同的,KSM会将多个相同的内存页面合并为一个页面。这个页面随后被标记为按需复制。如果虚拟机的客人修改了该页面的内容,内核会为该客人创建一个新页面。

这对于使用KVM进行虚拟化非常有用。当启动一个客虚拟机时,它仅继承主机qemu-kvm进程的内存。一旦虚拟机运行,该虚拟机操作系统镜像的内容可以在运行相同操作系统或应用程序的虚拟机之间共享。KSM允许KVM请求这些相同的客内存区域进行共享。

KSM提供了增强的内存速度和利用率。通过KSM,常见的进程数据存储在缓存或主内存中。这减少了KVM虚拟机的缓存未命中率,从而可以提高某些应用程序和操作系统的性能。其次,内存共享减少了虚拟机总内存的使用,这允许更高的密度和更大的资源利用率。

注意

在 Red Hat Enterprise Linux 7 中,KSM 能够识别 NUMA。这使它在合并页面时能够考虑 NUMA 局部性,从而防止与将页面移动到远程节点相关的性能下降。Red Hat 建议在使用 KSM 时避免跨节点内存合并。如果正在使用 KSM,请将
/sys/kernel/mm/ksm/merge_across_nodes
可调值更改为  0,以避免在 NUMA 节点之间合并页面。这可以通过
virsh node-memory-tune --shm-merge-across-nodes 0
命令来完成。在大量跨节点合并后,内核内存记帐统计信息最终可能会相互矛盾。因此,在 KSM 守护程序合并大量内存后,numad 可能会变得混乱。如果您的系统有大量的可用内存,您可以通过关闭和禁用 KSM 守护程序来获得更高的性能。有关  NUMA 的更多信息,请参见第 9 章 NUMA”。

重要

即使不考虑 KSM,也要确保交换大小足以满足提交的 RAM。KSM 可减少相同或相似客户机的 RAM 使用量。在没有足够交换空间的情况下,可能会过度使用具有 KSM 的客户机,但不建议这样做,因为使用客户机虚拟机内存可能会导致页面变得不共享。

Red Hat Enterprise Linux 使用两种不同的方法来控制 KSM:
  • ksm 服务启动和停止 KSM 内核线程。
  • ksmtuned 服务控制和调整服务,动态管理同页合并。 启动服务,如果不需要内存共享,则停止服务。创建或销毁新客户机时,必须使用 retune 参数指示运行。ksmksmtunedksmksmksmtuned
这两种服务都使用标准服务管理工具进行控制。

注意

默认情况下,KSM 在 Red Hat Enterprise Linux 6.7 上处于关闭状态。

4.1 KSM 服务

  • ksm服务包含在 qemu-kvm 软件包中。
  • ksm服务未启动时,内核同页合并 (KSM) 仅共享 2000 个页面。此默认值提供有限的内存节省优势。
  • ksm服务启动时,KSM 将共享主机系统最多一半的主内存。启动 ksm服务以使 KSM 能够共享更多内存。
# systemctl start ksm
Starting ksm: [ OK ]

可以将ksm服务添加到默认启动序列中。使用 systemctl 命令使ksm服务持久化。

systemctl enable ksm

4.2 KSM 调优服务

ksm​​​​​​​tuned服务通过循环和调整ksm来微调内核同页合并 (KSM) 配置。此外,当创建或销毁虚拟机时,libvirt 会通知​​​​​​​ksmtuned服务。​​​​​​​ksmtuned服务没有选项。

# systemctl start ksmtuned
Starting ksmtuned:                                         [  OK  ]
可以使用 retune 参数来调整ksmtuned服务,ksmtuned参数指示手动运行调整函数。​​​​​​​
/etc/ksmtuned.conf文件是​​​​​​​ksmtuned服务的配置文件。下面的文件输出是默认​​​​​​​ksmtuned.conf文件:
# Configuration file for ksmtuned.
# How long ksmtuned should sleep between tuning adjustments
# KSM_MONITOR_INTERVAL=60

# Millisecond sleep between ksm scans for 16Gb server.
# Smaller servers sleep more, bigger sleep less.
# KSM_SLEEP_MSEC=10

# KSM_NPAGES_BOOST - is added to the `npages` value, when `free memory` is less than `thres`.
# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY - is the value given is subtracted to the `npages` value, when `free memory` is greater than `thres`.
# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN - is the lower limit for the `npages` value.
# KSM_NPAGES_MIN=64

# KSM_NPAGES_MAX - is the upper limit for the `npages` value.
# KSM_NPAGES_MAX=1250

# KSM_THRES_COEF - is the RAM percentage to be calculated in parameter `thres`.
# KSM_THRES_COEF=20

# KSM_THRES_CONST - If this is a low memory system, and the `thres` value is less than `KSM_THRES_CONST`, then reset `thres` value to `KSM_THRES_CONST` value.
# KSM_THRES_CONST=2048

# uncomment the following to enable ksmtuned debug information
# LOGFILE=/var/log/ksmtuned
# DEBUG=1

在 /etc/ksmtuned.conf 文件中,npages 设置了在 ksmd 守护进程变为非活动状态之前,ksm 将扫描多少页面。这个值也会被设置在 /sys/kernel/mm/ksm/pages_to_scan 文件中。KSM_THRES_CONST 值表示用于激活 ksm 的可用内存阈值。当以下任一情况发生时,ksmd 将被激活:

  1. 可用内存量降至低于在 KSM_THRES_CONST 中设置的阈值。
  2. 已承诺的内存量加上阈值 KSM_THRES_CONST 超过总内存量。

4.3 KSM变量和监控

内核同页合并 (KSM) 将监控数据存储在/sys/kernel/mm/ksm/目录中。/etc/ksmtuned.conf目录中的文件由内核更新,是 KSM 使用情况和统计信息的准确记录。
如上所述,下面列表中的变量也是文件中的可配置变量。

/sys/kernel/mm/ksm/中的文件:

  • full_scans

运行完全扫描。

  • merge_across_nodes

来自不同 NUMA 节点的页面是否可以合并。

  • pages_shared

共享的总页数。

  • pages_sharing

当前共享的页面。

  • pages_to_scan

未扫描的页面。

  • pages_unshared

不再共享页面。

  • pages_volatile

易失效页数。

  • run
KSM 进程是否正在运行。
  • sleep_millisecs
睡眠毫秒。
可以使用virsh node-memory-tune命令手动调整这些变量。例如,以下代码指定了在共享内存服务进入睡眠状态之前要扫描的页数:
# virsh node-memory-tune --shm-pages-to-scan number

如果在 /etc/ksmtuned.conf 文件中添加 DEBUG=1 行,KSM 调优活动将被存储在 /var/log/ksmtuned 日志文件中。日志文件的位置可以通过 LOGFILE 参数进行更改。不建议更改日志文件的位置,这可能需要对 SELinux 设置进行特殊配置。

4.4 停用 KSM

内核同页合并 (KSM) 具有性能开销,对于某些环境或主机系统来说可能太大。KSM 还可能引入可能用于在客人之间泄露信息的侧信道。如果这是一个问题,可以根据每个客人禁用 KSM。
可以通过停止ksmtuned 和​​​​​​​ksm 服务来停用 KSM。但是,此操作在重新启动后不会持续存在。要停用 KSM,请以 root 身份在终端中运行以下命令:
# systemctl stop ksmtuned
Stopping ksmtuned:                                         [  OK  ]
# systemctl stop ksm
Stopping ksm:                                              [  OK  ]

停止 ksmtunedksm停用 KSM,但此操作在重新启动后不会持续存在。使用以下systemctl命令持续停用 KSM:​​​​​​​​​​​​​​

# systemctl disable ksm
# systemctl disable ksmtuned

禁用 KSM 后,在停用 KSM 之前共享的任何内存页仍将共享。要删除系统中的所有 PageKSM,请使用以下命令:

# echo 2 >/sys/kernel/mm/ksm/run

执行此操作后,khugepaged守护进程可以在 KVM 客户机物理内存上重建透明的大页面。使用# echo 0 >/sys/kernel/mm/ksm/run ​​​​​​​会停止 KSM,但不会取消共享所有以前创建的 KSM 页面(这与 #systemctl stop ksmtuned 命令相同)。​​​​​​​​​​​​​​

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术瘾君子1573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值