温馨提示×

怎样限制进程资源

小樊
51
2026-09-27 17:39:22
栏目: 编程语言

限制进程资源(CPU、内存、I/O、文件句柄等)在 Linux / Unix 系统中非常常见,常用于防止程序拖垮系统、做资源隔离、容器化、测试稳定性等。下面按使用场景和工具系统说明。


一、Linux 常用限制方式总览

方式 限制内容 适用场景
ulimit 文件数、线程数、内存等 当前 shell / 登录用户
systemd CPU、内存、IO 服务进程
cgroups 全面资源 容器、高级限制
nice / cpulimit CPU 使用率 临时限 CPU
timeout 运行时间 防止卡死
prlimit 运行时资源 精确控制进程

二、ulimit(最基础)

1. 查看限制

ulimit -a

2. 临时限制(仅当前 shell)

ulimit -u 100        # 最大进程/线程数
ulimit -n 1024       # 最大文件描述符
ulimit -v 500000     # 最大虚拟内存(KB)

3. 永久限制(用户级)

编辑:

/etc/security/limits.conf

示例:

user1 soft nofile 4096
user1 hard nofile 8192
user1 soft nproc 200

⚠ 只对新登录会话生效。


三、systemd 服务限制(推荐)

示例 service 文件

[Service]
ExecStart=/opt/app/bin/server
MemoryMax=512M
CPUQuota=50%
TasksMax=100
IOWeight=100

应用:

systemctl daemon-reexec
systemctl restart app.service

常用参数

  • MemoryMax
  • MemoryLimit
  • CPUQuota=80%
  • TasksMax
  • Nice=
  • IOSchedulingClass

✅ 生产环境最推荐方式


四、cgroups(底层 & 最强)

1. cgroup 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
cgexec -g cpu,memory:/mygroup ./app

2. cgroup v2(现代系统)

systemd-run --scope -p MemoryMax=300M -p CPUQuota=50% ./app

容器(Docker / Kubernetes)本质就是 cgroups。


五、限制 CPU 使用率

1. nice(优先级)

nice -n 10 ./app

2. cpulimit(限百分比)

cpulimit -p 1234 --limit=30

3. taskset(绑核)

taskset -c 0,1 ./app

六、限制运行时间(防卡死)

timeout 10s ./app

超时后发送 SIGTERM,可用:

timeout -s KILL 10s ./app

七、运行中修改限制(prlimit)

prlimit --pid 1234 --nofile=1024:2048
prlimit --pid 1234 --nproc=100

非常适合已在运行的进程。


八、Docker 示例(常用)

docker run \
  --memory=512m \
  --cpus=1.5 \
  --pids-limit=100 \
  myimage

九、选择建议

  • ✅ 服务进程 → systemd
  • ✅ 容器 → cgroups / Docker
  • ✅ 临时测试 → timeout / cpulimit
  • ✅ 精控 → prlimit
  • ❌ 不要依赖 ulimit 做生产限制

如果你能告诉我:

  • 操作系统(CentOS / Ubuntu / 容器?)
  • 想限制 哪种资源
  • 是一次性程序还是长期服务

我可以直接给你可复制的配置。

0 踩