8.3. 内核同页合并(KSM)
内核相同的页面合并(KSM)由 KVM 管理程序使用,允许 KVM 客户机共享相同的内存页。这些共享页面通常是常见的库或其他相同、高使用的数据。KSM 通过避免内存重复,可以增加相同或类似客户机操作系统的客户机密度。
共享内存的概念在现代操作系统中很常见。例如,在程序首次启动时,它会与父程序共享其所有内存。当子程序尝试修改此内存时,内核会分配一个新的内存区域,复制原始内容并允许程序修改这个新区域。这被称为 write(写时)的 copy。
KSM 是以相反方式使用此概念的 Linux 功能。KSM 使内核能够检查两个或多个已运行程序并比较它们的内存。如果任何内存区域或页面相同,则 KSM 会将多个相同内存页减至单个页面。然后,这个页会在 write 上标记为副本。如果 guest 虚拟机修改了页面的内容,则会为该 guest 创建一个新页面。
这对于使用 KVM 进行虚拟化非常有用。当客户机虚拟机启动时,它只会从主机
qemu-kvm
进程中继承内存。客户端运行后,客户机操作系统镜像的内容可在客户机运行相同的操作系统或应用程序时共享。KSM 允许 KVM 请求这些相同客户机内存区域已经共享。
KSM 提供增强的内存速度和利用率。通过 KSM,通用进程数据存储在缓存或主内存中。这可减少 KVM 客户机的缓存丢失,这可以提高某些应用程序和操作系统的性能。其次,共享内存可减少客户机的总内存用量,从而可以增加密度并增加资源的利用率。
注意
在 Red Hat Enterprise Linux 7 中,KSM 是 NUMA 感知功能。这样,它在合并页面时可以考虑 NUMA 本地性,从而避免与将页面移动到远程节点中的页面相关的性能下降。红帽建议在使用 KSM 时避免多节点内存合并。如果使用 KSM,将
/sys/kernel/mm/ksm/merge_across_nodes
可调项改为 0
,以避免在 NUMA 节点间合并页面。这可以通过 virsh node-memory-tune --shm-merge-across-nodes 0 命令实现。内核内存核算统计最终可在大量跨节点合并后相互冲突。因此,numad 在 KSM 守护进程合并大量内存后可能会变得混乱。如果您的系统有大量可用内存,可以通过关闭和禁用 KSM 守护进程来获得更高的性能。有关 NUMA 的更多信息,请参阅 第 9 章 NUMA"。
重要
确定 swap 大小足以用于提交的 RAM,即使不考虑 KSM。KSM 可减少相同或类似虚拟机的 RAM 使用量。可能会在没有足够 swap 空间的情况下使用 KSM 过量使用客户机,但不建议使用 guest 虚拟机内存使用可能会导致页面变得不共享。
Red Hat Enterprise Linux 使用两种单独的方法来控制 KSM:
这两个服务都使用标准服务管理工具进行控制。
注意
默认情况下,Red Hat Enterprise Linux 6.7 中会关闭 KSM。
8.3.1. KSM 服务
ksm
服务包括在 qemu-kvm 软件包中。- 当
ksm
服务没有启动时,内核相同页面合并(KSM)只共享 2000 个页面。此默认值提供有限的内存节省优势。 - 启动
ksm
服务后,KSM 将共享到主机系统主内存的一半。启动ksm
服务,使 KSM 能够共享更多内存。
# systemctl start ksm
Starting ksm: [ OK ]
ksm
服务可以添加到默认启动序列中。使用 systemctl 命令使 ksm
服务持久。
# systemctl enable ksm