常驻进程第三天开始所有请求报 OSError: [Errno 24] Too many open files。lsof -p 4127 输出六万多行,指向的全是同一个按天轮转的日志文件。乍看像缓存或者权限的锅,追下去往往不是。
lsof -p 4127 | wc -l ls /proc/4127/fd | wc -l cat /proc/4127/limits | grep 'open files'
追下去是这么回事:每次记录都 open 一次日志路径,写完没有 close,异常分支更是直接跳过。CPython 的引用计数要等对象回收才关 fd,循环引用或长期持有的列表会让它一直不释放。
「Python 文件句柄泄漏」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,用 with open 或者把 logger 提到模块级只初始化一次;查 lsof -p 的 fd 数量随时间的变化 确认是稳定增长;调高 ulimit -n 只是缓解 先把泄漏点补上;加一条 fd 数量超过阈值就打堆栈的监控。
验收就看一点,改完跑一天 /proc/<pid>/fd 的数量稳定在 30 上下 不再出现 Errno 24。
