常驻进程第三天开始所有请求报 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。

作者 9823189