ulimit 是一个在 Unix-like 系统(包括 Linux 和 macOS)中内置的 shell 命令,用于控制和显示 shell 以及由 shell 启动的进程可以使用的系统资源限制。这个命令允许你设置或查询以下类型的资源限制:

  1. 打开文件描述符数 (nofile) - 进程可以同时打开的最大文件数。
  2. 进程数 (nproc) - 用户可同时运行的最大进程数。
  3. CPU 时间 (cpu) - 进程可以消耗的CPU时间总量(单位通常是秒)。
  4. 最大内存大小 (memlock, as) - 进程可以锁定到物理内存中的最大内存量。
  5. 堆栈大小 (stack) - 进程堆栈的最大大小。
  6. 核心文件大小 (core) - 当进程崩溃时产生的核心转储文件的最大大小。
  7. 虚拟内存大小 (data, rss) - 进程可以使用的最大虚拟内存。

ulimit 的基本语法如下:

ulimit [选项] [限制值]
  • -a:显示当前所有资源限制的值。
  • -H:设置硬限制(管理员可以改变,但不能超过系统允许的最大值)。
  • -S:设置软限制(用户可以调整到低于硬限制的任意值)。
  • limit_value:具体的资源限制值,根据不同的资源类型而变化。

例如,要增加当前 shell 会话的打开文件描述符数量至 4096:

ulimit -HSn 4096

上述命令设置了软限制(-S)和硬限制(-H)的打开文件描述符数(n)为 4096。

对于持久性的系统级配置,通常不会直接在用户的 shell 会话中使用 ulimit,因为这些更改只影响当前会话。为了全局或者针对特定用户或服务永久性地设置资源限制,通常需要编辑系统的配置文件,例如在 Linux 上:

  • /etc/security/limits.conf 文件,用于定义系统级别的用户和组资源限制。
  • 在使用 systemd 的系统中,可以在服务单元文件(.service)中通过 [Service] 部分设置 LimitNOFILE 等指令来指定服务启动时的资源限制。

对于 Docker 容器,可以通过 docker run 命令的 --ulimit 参数来设置容器内的资源限制。例如:

docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"

这会在启动的 Debian 容器中设置软硬限制均为1024个打开文件描述符,并且在执行命令后自动清理容器。