ulimit 是什么
ulimit 是 shell 内建命令,用来查看和设置当前会话及其子进程的资源上限:打开文件数(-n)、进程与线程数(-u)、虚拟内存(-v)、core 文件大小(-c)等。限制分软限与硬限两层:软限是实际生效值,普通用户可以在硬限范围内自行调整;硬限只能由 root 提高。它解释了大量「too many open files」「fork 失败」类错误的来源,但作用范围有限——只影响当前 shell 及之后启动的进程,对已经在运行的服务无效。
基本信息
| 适用平台 | Linux/macOS(bash 与 zsh 内建;POSIX sh 下选项支持可能不全) |
|---|---|
| 命令语法 | ulimit [-S|-H] [-a|-n|-u|-v|-c 值] |
| 常用选项 | -a 列出全部 -n 打开文件数 -u 进程或线程数 -v 虚拟内存 -c core 文件大小 -s 栈大小 |
| 软限与硬限 | -S 查看或设置软限,可自行调高至硬限;-H 硬限,提高需 root |
| 持久化位置 | 登录会话用 /etc/security/limits.conf 与 limits.d;systemd 服务用单元里的 LimitNOFILE 等 |
典型使用场景
- 排查连接数上不去:服务报 too many open files 时先确认进程实际限制
- 排查无法创建子进程:fork 失败或线程创建报资源不足
- 临时压测:在子 shell 里限制内存后运行有风险的程序
- 确认服务实际限制:读 /proc/PID/limits 与登录会话的 ulimit 对比
- 统一基线:把限制写进 systemd 单元或 limits.conf,避免逐台手工调整
常用示例
常用示例
ulimit -a # 列出全部限制
ulimit -n # 打开文件数软限
ulimit -Hn # 打开文件数硬限
ulimit -n 65535 # 当前 shell 内提高(不得超过硬限)
ulimit -u 4096 # 进程或线程数
(ulimit -v 2000000; ./risky.sh) # 子 shell 内限制内存后运行
cat /proc/$(pgrep -n nginx)/limits # 进程实际生效的限制常见限制项与症状
| 参数 | 含义 | 典型症状 |
|---|---|---|
| -n | 单进程可打开的文件描述符数 | too many open files,并发连接数上不去 |
| -u | 用户可创建的进程或线程数 | fork 失败、线程创建报资源不足 |
| -v | 进程虚拟内存上限 | 申请内存失败,进程被强制终止 |
| -c | core 文件大小上限 | 崩溃后没有 core 文件可供分析 |
| -s | 栈大小上限 | 深递归或大局部变量导致段错误 |
ulimit 只影响当前 shell 与它启动的子进程。改完之后已经在运行的服务不受影响,必须重启服务让新限制生效。
由 systemd 托管的服务不读取 limits.conf。要调整这类服务的限制,应在单元文件里设置 LimitNOFILE 等指令(或改 /etc/systemd/system.conf 中的管理器默认值),只改 limits.conf 不会生效。