某个简单的 python 服务,运行一段时间就崩溃。查看日志后发现有一个系统错误
OSError: Errno24 Too many open files
要理解这个问题,首先要理解什么是文件描述符,可以参考我的另一篇文章(Linux 系统文件描述符(File Descriptor)小白级介绍).
简言之,就是 linux 系统每个进程会维护一张文件描述符表,而这个表是有大小限制的,用来控制每个进程可以打开的最多文件描述符数量。
如果一个进程打开了过多的文件,当再次尝试打开文件时,就会因为系统限制,产生 “Too many open files” 的错误。
1. 解决思路
- 问题产生时(不是事前和事后,而是事中),查看当前进程打开了哪些文件描述符,结合程序逻辑分析是正常情况还是异常情况
- 正常情况:查看和修改文件描述符数量限制
- 异常情况:
- 查看是否有未正确关闭的资源使用(文件、网络、数据库)
- 是否代码异常导致过多的打开文件,例如循环中打开了过多的文件
1.1 如何查看当前进程打开的文件描述符信息
# 查看指定进程打开的文件描述符
lsof -p <pid>
# 统计打开的文件描述符数量
lsof -p <pid> | wc -l