2017-03-01 127 views
1

我运行systemd版本219 根@ EVOvPTX1_RE0-RE0:在/ var /日志#systemctl --version systemd 219 + PAM -audit -SELINUX + IMA -APPARMOR + SMACK + +的SysVInit UTMP -LIBCRYPTSETUP -GCRYPT + GNUTLS + ACL + XZ -LZ4 -SECCOMP + BLKID -ELFUTILS + KMOD -IDNsystemd内存限制不是强制

我有一个服务,我们称之为foo.service,它具有以下内容。

[服务] 的memoryLimit = 1G

我特意添加的代码分配1M存储器4096倍当接收到特定事件导致 4G内存ALLOC。这个想法是,在 该进程消耗1G的地址空间后,内存分配将开始失败。 但是,这似乎并非如此。我能够分配4G内存 没有任何问题。这告诉我 服务文件中指定的内存限制未被强制执行。

任何人都可以让我知道我错过了什么吗?

我看着proc文件系统 - 文件名为limits。这表明 最大地址空间是无限的,这也确认内存限制 没有得到强制执行。

回答

0

这种区别是你已经分配了内存,但是你还没有真正使用它。在top的输出中,这是“VIRT”内存列(分配)和“RES”列(实际使用)之间的差异。

尝试修改您的实验,将值分配给大型数组的元素,而不仅仅是分配内存并查看是否以此方式触发内存限制。

参考:Resident and Virtual memory on Linux: A short example

+0

感谢您的这个例子。我确实看到分配4G而不使用RES。只有在使用内存之后,我确实看到RES进入4G。但是,即使在服务文件中有“MemoryLimit = 1G”,我也能使VIRT和RES都达到4G。我使用的是systemd 219,它有点旧。是否systemd 219不支持资源管理? –