上限不是一个,是四个
一句话总结
“Too many open files”涉及系统总量、内核单进程上限、hard limit 和 soft limit 四层;在交互 Shell 修改限制不会改变已运行服务。
限制与诊断
EMFILE 表示单进程文件描述符上限,ENFILE 表示系统全局上限。登录会话通过 PAM 读取 limits 配置,systemd 服务则由单元设置限制,并必须重启后才生效。
soft limit 可能因兼容旧式 select 而较低,一些运行时会启动后自行提高。可靠检查方法是读取目标 PID 的 limits 与 fd 目录;lsof 还会统计不占用 RLIMIT_NOFILE 的映射,不能直接拿来比较。
CLOSE-WAIT 表示对端已关闭而本应用尚未 close,通常指向连接泄漏,且内核不会自动超时;TIME-WAIT 则由内核管理且不继续占 fd。定期同时记录 fd 数与已建立连接数,可区分真实负载与单调增长的泄漏。
原文命令与标识符
fs.file-max 시스템 전체 합 (현대 리눅스에선 대개 병목이 아님)
fs.nr_open 한 프로세스의 RLIMIT_NOFILE 이 넘을 수 없는 커널 천장
RLIMIT_NOFILE hard 관리자가 정한 상한
RLIMIT_NOFILE soft 실제 적용값 (프로세스가 hard 까지 스스로 올릴 수 있다)
grep 'Max open files' /proc/<PID>/limits # soft / hard
ls /proc/<PID>/fd | wc -l # 실제 사용량
cat /proc/<pid>/limits | grep -i 'open files'
[Service]
LimitNOFILE=65535
sysctl fs.file-max fs.nr_open
cat /proc/sys/fs/file-nr # 현재 사용, 미사용, 최대
ls -l /proc/<pid>/fd | awk '{print $NF}' | sed 's/:.*//' | sort | uniq -c | sort -rn | head
Too many open files
ulimit -n 65536
nginx: accept4() failed (24: Too many open files)
java.net.SocketException: Too many open files
EMFILE(24)
Too many open files
ENFILE(23)
Too many open files in system
in system
/etc/security/limits.conf
LimitNOFILE
reload
restart
select()
lsof -p PID | wc -l
ss
close()
/proc/PID/fd
socket:[12345]
pipe:[67890]
anon_inode:[eventpoll]
Too many open files
ulimit -n
ulimit -n
ulimit -n
/etc/security/limits.conf
LimitNOFILE
limits.conf
fs.file-max
socket:
LimitNOFILE=infinity
/proc/1/limits