温馨提示×

如何限制进程资源使用

小樊
93
2026-07-21 20:24:47
栏目: 编程语言

在 Linux 下限制进程资源使用,常见手段有 ulimit、cgroups、systemd、容器、nice/ionice 等,下面按使用场景系统说明。


一、临时限制(运行单个进程)

1️⃣ ulimit(最常用,适合 shell 会话)

限制当前 shell 及其子进程的资源。

ulimit -a        # 查看当前限制

常见示例

ulimit -u 1000        # 最大进程数
ulimit -n 65535       # 最大文件描述符
ulimit -v 1048576     # 最大虚拟内存(KB)
ulimit -m 524288      # 最大物理内存(KB)
ulimit -t 300         # CPU 时间(秒)
ulimit -f 100000      # 最大文件大小(KB)

⚠️ 注意:

  • 只对 当前 shell 生效
  • 非 root 用户只能 调小不能调大
  • 有些限制(如 -m)在现代 glibc 下可能不完全生效

2️⃣ nice / ionice(CPU & IO 优先级)

CPU 优先级

nice -n 10 ./app        # 降低优先级(19 最低)
renice -n 5 -p 1234     # 调整已有进程

IO 优先级

ionice -c 2 -n 7 ./app   # 空闲 IO

二、长期 / 强限制(推荐)

3️⃣ cgroups(最强大、最精确)

cgroups v1 示例(限制内存 + CPU)

# 创建 cgroup
mkdir /sys/fs/cgroup/mytest

# 限制内存 512MB
echo 536870912 > /sys/fs/cgroup/mytest/memory.limit_in_bytes

# 限制 CPU(50%)
echo 50000 > /sys/fs/cgroup/mytest/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/mytest/cpu.cfs_period_us

# 添加进程
echo $$ > /sys/fs/cgroup/mytest/cgroup.procs

✅ 适合:

  • 服务器
  • 多进程任务
  • 长期运行服务

三、使用 systemd(服务器最推荐)

4️⃣ systemd 限制服务资源

# /etc/systemd/system/myservice.service
[Service]
MemoryMax=512M
CPUQuota=50%
IOWeight=100
TasksMax=200
systemctl daemon-reload
systemctl restart myservice

✅ 优点:

  • 自动生效
  • 重启不丢失
  • 与 cgroups 集成

四、容器方式(最隔离)

5️⃣ Docker 限制

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

✅ 适合:

  • 环境隔离
  • 微服务
  • 多租户部署

五、按资源类型总结

资源 推荐方式
CPU 时间 ulimit -t / cgroups / systemd
CPU 优先级 nice / cgroups
内存 cgroups / systemd / Docker
进程数 ulimit -u / TasksMax
文件数 ulimit -n
IO ionice / cgroups
网络 cgroups / tc / iptables

六、生产环境建议 ✅

  • 临时测试:ulimit + nice
  • 长期服务:systemd + cgroups
  • 多租户/隔离:Docker / Kubernetes
  • 避免 OOM:优先用 cgroups 而不是 ulimit

如果你愿意,可以告诉我:

  • 是 临时跑程序 还是 长期服务
  • 想限制 CPU / 内存 / 进程数 / IO
  • 是 物理机 / 云服务器 / Docker

我可以给你一份 可直接用的配置模板。

0 踩