今天我们遇到了一个有趣的错误。在我们的服务器上,我们将用户放入 cgroup 文件夹中,以监视和控制 cpu 和内存等资源的使用情况。当尝试添加用户特定的内存 cgroup 文件夹时,我们开始遇到错误:
mkdir /sys/fs/cgroup/memory/users/newuser
mkdir: cannot create directory ‘/sys/fs/cgroup/memory/users/newusers’: Cannot allocate memory
这看起来有点奇怪,因为机器实际上有合理数量的可用内存和交换空间。将sysctl
值从 0更改vm.overcommit_memory
为 1 没有效果。
我们确实注意到,我们正在运行大量特定于用户的子文件夹(实际上大约 7,000 个),其中大多数是为不再在该计算机上运行进程的用户提供的。
ls /sys/fs/cgroup/memory/users/ | wc -l
7298
删除 cgroup 层次结构中未使用的文件夹实际上解决了问题
cd /sys/fs/cgroup/memory/users/
ls | xargs -n1 rmdir
# errors for folders in-use, succeeds for unused
mkdir /sys/fs/cgroup/memory/users/newuser
# now works fine
有趣的是,这个问题只影响内存 cgroup。 cpu/accounting cgroup 很好,尽管它实际上在层次结构中有更多用户:
ls /sys/fs/cgroup/cpu,cpuacct/users/ | wc -l
7450
mkdir /sys/fs/cgroup/cpu,cpuacct/users/newuser
# fine
那么,是什么导致了这些内存不足错误呢? memory-cgroup 子系统本身是否有某种内存限制?
可以找到cgroup挂载的内容这里
答案1
每个 cgroup 确实有限制,您可以阅读相关内容在LWN.net上:
每个 cgroup 都有一个与其关联的内存控制器特定数据结构 (mem_cgroup)。
.... 记账按 cgroup 进行。
最大内存量存储在/sys/fs/cgroup/内存/内存.limit_in_bytes。如果您遇到的问题确实与组组内存限制,那么/sys/fs/cgroup/内存/内存.max_usage_in_bytes应接近上述内容,您也可以通过检查来检查内存故障,记录您的实际使用量达到上述限制的次数。
也许您还可以检查内存.kmem.failcnt和内存.kmem.tcp.failcnt有关内核内存和 tcp 缓冲区内存的类似统计信息。