首页/系统/Linux 运维命令速查/ulimit 会话资源限制
进程与作业69 条

ulimit 会话资源限制

查看/设置当前 shell 会话的资源上限:-n 打开文件数、-u 进程数、-v 虚拟内存、-c core 大小;服务报 too many open files 先看这里。

Linux 运维命令速查系统更新于 2026-10-13

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进程虚拟内存上限申请内存失败,进程被强制终止
-ccore 文件大小上限崩溃后没有 core 文件可供分析
-s栈大小上限深递归或大局部变量导致段错误
ulimit 只影响当前 shell 与它启动的子进程。改完之后已经在运行的服务不受影响,必须重启服务让新限制生效。
由 systemd 托管的服务不读取 limits.conf。要调整这类服务的限制,应在单元文件里设置 LimitNOFILE 等指令(或改 /etc/systemd/system.conf 中的管理器默认值),只改 limits.conf 不会生效。

易错点

  • 只在 limits.conf 里调大限制,systemd 托管的服务依然按旧值运行
  • 在登录 shell 里调整后重启服务,误以为限制已随之变化
  • 硬限没有提高就尝试调高软限,命令直接报无法修改限制
  • 只看登录会话的 ulimit,不读 /proc/PID/limits,得到与服务实际限制不符的结论

数据来源与参考

  • man 1 bash(ulimit 内建)
  • man 3 getrlimit

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌