我试图使用 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.stat
cgroup 的文件显示以下值:
$ 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
根据内存.txt,rss + 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 杀手处于活动状态时,您可以从内存日志中得到奇怪的结果。