systemd + cgroups v2 限制agent资源消耗

在 Linux 系统中,为了确保业务服务程序能获得尽可能多的 CPU 和内存资源,同时限制 agent(如监控、指标采集、安全扫描等)对系统资源的消耗,最佳实践是使用 Linux 的 cgroups(Control Groups)机制。cgroups 是 Linux 内核提供的资源隔离和限制功能,广泛用于容器化技术(如 Docker、Kubernetes)中,也适用于裸机环境。


✅ 方案:使用 systemd + cgroups v2(现代 Linux 发行版默认)

适用于 CentOS/RHEL 8+、Ubuntu 20.04+、Debian 11+ 等支持 cgroups v2 的系统。

步骤 1:确认系统使用的是 cgroups v2

复制代码
mount | grep cgroup

如果看到 cgroup2 挂载点(通常是 /sys/fs/cgroup),说明是 cgroups v2。


步骤 2:为每个 agent 创建独立的 systemd service(如果尚未创建)

假设你的 agent 是 my-agent,可创建:

复制代码
# /etc/systemd/system/my-agent.service
[Unit]
Description=My Monitoring Agent
After=network.target

[Service]
ExecStart=/usr/local/bin/my-agent
Restart=always
User=agentuser
# 关键:限制资源
CPUQuota=10%          # 最多使用 10% 的 CPU(单核为 100%,4核则 10% = 0.4 核)
MemoryMax=200M        # 最大内存 200MB(硬限制)
MemoryHigh=150M       # 软限制,超过后可能被回收但不 kill
Nice=19               # 降低调度优先级(-20~19,19 最低)
IOSchedulingClass=3   # idle I/O 优先级
IOSchedulingPriority=7

[Install]
WantedBy=multi-user.target

说明

  • CPUQuota=10%:限制 CPU 使用率,例如 4 核机器最多用 0.4 核。
  • MemoryMax:硬限制,超限会被 OOM kill。
  • MemoryHigh:软限制,系统内存紧张时优先回收。
  • Nice=19:让出 CPU 调度优先级给业务进程。
  • IOSchedulingClass=3:I/O 优先级设为 idle,避免影响磁盘性能。

步骤 3:重载并启用服务

复制代码
systemctl daemon-reload
systemctl enable --now my-agent

步骤 4:验证资源限制是否生效

复制代码
# 查看 cgroup 信息
systemctl show my-agent.service | grep -E "CPU|Memory"

# 实时监控
systemd-cgtop

或直接查看:

复制代码
cat /sys/fs/cgroup/system.slice/my-agent.service/cpu.max
cat /sys/fs/cgroup/system.slice/my-agent.service/memory.max

🔧 补充建议

1. 限制所有 agent 到一个统一 slice(可选)

如果有多类 agent(监控、日志、安全等),可统一归入 agent.slice

复制代码
# 在 service 文件中添加
Slice=agent.slice

然后全局限制整个 slice:

复制代码
# 创建 /etc/systemd/system/agent.slice
[Unit]
Description=Agent Slice for Resource Limitation

[Slice]
CPUQuota=15%
MemoryMax=500M

这样便于统一管理。


2. 避免 agent 在业务高峰期运行

对于非实时任务(如安全扫描),可配合 cronsystemd timer 在业务低峰期执行,并在脚本中临时提升限制(或保持低优先级)。


3. 监控业务进程资源使用

确保业务服务没有被限制,必要时可为其设置高优先级:

复制代码
Nice=-10
CPUWeight=1000  # cgroups v2 中权重(默认 100,值越大优先级越高)

⚠️ 注意事项

  • 不要完全禁用 agent:监控和安全是保障业务稳定的基础。
  • 测试限制参数:过严可能导致 agent 功能异常(如无法上报指标)。
  • 内存限制单位 :支持 K/M/G,如 200M1G
  • 旧系统(cgroups v1) :可用 cgcreate + cgexec,但推荐升级或使用 systemd 方式兼容。

✅ 总结:最佳实施方案

目标 措施
限制 CPU CPUQuota=10% + Nice=19
限制内存 MemoryMax=200M + MemoryHigh=150M
降低 I/O 影响 IOSchedulingClass=3
统一管理 使用 Slice=agent.slice
优先保障业务 业务进程不设限,甚至提高权重

通过 systemd + cgroups v2 的方式,无需额外安装工具,配置清晰、可持久化、易于维护,是当前 Linux 生产环境的最佳实践。

相关推荐
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅2 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒2 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11332 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
ZeroNews内网穿透2 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全
失重外太空啦2 天前
nginx
运维·nginx
Gofarlic_oms12 天前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab
田井中律.2 天前
服务器部署问题汇总(ubuntu24.04.3)
运维·服务器
大大水瓶2 天前
HAProxy 从入门到实战:负载均衡与流量管理全解析
运维·负载均衡