LabHub
学习 学习路径 课程

Linux 故障处理

上限不是一个,是四个

在 LabHub 中继续学习

一句话总结

“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