限制进程资源(CPU、内存、I/O、文件数等)在 Linux / Unix 系统中非常常见,常用于多租户隔离、稳定性保障、防止异常进程拖垮系统。下面按使用场景系统介绍几种主流方法。
如果是服务进程(如 Nginx、Java 应用),最规范的方式是用 systemd。
[Service]
CPUQuota=50%
表示最多使用 1 个核的 50%。
[Service]
MemoryLimit=512M
MemoryMax=512M
TasksMax=100
LimitNOFILE=1024
systemctl daemon-reload
systemctl restart your-service
✅ 优点:持久、稳定、可审计
❌ 缺点:仅适用于 systemd 管理的服务
适用于登录用户 / shell 启动的进程。
ulimit -a
ulimit -u 100 # 最大进程数
ulimit -n 1024 # 文件描述符
ulimit -v 524288 # 虚拟内存(KB)
编辑:
/etc/security/limits.conf
user1 soft nproc 100
user1 hard nproc 200
✅ 优点:简单
❌ 缺点:对 already running 进程无效
systemd 其实就是 cgroups 的封装。
cgcreate -g cpu,memory:/mygroup
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
echo 512M > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
cgclassify -g cpu,memory:/mygroup PID
✅ 优点:精细、底层
❌ 缺点:复杂,维护成本高
nice -n 10 ./app
cpulimit -p 1234 --limit=30
✅ 适合临时限制
❌ 不稳定,不防内存爆炸
docker run -m 512m --cpus=1.5 app
resources:
limits:
cpu: "1"
memory: "512Mi"
✅ 生产环境最佳实践
| 场景 | 推荐方式 |
|---|---|
| 后台服务 | systemd |
| 临时脚本 | ulimit / cpulimit |
| 多租户服务器 | cgroups |
| 微服务 | Docker / K8s |
| 防内存泄漏 | MemoryLimit |
如果你能告诉我:
我可以给你精确可直接用的配置。