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

相关推荐
勤劳的进取家12 小时前
传输层基础
运维·开发语言·学习·php
搬码后生仔12 小时前
【navicat不安装sql server直接远程连接服务器数据库】
运维·服务器·数据库
007张三丰13 小时前
系统架构设计师范文5:论负载均衡设计
运维·系统架构·负载均衡·软考·软考高级论文
志栋智能13 小时前
跨越人机边界:超自动化巡检如何重塑工作流程?
运维·网络·人工智能·安全·自动化
zzipeng13 小时前
IMX6ULL CAN通讯应用学习
linux·运维·网络
goyeer13 小时前
【ITIL】ITIL服务管理的四个维度
大数据·运维·信息化·自动运维·itil
中国lanwp13 小时前
CentOS 7 搭建 NFS Server 服务端 + 客户端 完整一键配置
linux·运维·centos
a2591748032-随心所记13 小时前
android拆解super.img内容
android·linux·运维·服务器
DO_Community13 小时前
DigitalOcean 打造 AI 原生云,帮助 AI 应用大幅降低成本与运维复杂度
运维·人工智能·agent·claude
实心儿儿13 小时前
Linux —— 文件系统_路径解析_软硬连接
linux·运维·服务器