Excellent software and practical tutorials
运维在Ubuntu中常遇到的大坑,“Too many open files in system!”
服务器运行缓慢,经常报错520或521错误,然后CPU和内存使用都不高,硬盘也没有跑满,遇到这样的问题很多人以为问题出在PHP上,其实除了PHP性能之外,还有一个重要的因素,那就是文件系统资源耗尽,听着挺不可思议的,没错,就是在Ubuntu中可以打开的文件数超限了!
在网络上搜索了一下,遇到这类问题的还挺多的!下面就教大家如何快速解决这个问题!
"Too Many Open Files" 错误排查与解决:Ubuntu 服务器高打开文件数分析
在 Ubuntu/Linux 服务器管理中,"Too many open files in system!" 错误是典型的资源耗尽信号,表示系统文件描述符(file descriptors)上限被触顶,无法打开新文件或 socket 连接。 您的日志显示 ulimit -n = 65535(用户/进程限制)和 /proc/sys/fs/file-max = 65535(全局系统限制),但 lsof | wc -l = 2211319(当前打开文件数),远超上限。这不是硬件问题(CPU/内存/硬盘正常),而是文件句柄泄漏或高并发应用(如 Web 服务器、数据库)未及时关闭连接导致的积累。根据 Server Fault 和 Ask Ubuntu 社区经验,90% 案例源于 Nginx/Apache/MySQL 进程句柄未释放,在流量峰值时雪崩式爆发,引发 502/504 错误或服务崩溃。幸好,这可通过临时/永久限额提升和进程诊断快速修复。
Workaround
排查打开文件:谁打开了什么?
用 lsof 工具(已安装)分类诊断,按进程/类型查看:
lsof | wc -l
按进程查看打开文件数(找出罪魁祸首):
lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -10 # 列出前 10 高进程
实时监控:watch -n 5 'lsof | wc -l' 每 5 秒刷新,观察增长。