在 CentOS(以及其它 Linux 发行版)里,ulimit 和内存是有关的,但它是“间接相关”,而且只能控制“用户进程级”的资源,不能代替系统内存管理。
下面分点说清楚:
ulimit 是什么ulimit 是 shell 级别 的资源限制工具,用来限制:
它不是内核参数,也不是全局内存管理器。
ulimit 和内存直接相关的参数ulimit -a
常见相关项:
| 参数 | 含义 | 是否和内存有关 |
|---|---|---|
-v |
虚拟内存上限(KB) | ✅ 非常相关 |
-m |
常驻内存(RSS,很多系统已忽略) | ⚠️ 基本无效 |
-s |
栈大小(stack size) | ✅ 间接相关 |
-d |
数据段大小 | ✅ 间接相关 |
示例:
ulimit -v 2097152 # 限制虚拟内存为 2GB
-v(虚拟内存)是最关键的Cannot allocate memory
或进程被 kill⚠️ 注意:
虚拟内存 ≠ 物理内存,即使你物理内存很大,也可能被 -v 限制。
ulimit 不能做什么(重要)❌ 不能限制:
✅ 真正控制内存的应该是:
cgroup / systemd 的 MemoryLimitsysctl 参数ulimit -v 太小
导致 JVM 还没用完物理内存就挂了。
通过 /etc/security/limits.conf 设置:
mysql soft nofile 65535
mysql hard nofile 65535
但 内存仍建议用 systemd 限制:
[Service]
MemoryLimit=2G
ulimit -a
cat /proc/<pid>/limits
ulimit -v 4194304
/etc/security/limits.conf
或
/etc/systemd/system/xxx.service
ulimit和内存有关,但只限制“单个用户/进程的虚拟内存等资源”,不是系统内存管理工具。
如果你有具体场景(比如 Java、Docker、CentOS 7/8),我可以给你更针对性的建议。