目录
方法1:修改 /etc/security/limits.conf
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 时要非常谨慎,因为它可能允许进程耗尽系统资源。
1196

被折叠的 条评论
为什么被折叠?



