ulimit命令

ulimit 命令 #

ulimit是一个内建的 shell 命令,用于获取和设置用户进程的资源限制。这些限制可以防止单个用户或进程消耗过多的系统资源,从而影响系统的稳定性和其他用户的使用体验。

语法 #

ulimit [选项] [限制值]

常用选项 #

选项 描述
-a 显示所有当前资源限制
-b 设置套接字缓冲区大小(字节)
-c 设置核心转储文件的最大大小(块)
-d 设置进程数据段的最大大小(KB)
-e 设置调度优先级的最大值
-f 设置由 shell 创建的文件的最大大小(块)
-i 设置待处理信号的最大数量
-l 设置进程可锁定内存的最大大小(KB)
-m 设置可使用的物理内存的最大大小(KB)
-n 设置打开文件描述符的最大数量
-p 设置管道缓冲区的大小(512 字节块)
-q 设置 POSIX 消息队列的最大字节数
-r 设置实时调度的最大优先级
-s 设置堆栈的最大大小(KB)
-t 设置 CPU 时间的最大值(秒)
-u 设置用户进程的最大数量
-v 设置虚拟内存的最大大小(KB)
-x 设置文件锁的最大数量
-T 设置线程的最大数量
-S 设置软限制(默认)
-H 设置硬限制

软限制与硬限制 #

  • 软限制:用户可以临时增加到硬限制的值,但不能超过硬限制。
  • 硬限制:只能由 root 用户设置,定义了资源的最大可能值。

常见用法 #

1. 显示所有当前资源限制 #

ulimit -a

输出示例:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15391
max locked memory       (kbytes, -l) 65536
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15391
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

2. 设置打开文件描述符的最大数量 #

# 设置软限制
ulimit -n 4096

# 设置硬限制
ulimit -Hn 4096

3. 设置核心转储文件的最大大小 #

# 禁用核心转储
ulimit -c 0

# 启用无限大小的核心转储
ulimit -c unlimited

4. 设置用户进程的最大数量 #

ulimit -u 1000

5. 设置堆栈大小 #

ulimit -s 16384  # 设置为16MB

6. 设置文件大小限制 #

# 限制创建的文件最大为1GB
ulimit -f 1048576

7. 设置 CPU 时间限制 #

# 限制进程最多使用60秒CPU时间
ulimit -t 60

8. 设置虚拟内存大小 #

# 限制虚拟内存为4GB
ulimit -v 4194304

永久设置限制 #

ulimit命令设置的限制仅在当前 shell 会话中有效。要永久设置限制,可以:

1. 在 shell 配置文件中设置 #

~/.bashrc~/.bash_profile~/.profile中添加 ulimit 命令:

# 在~/.bashrc中
ulimit -n 4096

2. 使用系统配置文件 #

编辑/etc/security/limits.conf文件:

# /etc/security/limits.conf
# <domain>      <type>  <item>         <value>
*               soft    nofile         4096
*               hard    nofile         8192
username        soft    nproc          1000
username        hard    nproc          2000
@group          soft    memlock        512000
@group          hard    memlock        512000

格式说明:

  • <domain>:用户名、组名(前缀@)或通配符*(所有用户)
  • <type>:限制类型(soft 或 hard)
  • <item>:资源名称
  • <value>:限制值

常用资源项:

  • core:核心转储文件大小(KB)
  • data:进程数据段大小(KB)
  • fsize:文件大小(KB)
  • memlock:锁定内存大小(KB)
  • nofile:打开文件数
  • rss:常驻内存大小(KB)
  • stack:堆栈大小(KB)
  • cpu:CPU 时间(分钟)
  • nproc:进程数
  • as:地址空间大小(KB)
  • maxlogins:最大登录数
  • priority:进程优先级
  • locks:文件锁数量
  • sigpending:待处理信号数
  • msgqueue:POSIX 消息队列大小(字节)
  • nice:nice 优先级

3. 使用 systemd 单元文件 #

对于 systemd 管理的服务,可以在单元文件中设置限制:

[Service]
LimitNOFILE=65535
LimitNPROC=4096
LimitCORE=infinity

查看系统限制 #

1. 查看系统级限制 #

cat /proc/sys/kernel/pid_max  # 最大进程ID
cat /proc/sys/fs/file-max     # 系统范围内的最大文件句柄数
cat /proc/sys/kernel/threads-max  # 系统范围内的最大线程数

2. 查看当前进程的限制 #

cat /proc/self/limits

3. 查看特定进程的限制 #

cat /proc/[pid]/limits

常见问题排查 #

1. “Too many open files"错误 #

这表示达到了打开文件描述符的限制:

# 检查当前限制
ulimit -n

# 增加限制
ulimit -n 4096

# 永久解决方案:编辑/etc/security/limits.conf
# username    soft    nofile    4096
# username    hard    nofile    8192

2. “Cannot fork: Resource temporarily unavailable"错误 #

这表示达到了进程数限制:

# 检查当前限制
ulimit -u

# 增加限制
ulimit -u 2048

# 永久解决方案:编辑/etc/security/limits.conf
# username    soft    nproc     2048
# username    hard    nproc     4096

3. 无法设置硬限制 #

普通用户只能降低硬限制或增加软限制(不超过硬限制):

# 以root用户设置硬限制
sudo su -
ulimit -Hn 65535

4. 限制不生效 #

可能的原因:

  • PAM 配置问题
  • 使用了错误的配置文件
  • 服务管理器覆盖了设置

检查 PAM 配置:

grep pam_limits /etc/pam.d/common-session
# 应该包含:session required pam_limits.so

应用场景 #

1. Web 服务器优化 #

对于高并发 Web 服务器,通常需要增加文件描述符限制:

# 在/etc/security/limits.conf中
www-data        soft    nofile          65535
www-data        hard    nofile          65535

2. 数据库服务器优化 #

数据库服务器通常需要调整多个限制:

# 在/etc/security/limits.conf中
mysql           soft    nofile          65535
mysql           hard    nofile          65535
mysql           soft    nproc           16384
mysql           hard    nproc           16384
mysql           soft    memlock         unlimited
mysql           hard    memlock         unlimited

3. 开发环境配置 #

开发环境可能需要更宽松的限制:

# 在~/.bashrc中
ulimit -c unlimited  # 启用核心转储
ulimit -n 4096       # 增加文件描述符

4. 限制用户资源使用 #

在共享系统上限制单个用户的资源使用:

# 在/etc/security/limits.conf中
username        soft    cpu             60
username        hard    cpu             120
username        soft    nproc           100
username        hard    nproc           200
username        soft    as              2097152  # 2GB
username        hard    as              4194304  # 4GB

5. 容器环境配置 #

在容器环境中设置资源限制:

docker run --ulimit nofile=65535:65535 --ulimit nproc=16384:16384 image_name

提示 #

  • 在更改系统限制前,先了解当前使用情况和需求
  • 对于生产系统,逐步调整限制并监控效果
  • 记得同时设置软限制和硬限制
  • 对于系统服务,检查 systemd 单元文件中的限制设置
  • 使用lsof -p PID命令查看进程打开的文件
  • 使用prlimit命令可以查看和设置特定进程的限制
  • 在调整限制后,可能需要重启服务或系统才能生效
  • 对于容器环境,需要同时考虑容器内部限制和主机限制
  • 使用sysctl命令可以调整一些系统级限制
  • 定期审查系统限制,确保它们满足当前需求