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 生产环境的最佳实践。

相关推荐
青梅橘子皮21 小时前
Linux---开发工具(2)(makefile、进度条、git、gdb)
linux·运维·服务器
剑神一笑1 天前
Linux less 命令深度解析:从源码看分页器的设计智慧
linux·运维·less
李白你好1 天前
Linux 本地提权工具支持Linux 内核和 Polkit 漏洞
linux·运维·服务器
陳10301 天前
Linux:System V IPC
linux·运维·服务器
米高梅狮子1 天前
01.mysql的备份与恢复
运维·数据库·mysql·docker·容器·kubernetes·github
aFakeProgramer1 天前
在Ubuntu系统格式化SD卡,单分区/双分区
linux·运维·ubuntu
Hello--_--World1 天前
利用CDN进行首屏优化。能不能看CDN与本地服务器谁快用谁?
运维·服务器·前端·javascript·vite
云飞云共享云桌面1 天前
硬件采购省50%、设计效率提40%——通过云飞云共享云桌面一台云主机拖10人的真实跑法
运维·服务器·网络·人工智能·自动化
量子炒饭大师1 天前
【Linux系统编程】——【从0构建第一个Linux系统-进度条】从0到1分阶段构建动态进度条
linux·运维·服务器·进度条
小小ken1 天前
virtualbox中的ubuntu虚拟机登录到桌面后出现屏幕闪烁现象解决办法
linux·运维·ubuntu