了解 systemd 服务中的内存限制:它们是针对每个进程的还是组合的?

了解 systemd 服务中的内存限制:它们是针对每个进程的还是组合的?

我的 Linux 系统上运行着一个名为 vcoagent.service 的 systemd 服务,我试图了解为该服务 ( Memory: 300.3M (limit: 500.0M)) 指定的内存限制如何应用于它管理的进程。

以下是 systemctl status vcoagent.service 的相关输出:

● vcoagent.service - Observability Agent
     Loaded: loaded (/etc/systemd/system/vcoagent.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-04-10 11:05:17 +07; 3h 38min ago
   Main PID: 134018 (vcoagent)
      Tasks: 59 (limit: 18691)
     Memory: 300.3M (limit: 500.0M)
     CGroup: /system.slice/vcoagent.service
             ├─134018 /root/vcoagent --opampServer=false --nodeExporter=true
             ├─134031 /root/vcoagent --opampServer=false --nodeExporter=true
             ├─134038 /proc/134031/fd/3
             └─134050 /proc/134031/fd/8 --config /tmp/otelcol/otelcol-config.yaml

我的问题是:内存限制 (500.0M) 是否单独适用于服务管理的每个进程( 134018、等),还是所有进程的组合限制?134031

例如,如果一个进程超出了其单独的内存限制,但所有进程的总内存使用量仍低于500.0M,则该服务是否会被视为在其内存限制之内?

如果您能澄清如何在服务上下文中强制执行 systemd 内存限制,我将不胜感激。谢谢你!

答案1

Linux 支持使用两种机制的限制

  • ulimit (主要是)每个进程
  • cgroups 限制添加到 cgroup 的进程组的总数

systemd 设置的大多数限制(包括这一限制)都是基于 cgroup。当systemd创建一个服务时,它会将服务中的所有进程放入一个cgroup中,并对cgroup应用限制。所以这些数字是整个 cgroup 的总数。

其中大部分内容在 systemd.resource-control 的手册页中进行了描述

相关内容