Systemd 资源限制未按预期工作

Systemd 资源限制未按预期工作

我正在运行带有 systemd 245 的 Ubuntu 20.04。

我正在测试 systemd 的资源控制功能;特别是内存使用控制。我的单元文件的相关部分如下所示:

[Unit]
Description=...
...

[Service]
...
MemoryMax=512M
#LimitAS=512M
#LimitDATA=512M

系统文档声称当达到 MemoryMax 时,服务会被“内存不足杀手”杀死。

但是,如果我运行旨在克服此限制的代码,例如以下 C++ 代码:

int main()
{
    while (true)
        char *p = new char[100];
}

相反,发生的情况(当我在 htop 中观看时)是“RES”内存攀升至 512MB 并停止,但“VIRT”内存继续攀升并且分配切换为使用交换。当交换空间耗尽时,操作系统最终会终止应用程序。

如果我使用 LimitAS 和/或 LimitDATA 选项,则应用程序会在达到 512MB 时被终止,正如预期的那样。

这里发生了什么? systemd 建议使用 MaxMemory 超过 LimitXXX(请参阅这里),那么为什么它们不以同样的方式工作呢?

答案1

答案是更仔细地阅读文档。尤其,这一段

为了简化过渡,两个版本的设置之间会尽力进行转换。对于每个控制器,如果存在统一层次结构的任何设置,则旧层次结构的所有设置都将被忽略。如果生成的设置适用于其他类型的层次结构,则在应用之前会转换配置。

我不太明白这里的第二句话,但显然我的系统没有使用统一的层次结构,并且我有另一个看似无关的设置 (AllowedCPUs=),它是仅统一层次结构的设置。删除该选项使 MemoryMax= 的行为符合预期。

相关内容