Virtualbox 内存未反映在其 cgroup 中

Virtualbox 内存未反映在其 cgroup 中

我试图使用 cgroups 限制用户可以使用的内存量(使用带有 systemd 的 Ubuntu 16.04)。

设置 user-.slice 的 MemoryLimit 属性后,我可以看到其 cgroup 中反映的更改memory.limit_in_bytes

但是,当该用户运行 VirtualBox VM 时,即使 VirtualBox 显示为使用 2GB RAM(请参阅ps下面的输出),该内存也不会反映在 cgroupmemory.usage_in_bytes文件中:

$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.usage_in_bytes
1353863168

我可以在 cgroups 文件中看到 VirtualBox 进程 ID tasks

$ ps un -p 19678
    USER   PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    1001 19678 97.4 29.4 4660560 2378040 ?     Sl   07:25   3:48 /usr/lib/virtualbox/VirtualBox
$ grep 19678 /sys/fs/cgroup/memory/user.slice/user-1001.slice/tasks
19678

memory.statcgroup 的文件显示以下值:

$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.stat
cache 423411712
rss 880754688
rss_huge 331350016
mapped_file 176910336
dirty 307200
writeback 0
pgpgin 14357052
pgpgout 14129610
pgfault 14533957
pgmajfault 16595
inactive_anon 546553856
active_anon 447401984
inactive_file 151785472
active_file 158326784
unevictable 36864
hierarchical_memory_limit 5368709120
total_cache 423411712
total_rss 880754688
total_rss_huge 331350016
total_mapped_file 176910336
total_dirty 307200

根据内存.txtrss + cache应该给出更准确的版本memory.usage_in_bytes。结果是1304166400,甚至更低。

那么为什么VirtualBox的内存被遗漏了呢?

编辑:添加了详细的输出和memory.stat文件。

答案1

我有一种感觉这个文件会对你有很大帮助(尤其是第 5.5 节和 5.2 节)。我将尽力在这里进行总结。

我得到的最好的解释是,其中提供的数字memory.usage_in_bytes并不是非常精确,而是旨在提供有关某些东西正在使用的内存量的一般概念。memory.stat可能会为您提供关于不同进程使用的内存的更精确(尽管更复杂)的概念。如果内存使用情况没有显示在那里,那么您可能遇到了更大的问题。

编辑:如果您继续阅读该文档的第 5.2 部分,会发现一些附加信息:

仅匿名和交换高速缓存内存被列为“rss”统计信息的一部分。不应将其与真正的“驻留集大小”或 cgroup 使用的物理内存量相混淆。 'rss + file_mapped" 将为您提供 cgroup 的驻留集大小。(注意:文件和 shmem 可能在其他 cgroup 之间共享。在这种情况下,仅当内存 cgroup 是页面缓存的所有者时,才会考虑 file_mapped。)

在这种情况下,仍然无法解决您所看到的问题,这使我相信 virtualbox 进程的所有者并不是 virtualbox 进程使用的所有页面缓存的所有者。

我建议的最后一个健全性检查是检查 OOM Killer 日志并查看 OOM Killer 是否处于活动状态。当 OOM 杀手处于活动状态时,您可以从内存日志中得到奇怪的结果。

相关内容