Plainnotes

Too many open files:到底是谁开的

2026-09-05 · 3 分钟系统

应用报 Too many open files,第一反应是调 nofile。调大之后能撑更久,但泄漏还在。

先定位:

ls /proc/1234/fd | wc -l
ls -l /proc/1234/fd | awk '{print $11}' | sort | uniq -c | sort -rn | head

第二行会告诉你这一千多个 fd 里,有多少指向同一个 socket、同一个文件、或者 socket:[...] 的匿名 inode。如果全是 socket,多半是连接没关;全是同一个文件,是忘了 close。

还要注意 nofile 有三层:systemd 的 LimitNOFILE、登录会话的 limits.conf、以及内核的 fs.file-max。改错了层,ulimit -n 看着变了,服务起来还是老值。systemctl show app -p LimitNOFILE 才是服务实际拿到的。