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

相关推荐
l2ohvef1 天前
Windows 7 虚拟机 VMware Tools 安装失败:无法自动安装VSock 驱动程序
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志1 天前
从零开始写Linux字符设备驱动:一个不操作硬件的Hello驱动
linux·运维·数据库
Benszen1 天前
Ansible自动化运维实战
linux·运维·自动化·ansible
艾莉丝努力练剑1 天前
C++ 核心编程练习:从基础语法到递归、重载与宏定义
linux·运维·服务器·c语言·c++·学习
Dontla1 天前
(龙虾)OpenClaw(原 Clawdbot / Moltbot)常见部署方式介绍(Linux部署、Windows桌面部署)
linux·运维·服务器
菜鸟z级1 天前
在新电脑装ubuntu包
linux·运维·ubuntu
yumgpkpm1 天前
华为昇腾910B上用Kubernetes(K8s)部署LLM(Qwen3-32B)的详细步骤,保姆级命令及方法、下载链接等
运维·服务器·华为·stable diffusion·aigc·copilot·llama
木鱼布1 天前
CentOS7配置vsftpd
linux·运维
my_styles1 天前
linux系统下安装 tengine / 宝兰德等国产信创中间件和闭坑
linux·运维·服务器·spring boot·nginx·中间件
Gofarlic_OMS1 天前
HyperWorks用户仿真行为分析与许可证资源分点配置
java·大数据·运维·服务器·人工智能