Linux系统可以对用户的内存使用进行限制,不同的限制方式对应不同的资源管控粒度和生效范围,能够满足不同场景下的内存管控需求。

一、ulimit基础内存限制
ulimit是Linux系统自带的shell内置命令,主要用于限制当前shell会话以及该会话下启动的进程的资源使用,其中就包含内存相关的限制项。
1.1 常用内存限制参数
ulimit和内存相关的核心参数如下:
- -m:限制最大驻留内存(RSS),单位是KB,不过部分系统该参数仅作为提示,不强制生效
- -v:限制虚拟内存总大小,单位是KB,该限制会被大部分系统强制校验
- -l:限制可锁定的内存大小,单位是KB,一般用于需要锁定内存避免被换出的场景
1.2 临时配置示例
直接执行ulimit命令可以临时设置当前会话的内存限制,比如限制当前用户的虚拟内存为512MB:
# 限制虚拟内存为512MB,512*1024=524288KB ulimit -v 524288 # 查看当前虚拟内存限制 ulimit -v
这种方式设置的限制仅在当前shell会话有效,会话退出后限制会自动失效。
1.3 永久配置方式
如果需要让ulimit的限制永久生效,可以修改/etc/security/limits.conf文件,添加对应的配置项:
# 限制test用户的最大虚拟内存为512MB test hard as 524288 test soft as 524288
其中soft是软限制,用户可以自行调整但不能超过hard硬限制,配置完成后需要重新登录用户才能生效。需要注意ulimit的限制是对单个进程生效的,如果一个用户启动多个进程,所有进程的内存总和可能超过限制。
二、cgroup精细化内存限制
cgroup(控制组)是Linux内核提供的更强大的资源管控机制,可以对一组进程的内存使用进行统一限制,比ulimit的粒度更细,也更稳定可靠。
2.1 cgroup v1内存限制配置
首先需要确认系统是否挂载了cgroup内存子系统,然后创建对应的控制组:
# 创建名为user_limit的cgroup控制组 mkdir /sys/fs/cgroup/memory/user_limit # 限制该组最大内存使用为1GB,单位字节 echo 1073741824 > /sys/fs/cgroup/memory/user_limit/memory.limit_in_bytes # 限制内存加swap总使用为2GB echo 2147483648 > /sys/fs/cgroup/memory/user_limit/memory.memsw.limit_in_bytes
之后把需要限制的用户进程PID写入控制组的tasks文件即可生效:
# 假设目标进程PID为1234 echo 1234 > /sys/fs/cgroup/memory/user_limit/tasks
2.2 cgroup v2内存限制配置
较新的Linux系统默认使用cgroup v2,配置方式有所不同:
# 创建控制组 mkdir /sys/fs/cgroup/user_limit # 限制最大内存为1GB echo "1G" > /sys/fs/cgroup/user_limit/memory.max # 添加进程到控制组 echo 1234 > /sys/fs/cgroup/user_limit/cgroup.procs
cgroup的限制是对控制组内所有进程的内存总和生效,无论用户启动多少个进程,总内存使用都不会超过设置的上限,适合多进程服务的内存管控。
三、两种限制方式的对比
ulimit和cgroup的特点对比如下:
| 对比项 | ulimit | cgroup |
|---|---|---|
| 生效范围 | 单个进程 | 控制组内所有进程总和 |
| 限制稳定性 | 部分参数不强制生效 | 内核强制生效 |
| 配置持久化 | 需修改limits.conf | 需配合系统服务持久化 |
| 适用场景 | 临时测试、单进程限制 | 生产环境、多进程服务限制 |
四、注意事项
配置用户内存限制时需要注意以下几点:
- 内存限制设置过小可能导致进程启动失败或者运行中出现OOM(内存溢出)被系统杀死
- ulimit的限制对root用户默认不生效,需要单独配置root的限制规则
- cgroup的限制优先级高于ulimit,如果同时配置了两种方式,会以cgroup的限制为准
- 调整内存限制前建议先评估服务的正常内存使用峰值,避免出现资源不足的问题
Linux内存限制cgroupulimituser_limit修改时间:2026-06-20 00:00:32