标准答案

  1. 常见表现包括 accept、connect、open 失败,连接池无法创建连接,日志和临时文件写入异常。
  2. 检查进程和系统的 fd 上限、当前使用量、按类型和连接状态分布,定位哪个资源持续增长。
  3. 确保 HTTP、数据库、文件、压缩和子进程资源在成功、异常、取消和超时路径都关闭。
  4. 提高上限只能作为容量调整,不能替代泄漏修复;还要限制连接和任务并发。

题目解析

文件描述符是进程共享的有限资源,网络连接、数据库连接、普通文件、管道、日志和子进程句柄都会消耗它。某一类资源泄漏,最后可能表现为完全无关的 open、accept 或日志失败。

排查要同时看进程和系统上限、当前数量、按类型的句柄分布、连接状态和增长趋势。单看 ESTABLISHED 连接会漏掉 CLOSE_WAIT、文件、管道和未回收的子进程。

提高上限只能争取缓冲时间,不能修复未关闭响应体、文件或连接。所有成功、异常、超时、取消和停机路径都要有确定的释放责任,并对使用量设置告警。

常见误区

  • 误区:只调大 ulimit 就算解决。改正:先定位增长类型和关闭缺失,上限调整只能作为容量配置。
  • 误区:只检查 ESTABLISHED 连接。改正:同时检查 CLOSE_WAIT、文件、管道、日志和子进程句柄。
  • 误区:异常路径不释放 HTTP 响应体。改正:无论成功、错误、取消还是超时,都要消费或关闭响应体并归还连接。

作者信息