CentOS Too many open file
诊断过程
- 查看当前进程已打开的fd
- 查看系统fs.file-max
- 查看系统单个进程限制fd fs.nr_open
- 查看用户的ulimit的nofile的值
- 调整ulimit nofile值至适当
- 验证调整的值
- 参数建议
查看出错时系统fd使用详情
- 查看系统所有open的 fd, 如下
lsof | awk '{print $2}' | sort | uniq -c | sort -nr
- 按进程维度查看各个进程的fd使用率
ps -eo pid,comm | while read pid comm; do if [ -e /proc/$pid/fd ]; then count=$(ls /proc/$pid/fd | wc -l) echo "PID $pid ($comm): $count open files" fi done
lsof -p [PID] | wc -l
查看系统fs.file-max
- 查看系统全局最大文件句柄数限制,即整个系统可以同时打开的最大文件数
cat /proc/sys/fs/file-max sysctl -a | grep fs.file-max
查看系统fs.nr_open
- 查看系统级别的每个进程可以打开的最大文件描述符数量的上限
cat /proc/sys/fs/nr_open sysctl -a | grep "fs.nr_open"
查看用户级别的nofile信息
- 使用ulimit -a
[20:20:13] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # 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) 61371 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 65535 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) 61371 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
- 使用ulimit -SHn
[20:20:47] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # ulimit -SHn 65535
调整nofile
- 满足条件 nr_open > ulimit -SHn
# End of file root soft nofile 65535 root hard nofile 65535 * soft nofile 655350 * hard nofile 655350
- 切换至普通用户查看
[20:23:10] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # su - nflow 上一次登录:五 7月 26 16:58:23 CST 2024pts/1 上 [20:23:43] nflow@ALI-HZ-SYS-OPS-CICD-0-252:~ $ 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) 61371 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 655350 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) 61371 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
- 修改指定进程的nofile, 如jenkins.service vim /usr/lib/systemd/system/jenkins.service
# Arbitrary additional arguments to pass to Jenkins. # Full option list: java -jar jenkins.war --help #Environment="JENKINS_OPTS=" # Maximum core file size. If unset, the value from the OS is inherited. #LimitCORE=infinity # Maximum file size. If unset, the value from the OS is inherited. #LimitFSIZE=infinity # File descriptor limit. If unset, the value from the OS is inherited. LimitNOFILE=655350
- 验证指定的进程当前最大的文件句柄数
[20:26:30] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # cat /proc/$(pgrep -f java)/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 61371 61371 processes Max open files 655350 655350 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 61371 61371 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
- 创建pam_limits.so
通常,pam_limits.so 需要在几个关键的 PAM 配置文件中设置。这些文件通常包括:
etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive
/etc/pam.d/login
确保这些文件中包含以下行:
session required pam_limits.so
修改完成之后, 需要退出, 重新登录 (修改参数时切记逻辑关系 /etc/security/limits.conf 中的 nofile不能大于 fs.nr_open的值否则重启之后无法登录系统)
pam
- pam_limts.so的作用
pam_limits.so 是 PAM 模块中的一个,专门用于管理用户会话中的资源限制。它读取 /etc/security/limits.conf 文件以及 /etc/security/limits.d/ 目录中的配置文件,并在启动会话时应用这些限制 -
session required pam_limits.so 的含义
session:表示这是一个会话管理模块。
required:表示这是一个必须成功的模块。如果这个模块失败了,整个会话启动过程也将失败。
pam_limits.so:指定要加载的 PAM 模块文件。
-
为什么需要 session required pam_limits.so?
为了确保系统在用户登录或启动会话时正确应用资源限制,需要在相关的 PAM 配置文件中包含 pam_limits.so 模块
参数建议
- 解数含义解释
参数项 功能 范围 fs.file-max 允许操作系统级别最大创建的文件句柄数 系统全局 fs.nr_open 允许单个进程级别最大创建的文件句柄数 进程级别 nofile 指linux操作系统用户维度最大的文件句柄灵敏 用户级别 - 在调整参数时需要注意逻辑大小关系 fs.file-max > file.nr_open > nofile
-
fs.file-max 与 fs.nr_open 的关系:
fs.file-max 是整个系统的总文件描述符限制,而 fs.nr_open 是单个进程的文件描述符限制。它们之间没有直接的数量关系,但 fs.nr_open 应该是小于等于 fs.file-max 的合理值。
fs.nr_open 与 ulimit -n 的关系:
ulimit -n 设置的文件描述符限制不能超过 fs.nr_open。即使你尝试通过 ulimit 设置一个大于 fs.nr_open 的值,也会失败。
实际应用中的关系:
系统总限制 (fs.file-max):系统管理员设置 fs.file-max 来防止系统资源被耗尽。
单个进程限制 (fs.nr_open):系统管理员设置 fs.nr_open 来防止单个进程过度使用文件描述符。
用户级别限制 (ulimit -n):用户或管理员设置 ulimit -n 来控制特定用户会话或进程的文件描述符使用,且不能超过 fs.nr_open。
参数未生效原因排查
以下是参数没有生效排查思路
- 检查系统级别的限制
cat /etc/systemd/system.conf cat /etc/systemd/user.conf
- 查看用户shell登录配置文件
cat ~/.bashrc cat ~/.profile cat ~/.bash_profile cat /etc/profile cat /etc/bashrc
- debug日志
编辑 /etc/pam.d/common-session 和 /etc/pam.d/common-session-noninteractive: session required pam_limits.so debug
- 查看系统日志
sudo tail -f /var/log/auth.log sudo tail -f /var/log/syslog