如何限制(systemd)服务的各个子进程的内存消耗?

如何限制(systemd)服务的各个子进程的内存消耗?

我正在开发一个在后台作业中处理文件的应用程序。这些作业由工作进程拾取,该进程为每个作业生成一个命令。工作主管进程在 systemd 单元中运行。

某些文件会导致执行的命令消耗过多的内存,从而导致系统的其余部分陷入饥饿。因此,我想限制每个生成的进程允许消耗的内存量。终止单个处理作业是可以接受的。

首先我尝试使用ulimit,但这似乎效果不佳。我的理解是“现代”方法是使用 cgroups(参见例如这里)。事实上,如果我跑

systemd-run --user --scope -p MemoryHigh=200M -p MemoryMax=250M MemorySwapMax=0M /path/to/program

如果输入文件导致程序分配更多内存,程序就会变慢并最终终止。伟大的!

我可以将这些内存限制添加到主管进程的 systemd 单元文件中,但是,如果一个作业消耗太多 RAM,这将终止所有作业和主管。

然后,我更改了应用程序代码,以使用systemd-run上面的“包装器”生成新进程。但是,这会失败

无法连接到总线:未找到介质

看起来我无法systemd-run --user在该服务的上下文中使用,该服务在 systemd 服务中作为非特权系统用户运行,因为它似乎需要一个活动的用户会话。systemd-run --system另一方面使用失败

无法启动瞬态作用域单元:需要交互式身份验证。

我宁愿避免以 root 身份运行该服务。

那么,如何限制我的服务生成的各个子进程的内存消耗呢?目前我在 Arch 上运行 systemd 251,但如果这也能在 Ubuntu 20.04 或 22.04 上运行,那就太好了。

相关内容