温馨提示×

如何限制linux进程内存

小樊
38
2026-09-03 11:24:56
栏目: 智能运维

在 Linux 下“限制进程内存”有多种方式,取决于你是临时运行程序写代码控制、还是系统级限制。下面按常见场景总结。


一、运行程序时限制(最常用)

1. ulimit(shell 级别)

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

ulimit -v 524288   # 限制虚拟内存为 512MB(单位 KB)
./your_program

常用参数:

  • -v:虚拟内存(virtual memory)
  • -m:常驻内存(RSS,很多系统已不严格生效)
  • -s:栈大小

⚠️ 只对当前 shell 会话有效。


2. systemd-run(推荐,现代 Linux)

临时用 systemd 启动受限进程:

systemd-run --scope -p MemoryMax=512M ./your_program

或长期服务:

[Service]
MemoryMax=512M

3. cgroups(系统级硬限制)

适用于服务器、容器。

cgcreate -g memory:/mygroup
echo 536870912 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
echo $PID > /sys/fs/cgroup/memory/mygroup/tasks

cgroup v2 示例:

echo 512M > /sys/fs/cgroup/mygroup/memory.max

4. 容器方式(Docker)

docker run -m 512m --memory-swap=512m myimage

二、在代码中限制(C / C++)

1. setrlimit(POSIX)

#include <sys/resource.h>

struct rlimit rl;
rl.rlim_cur = 512 * 1024 * 1024;
rl.rlim_max = 512 * 1024 * 1024;
setrlimit(RLIMIT_AS, &rl);
  • RLIMIT_AS:虚拟地址空间
  • RLIMIT_DATA:堆
  • RLIMIT_STACK:栈

三、防止 OOM(可选)

1. OOM Score 调整

echo 100 > /proc/$PID/oom_score_adj

值越大越容易被杀。

2. nice / cpulimit

虽然不是内存,但常一起用。


四、选择建议

场景 推荐方式
临时跑程序 ulimit / systemd-run
服务进程 systemd unit
多进程隔离 cgroup
容器 Docker / Kubernetes
程序自身控制 setrlimit

如果你能说明:

  • 命令行程序 / 服务 / 容器
  • 想限制 虚拟内存还是物理内存
  • 是否是 C / Python / Java

我可以给你更精确的示例。

0