我的 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 的手册页中进行了描述