在 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 在业务高峰期运行
对于非实时任务(如安全扫描),可配合 cron 或 systemd timer 在业务低峰期执行,并在脚本中临时提升限制(或保持低优先级)。
3. 监控业务进程资源使用
确保业务服务没有被限制,必要时可为其设置高优先级:
Nice=-10
CPUWeight=1000 # cgroups v2 中权重(默认 100,值越大优先级越高)
⚠️ 注意事项
- 不要完全禁用 agent:监控和安全是保障业务稳定的基础。
- 测试限制参数:过严可能导致 agent 功能异常(如无法上报指标)。
- 内存限制单位 :支持 K/M/G,如
200M、1G。 - 旧系统(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 生产环境的最佳实践。