为什么 Ubuntu 12.04 上的内核共享内存为 0?

为什么 Ubuntu 12.04 上的内核共享内存为 0?

有人能向我解释一下为什么 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)

相关内容