标准答案

  1. 每个进程有文件描述符表,描述符引用内核中的 open file 等对象,多个描述符可能引用同一个打开文件对象。
  2. 进程上限可通过 RLIMIT_NOFILE 约束,系统还存在全局文件对象和内存等资源上限。
  3. 排查应查看进程限制、/proc/<pid>/fd 数量和类型,区分 socket、普通文件、pipe、eventfd 等。
  4. 修复要关闭所有生命周期结束的句柄、限制连接和请求并发、处理异常路径,并确认 systemd 或容器中的限制实际生效。

题目解析

文件描述符是进程访问文件、socket、pipe、eventfd、epoll 等内核对象的句柄。耗尽时不一定是 TCP 连接,也可能是文件、日志、管道或子进程通信泄漏;典型错误是 EMFILE。应按进程查看数量和类型,关联连接池、请求并发、打开文件和异常路径。

ulimit -n 有软限制和硬限制,并且受进程启动方式、systemd、容器和服务管理器影响。提高上限要有内核和下游容量依据,同时修复 close、超时取消、连接池和日志 reopen 的生命周期;否则只是让故障晚一点发生。

常见误区

  • 误区:只执行 ulimit -n 就认为问题解决。改正:确认服务实际继承的软硬限制,并定位句柄增长来源。
  • 误区:把所有句柄都归因于 TCP。改正:用 lsof 或 /proc/<pid>/fd 区分文件、socket、pipe 和 epoll。
  • 误区:只检查正常返回路径。改正:覆盖异常、取消、超时、重试和服务重载路径的释放。

作者信息