有人能向我解释一下为什么 KSM 不工作吗,这是否意味着目前我的内核没有利用 KSM 来减少内存利用率。
grep KSM /boot/config-3.2.0-23-generic
CONFIG_KSM=y
cat /sys/kernel/mm/ksm/pages_shared
0
cat /sys/kernel/mm/ksm/pages_sharing
0
cat /sys/kernel/mm/ksm/pages_unshared
0
内核:3.2.0-23-通用
Ubuntu 12.04 LTS 64 位桌面
免费-m
total used free shared buffers cached
Mem: 1964 1883 81 0 11 228
-/+ buffers/cache: 1644 320
Swap: 2008 485 1523
ipcs-m 命令
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 myexperiments 600 393216 2 dest
0x00000000 2490369 myexperiments 600 393216 2 dest
0x00000000 98306 myexperiments 600 393216 2 dest
0x00000000 2523139 myexperiments 600 393216 2 dest
0x00000000 13008900 myexperiments 666 262080 1 dest
0x00000000 1245189 myexperiments 666 4 2 dest
0x00000000 1277958 myexperiments 666 4 1 dest
0x00000000 6520839 myexperiments 600 393216 2 dest
0x00000000 14811144 myexperiments 666 1277760 3 dest
0x00000000 12648458 myexperiments 666 300000 1 dest
0x00000000 8060939 myexperiments 666 300000 1 dest
0x00000000 12943373 myexperiments 666 300000 2 dest
0x00000000 12976142 myexperiments 666 262080 2 dest
0x00000000 13271055 myexperiments 666 300000 2 dest
答案1
除非应用软件通过调用 告诉它,否则 KSMD 不会执行任何操作madvise(MADV_MERGEABLE)
。最有可能的是,您没有使用任何使用 KSMD 服务的应用软件。
MADV_MERGEABLE(自 Linux 2.6.32 起):
为 addr 和 length 指定范围内的页面启用内核同页合并 (KSM)。内核定期扫描已标记为可合并的用户内存区域,查找具有相同内容的页面。这些页面将被单个写保护页面替换(如果某个进程稍后想要更新页面内容,则会自动复制该页面)。KSM 仅合并私有匿名页面(请参阅 mmap(2))。
KSM 功能适用于生成相同数据的许多实例的应用程序(例如 KVM 等虚拟化系统)。它会消耗大量处理能力;请谨慎使用。有关更多详细信息,请参阅内核源文件 Documentation/vm/ksm.txt。仅当内核配置了 CONFIG_KSM 时,MADV_MERGEABLE 和 MADV_UNMERGEABLE 操作才可用。
答案2
在什么之上David Schwartz 表示,需要定义应用程序通过madvise
哪个页面可以被授权进行合并,还有一个设置需要在 Ubuntu 上激活才能ksm
使其工作:
sudo bash -c "echo 1 > /sys/kernel/mm/ksm/run"
您可以先检查当前值:cat /sys/kernel/mm/ksm/run
在我的 Ubuntu 14.04.3 LTS 和 Ubuntu 15.04 机器上,它的值是0
。以下是根据Kernel Samepage Merging
内核文档:
如何使用内核同页合并功能
run - set 0 to stop ksmd from running but keep merged pages, set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run", set 2 to stop ksmd and unmerge all pages currently merged, but leave mergeable areas registered for next run Default: 0 (must be changed to 1 to activate KSM, except if CONFIG_SYSFS is disabled)