内核同页合并KSM

KSM是Linux内核的一项节省内存的功能,通过合并相同内容的内存页来减少内存使用。KSM守护进程ksmd负责扫描内存并合并页面,可以通过madvise系统调用控制。sysfs接口提供了配置KSM的选项,如扫描页数和休眠时间。KSM适用于KVM等场景,但过度使用可能导致CPU消耗增加和性能下降。在实践中,应根据环境调整KSM设置,如在/etc/ksmtuned.conf中配置参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KSM(Kernel Samepage Merging)

共享内存的概念在现代操作系统中很常用了,比如,一个程序启动时会与父进程共用它的全部内存。当其中一个进程发生变化时,就会触发写时复制,把原来的内容写入到新的内存页中,再进行修改。这时其他的未改动的页面仍然是共享的。在执行完exec之后所有的页面不再共享,父子进程各有各的物理页。

共享内存是进程间通信的一种手段,多个进程的地址空间共享同一块物理内存,共享内存的进程在进行修改之后同样也会修改物理内存。

当linux启用了KSM之后,KSM会检查多个运行中的进程,并比对它们的内存。如果任何区域或者分页是一样的,KSM就会毫不犹豫地合并他们成一个分页。 那么新分页也是被标记成copy on write。如果VM要修改内存的话,那么linux就会分配新的内存给这个VM。

概述

KSM 是一种节省内存的重复数据删除功能,由 CONFIG_KSM=y 启用,在 2.6.32 中添加到 Linux 内核中。

KSM 最初是为与 KVM(在那里称为内核共享内存)一起使用而开发的,通过共享它们之间的公共数据,将更多虚拟机放入物理内存中。但它对于生成相同数据的许多实例的任何应用程序都非常有用。

KSM 守护进程 ksmd 会定期扫描那些已注册的用户内存区域,寻找可以被单个写保护页面(fork过后的父子进程页面只读)替换的相同内容页面(如果进程稍后想要更新其内容,则会自动复制该页面)。 KSM 守护进程在单次扫描中扫描的页面数量和两次扫描之间的时间使用sysfs 接口配置

KSM 只合并匿名(私有)页面,从不合并页面缓存(文件)页面。KSM 的合并页面最初被锁定在内核内存中,但现在可以像其他用户页面一样换出(但当它们换回时共享被破坏:ksmd 必须重新发现它们的身份并再次合并)。

使用 madvise 控制 KSM

通过使用 madvise(2) 系统调用,KSM 仅在应用程序建议作为合并候选对象的地址空间区域上运行:

int madvise(addr, length, MADV_MERGEABLE)

该应用程序可能会调用

int madvise(addr, length, MADV_UNMERGEABLE)

取消该建议并恢复未共享的页面:因此 KSM 取消合并它在该范围内合并的任何内容。注意:这个取消合并的调用可能会突然需要比可用内存更多的内存 - 可能会因 EAGAIN 而失败,但更有可能引起 Out-Of-Memory 杀手。

如果 KSM 未配置到正在运行的内核中,则 madvise MADV_MERGEABLE 和 MADV_UNMERGEABLE 只会以 EINVAL 失败。如果正在运行的内核是用 CONFIG_KSM=y 构建的,那么这些调用通常会成功:即使 KSM 守护进程当前没有运行,只要 KSM 守护进程启动,MADV_MERGEABLE 仍然会注册范围;即使该范围不能包含 KSM 可以实际合并的任何页面;即使MADV_UNMERGEABLE应用于一个从来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值