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
命令可以调整一些系统级限制 - 定期审查系统限制,确保它们满足当前需求