限制进程资源(CPU、内存、I/O、文件句柄等)在 Linux / Unix 系统中非常常见,常用于防止程序拖垮系统、做资源隔离、容器化、测试稳定性等。下面按使用场景和工具系统说明。
| 方式 | 限制内容 | 适用场景 |
|---|---|---|
ulimit |
文件数、线程数、内存等 | 当前 shell / 登录用户 |
systemd |
CPU、内存、IO | 服务进程 |
cgroups |
全面资源 | 容器、高级限制 |
nice / cpulimit |
CPU 使用率 | 临时限 CPU |
timeout |
运行时间 | 防止卡死 |
prlimit |
运行时资源 | 精确控制进程 |
ulimit -a
ulimit -u 100 # 最大进程/线程数
ulimit -n 1024 # 最大文件描述符
ulimit -v 500000 # 最大虚拟内存(KB)
编辑:
/etc/security/limits.conf
示例:
user1 soft nofile 4096
user1 hard nofile 8192
user1 soft nproc 200
⚠ 只对新登录会话生效。
[Service]
ExecStart=/opt/app/bin/server
MemoryMax=512M
CPUQuota=50%
TasksMax=100
IOWeight=100
应用:
systemctl daemon-reexec
systemctl restart app.service
MemoryMaxMemoryLimitCPUQuota=80%TasksMaxNice=IOSchedulingClass✅ 生产环境最推荐方式
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
systemd-run --scope -p MemoryMax=300M -p CPUQuota=50% ./app
容器(Docker / Kubernetes)本质就是 cgroups。
nice -n 10 ./app
cpulimit -p 1234 --limit=30
taskset -c 0,1 ./app
timeout 10s ./app
超时后发送 SIGTERM,可用:
timeout -s KILL 10s ./app
prlimit --pid 1234 --nofile=1024:2048
prlimit --pid 1234 --nproc=100
非常适合已在运行的进程。
docker run \
--memory=512m \
--cpus=1.5 \
--pids-limit=100 \
myimage
timeout / cpulimitprlimitulimit 做生产限制如果你能告诉我:
我可以直接给你可复制的配置。