在 Debian(以及绝大多数 Linux 发行版)中,ulimit 主要用于限制每个用户或每个进程可使用的系统资源。它并不是直接“控制进程”,而是给进程能申请到的资源设定上限。下面从原理、常见限制、对进程的影响、如何查看/修改几个方面说明。
ulimit 是 shell 内置命令,用来设置和查看 shell 启动的进程 的资源限制。
这些限制本质是 Linux 的 rlimit(resource limit)机制,适用于:
⚠️ 注意:
ulimit 只对当前 shell 会话有效,不会全局影响系统。
ulimit -n
Too many open files
✅ 临时修改:
ulimit -n 65535
ulimit -u
fork: retry: No child processes
ulimit -s
✅ 常见设置:
ulimit -s 8192 # 8MB
| 限制项 | 说明 |
|---|---|
ulimit -v |
虚拟内存 |
ulimit -m |
物理内存(现代系统大多忽略) |
⚠️ 在 Debian 上:
-v 是 软限制ulimit -c
0:不生成 core 文件unlimited:生成 core dump✅ 调试段错误时非常重要。
每个资源都分两种限制:
| 类型 | 说明 |
|---|---|
| 软限制(soft) | 进程可自行修改(但不能超过 hard) |
| 硬限制(hard) | 只有 root 能修改 |
查看:
ulimit -a
ulimit -Sa
ulimit -Ha
ulimit -n 65535
✅ 只对当前 shell 及其子进程有效
编辑:
/etc/security/limits.conf
示例:
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
⚠️ 需要:
pam_limits.so)⚠️ systemd 会忽略 ulimit / limits.conf
需要在 service 文件中设置:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
然后:
systemctl daemon-reexec
systemctl restart xxx
| 项目 | 影响 |
|---|---|
| 文件描述符 | 决定 socket / 文件并发能力 |
| 进程数 | 决定线程池 / 子进程数量 |
| core dump | 影响故障排查 |
| 栈大小 | 影响线程创建 |
| 内存 | 辅助限制,非绝对 |
❌ ulimit 是系统全局限制
✅ 实际是 用户级 / 进程级
❌ 修改 ulimit 会影响所有进程
✅ 只影响 后续启动的进程
❌ Java 内存不够就调 ulimit
✅ Java 内存是 JVM 参数,不是 ulimit
查看某进程限制:
cat /proc/<pid>/limits
查看当前 shell:
ulimit -a
如果你愿意,我可以:
只要告诉我你的使用场景即可。