【问题标题】:systemd MemoryLimit not enforcedsystemd MemoryLimit 未强制执行
【发布时间】:2017-07-21 09:10:41
【问题描述】:

我正在运行 systemd 版本 219。 root@EVOvPTX1_RE0-re0:/var/log# systemctl --version 系统 219 +PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN

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

[服务] 内存限制=1G

我故意添加代码来分配 1M 内存 4096 次导致 接收到某个事件时分配 4G 内存。这个想法是,之后 该进程消耗 1G 的地址空间,内存分配将开始失败。 然而,情况似乎并非如此。我可以分配4G内存 没有任何问题。这告诉我在 服务文件未强制执行。

谁能告诉我我错过了什么?

我查看了 proc 文件系统 - 名为 limits 的文件。这表明 Max address space is Unlimited,这也确认了内存限制 没有得到强制执行。

【问题讨论】:

  • 您是否在 systemd 的用户实例中运行此服务?
  • systemd 使用 cgroups 来强制执行限制,因此您不会通过 ulimit 或在 proc 中看到任何内容。

标签: systemd


【解决方案1】:

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

尝试修改您的实验,将值分配给大型数组的元素,而不是仅仅分配内存,看看您是否以这种方式达到了内存限制。

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

【讨论】:

  • 感谢这个例子。我确实看到在不使用的情况下分配 4G 会保持 RES 不变。只有在使用内存后,我确实看到 RES 到了 4G。但是,即使在服务文件中使用“MemoryLimit=1G”,我也可以让 VIRT 和 RES 都达到 4G。我正在使用 systemd 219,它有点旧。难道是systemd 219不支持资源管理?
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 2011-03-02
  • 2021-09-26
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多