目录
1. 基本介绍
1.1 核心功能
1.2 作用范围
1.3 限制类型
2. 基本语法
3. 常用选项
3.1 常见options
3.2 查看当前限制
4. 核心概念
4.1 软限制(Soft Limit)
4.2 硬限制(Hard Limit)
5. 修改限制
5.1 临时修改
5.2 永久修改
方法1:修改 /etc/security/limits.conf
方法2:针对Systemd服务的限制
6. 正确配置优先级
7. 验证限制
7.1 查看进程实际限制
7.2 查看 Systemd 服务的当前限制
7.3 查看某进程的文件描述符限制
7.4 查看系统当前打开文件描述符总数
7.5 查看系统最大文件描述符数
7.6 实时监控文件描述符使用情况
7.7 查看特定进程的当前限制
8. 常见问题
8.1 修改后不生效?
8.2 权限不足?
9. 应用场景
9.1 Web 服务器 (Nginx/Apache)
9.2 数据库 (MySQL/PostgreSQL):
9.3 调试程序崩溃:
9.4 防止资源耗尽攻击:
9.5 嵌入式/资源受限系统:
9.6 容器化环境
10. 注意事项
10.1 谨慎修改硬限制
10.2 不同shell的行为差异
10.3 故障排查
10.4 nproc 限制与容器
10.5 限制继承性
10.6 Limits.conf 的生效范围
10.7 云环境限制
10.8 权限差异
10.9 Unlimited
1. 基本介绍
1.1 核心功能
查看和设置 当前 Shell 进程及其启动的子进程 可使用的 系统资源限制。
1.2 作用范围
限制由 Shell 启动的单个进程或用户会话的资源使用,防止资源耗尽(如打开文件过多、内存泄露、进程爆炸等)。
1.3 限制类型
包括文件描述符数量、进程数、内存大小、堆栈大小、CPU 时间、core 文件大小等。
2. 基本语法
1.1 基本语法
ulimit [options] [limit]
其中,options为控制限制类型的标志,limit则是指定资源限制的值。若省略limit,ulimit将显示当前设置。
3. 常用选项
3.1 常见options
- -a:显示所有当前限制。
- -c:设置或显示 core 文件的最大大小(以块为单位)。
- -d:设置或显示进程数据段的最大大小(以 KB 为单位)。
- -f:设置或显示由 shell 及其子进程创建的文件的最大大小(以块为单位)。
- -l:设置或显示可锁定到内存中的最大大小(以 KB 为单位)。
- -m:设置或显示最大常驻集大小(以 KB 为单位)。
- -n:设置或显示最大打开文件描述符数。
- -q:设置或显示 POSIX 消息队列的最大字节数。
- -s:设置或显示最大堆栈大小(以 KB 为单位)。
- -t:设置或显示最大 CPU 时间(以秒为单位)。
- -u:设置或显示单个用户可用的最大进程数。
- -v:设置或显示 shell 可用的最大虚拟内存(以 KB 为单位)。
3.2 查看当前限制
ulimit -a
:列出所有当前资源限制
$ ulimit -a
core file size (blocks, -c) 0 # core 文件大小 (块)
data seg size (kbytes, -d) unlimited # 数据段大小 (KB)
scheduling priority (-e) 0 # 调度优先级
file size (blocks, -f) unlimited # 文件大小 (块)
pending signals (-i) 31111 # 挂起信号数量
max locked memory (kbytes, -l) 64 # 锁定内存 (KB)
max memory size (kbytes, -m) unlimited # 常驻内存集大小 (KB)
open files (-n) 1024 # 打开文件描述符数
pipe size (512 bytes, -p) 8 # 管道缓冲区大小
POSIX message queues (bytes, -q) 819200 # POSIX 消息队列
real-time priority (-r) 0 # 实时优先级
stack size (kbytes, -s) 8192 # 栈大小 (KB)
cpu time (seconds, -t) unlimited # CPU 时间 (秒)
max user processes (-u) 31111 # 用户最大进程数
virtual memory (kbytes, -v) unlimited # 虚拟内存 (KB)
file locks (-x) unlimited # 文件锁
4. 核心概念
4.1 软限制(Soft Limit)
当前生效的资源阈值,进程可自行调整(不超过硬限制);超出时可能触发警告而非直接终止
4.2 硬限制(Hard Limit)
系统强制上限,仅 root 可修改,超限时进程会被强制终止。
在设置限制时,如果不指定是软限制还是硬限制,默认是软限制。
设置硬限制,使用
-H
选项,例如ulimit -Hn 2048
设置文件描述符的硬限制为2048;设置软限制,使用
-S
选项,如ulimit -Sn 1024。
5. 修改限制
5.1 临时修改
# 修改当前Shell的限制(仅对当前会话有效)
ulimit -n 65535 # 文件描述符数
ulimit -u 10000 # 用户进程数
ulimit -f unlimited # 文件大小无限制
5.2 永久修改
方法1:修改 /etc/security/limits.conf
vim /etc/security/limits.conf
# 添加以下内容(示例)
* soft nofile 65535
* hard nofile 65535
username hard nproc 10000# 为用户 'appuser' 设置打开文件描述符限制
appuser soft nofile 65536
appuser hard nofile 65536# 为用户 'appuser' 设置进程数限制
appuser soft nproc 4096
appuser hard nproc 8192# 为所有用户设置核心文件大小限制
* soft core 0* hard core 0# 为 'dba' 组成员设置更高的内存锁定限制
@dba hard memlock 262144
@dba soft memlock 262144
-
/etc/security/limits.d/*.conf
:系统允许在/etc/security/limits.d/
目录下放置额外的.conf
文件来管理特定服务或用户的限制,便于模块化管理。 -
/etc/default/
下的服务配置文件:某些服务(如sshd
,systemd
服务)可能有自己的默认配置文件,其中可以设置ulimit
或通过systemd
的Limit*
指令。 -
systemd
服务单元文件:对于由systemd
管理的服务,可以在服务的.service
文件中使用LimitNOFILE
,LimitNPROC
,LimitCORE
等指令来设置资源限制,这通常比/etc/security/limits.conf
更直接有效,特别是对于非交互式服务。 *
表示所有用户,也可替换为具体用户名。soft
为软限制(可临时突破),hard
为硬限制(需root权限修改)。nproc
表示单个用户能够创建的最大进程数或线程数,在 Linux 中线程和进程的概念在资源限制上是一样的)。这有助于防止某个用户启动过多的进程而导致系统资源耗尽,影响其他用户的正常使用。nofile
代表一个进程可以同时打开的最大文件描述符数量(包括网络连接、文件等)。文件描述符是操作系统用于管理和跟踪文件、网络连接等输入输出资源的一个抽象。
方法2:针对Systemd服务的限制
vim /etc/systemd/system.conf
# 修改以下参数
DefaultLimitNOFILE=65535
DefaultLimitNPROC=10000
# 重启生效
sudo systemctl daemon-reload
6. 正确配置优先级
场景 | 正确配置方式 | 优先级 |
---|---|---|
Systemd 管理的服务 | 修改服务的 .service 文件中的 Limit* 指令 | ★★★★★ |
全局默认限制 (Systemd) | /etc/systemd/system.conf | ★★★★☆ |
用户登录会话 (SSH/终端) | /etc/security/limits.conf | ★★★☆☆ |
临时调整当前 Shell | ulimit 命令 | ★★☆☆☆ |
容器内进程 | 容器启动参数 (如 docker run --ulimit ) | ★★★★★ |
7. 验证限制
7.1 查看进程实际限制
# 查看进程实际限制
cat /proc/<PID>/limits# 示例:查看Nginx主进程限制
ps aux | grep nginx
cat /proc/$(pgrep nginx)/limits
cat /proc/$(pidof nginx)/limits
7.2 查看 Systemd 服务的当前限制
# 查看 Systemd 服务的当前限制
systemctl show nginx | grep Limit
7.3 查看某进程的文件描述符限制
grep -i "max open files" /proc/<pid>/limits
7.4 查看系统当前打开文件描述符总数
lsof | wc -l
# 或者查看特定进程
lsof -p <PID> | wc -l
7.5 查看系统最大文件描述符数
# 查看系统最大文件描述符数
cat /proc/sys/fs/file-max# 临时修改(重启失效)
echo 2000000 > /proc/sys/fs/file-max# 永久修改
echo "fs.file-max = 2000000" >> /etc/sysctl.conf
sysctl -p
7.6 实时监控文件描述符使用情况
#实时监控文件描述符使用情况
watch -n 1 'ls -l /proc/$(pidof mysql)/fd | wc -l'
7.7 查看特定进程的当前限制
使用prlimit
命令可以查看指定进程的资源限制情况。
prlimit -p <进程ID>
8. 常见问题
8.1 修改后不生效?
- 检查是否重启了相关服务或Shell会话。
- 确认
/etc/security/limits.conf
或/etc/systemd/system.conf
语法正确。 - 确保未通过
ulimit -n
等命令在会话中覆盖配置。
8.2 权限不足?
- 临时修改需要当前用户权限。
- 永久修改可能需要
root
权限或sudo
。
9. 应用场景
9.1 Web 服务器 (Nginx/Apache)
提高 nofile (文件描述符) 以应对高并发连接。
配置 systemd unit 文件。Systemd 通过 cgroups
+ Unit 文件配置 实现更强大的资源隔离:
# /etc/systemd/system/nginx.service
[Service]
LimitNOFILE=65535 # 直接控制文件描述符
LimitNPROC=4096 # 直接控制进程数
MemoryMax=2G # 内存限制 (cgroups)
CPUQuota=80% # CPU 限制 (cgroups)
Nginx 报错 “Too many open files”错时的解决方案。
Systemd 的配置优先级更高且更精确,完全覆盖 limits.conf
。
9.2 数据库 (MySQL/PostgreSQL):
提高 nofile 和 nproc,确保高并发连接稳定性。
9.3 调试程序崩溃:
设置 ulimit -c unlimited 允许生成 core dump 文件用于分析。
9.4 防止资源耗尽攻击:
设置合理的 nproc 限制防止 fork 炸弹。
设置 fsize/as/data 限制进程内存/文件大小。
9.5 嵌入式/资源受限系统:
严格限制内存 (-v, -m)、栈大小 (-s)、进程数 (-u)
9.6 容器化环境
容器(Docker/Kubernetes)通过 cgroups/namespaces 直接控制资源:
docker run --ulimit nofile=1024:1024 ... # 容器内覆盖所有限制
limits.conf
对容器内进程完全无效。
10. 注意事项
10.1 谨慎修改硬限制
因为硬限制是资源使用的上限,修改硬限制可能会影响系统的稳定性,尤其是对于系统级别的硬限制修改,需要谨慎操
10.2 不同shell的行为差异
不同的shell可能会有不同的ulimit行为,所以在使用时要确保是在目标shell下进行设置。
10.3 故障排查
当遇到资源相关的错误,如“too many open files”时,可以先使用ulimit -n查看当前文件描述符的限制,如果怀疑是限制过低导致的,可以尝试调整限制值来解决问题
10.4 nproc
限制与容器
在容器环境 (Docker/K8s) 中,容器的进程数限制通常由 cgroups 控制,而非 ulimit -u
10.5 限制继承性
子进程继承父进程的限制设置
10.6 Limits.conf
的生效范围
-
仅影响通过 PAM (Pluggable Authentication Modules) 登录的会话(如 SSH、本地终端登录)。
-
不直接影响:
-
系统启动的服务 (需用 systemd 配置)
-
图形界面 (GUI) 中非终端启动的程序
-
cron 作业 (需在 cron 配置或脚本中显式设置)
-
10.7 云环境限制
部分云服务商锁定硬限制,需通过平台控制台调整。
10.8 权限差异
非 root 用户只能降低自己的软限制,且硬限制不可超过系统预设值。
10.9 Unlimited
使用 unlimited
时要非常谨慎,因为它可能允许进程耗尽系统资源。