温馨提示×

如何限制进程资源

小樊
45
2026-10-06 12:15:40
栏目: 编程语言

限制进程资源(CPU、内存、I/O、文件数等)在 Linux / Unix 系统中非常常见,常用于多租户隔离、稳定性保障、防止异常进程拖垮系统。下面按使用场景系统介绍几种主流方法。


一、使用 systemd(推荐,服务器首选)

如果是服务进程(如 Nginx、Java 应用),最规范的方式是用 systemd。

1. 限制 CPU

[Service]
CPUQuota=50%

表示最多使用 1 个核的 50%。

2. 限制内存

[Service]
MemoryLimit=512M
MemoryMax=512M

3. 限制进程 / 文件数

TasksMax=100
LimitNOFILE=1024

4. 重新加载

systemctl daemon-reload
systemctl restart your-service

✅ 优点:持久、稳定、可审计
❌ 缺点:仅适用于 systemd 管理的服务


二、使用 ulimit(用户级限制)

适用于登录用户 / 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 进程无效


三、使用 cgroups(底层、最强大)

systemd 其实就是 cgroups 的封装。

cgroups v1 示例(简化)

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 / cpulimit(CPU 软限制)

1. nice(优先级)

nice -n 10 ./app

2. cpulimit(动态限制)

cpulimit -p 1234 --limit=30

✅ 适合临时限制
❌ 不稳定,不防内存爆炸


五、使用容器(Docker / Kubernetes)

Docker

docker run -m 512m --cpus=1.5 app

Kubernetes

resources:
  limits:
    cpu: "1"
    memory: "512Mi"

✅ 生产环境最佳实践


六、常见场景建议

场景 推荐方式
后台服务 systemd
临时脚本 ulimit / cpulimit
多租户服务器 cgroups
微服务 Docker / K8s
防内存泄漏 MemoryLimit

如果你能告诉我:

  • 操作系统(CentOS / Ubuntu / 容器?)
  • 想限制哪种资源(CPU / 内存 / 进程数?)
  • 是服务还是普通命令

我可以给你精确可直接用的配置。

0 踩