FD泄露排查

记一次线上服务fd泄露排查

文件描述符(FD)概述

文件描述符(FD)是操作系统内核用来标识已打开文件的非负整数索引。在程序中,文件描述符用于文件的读写操作,如通过readwrite系统调用。在POSIX标准中,文件描述符0、1、2分别代表标准输入、标准输出和标准错误。

FD泄露现象

当一个进程打开的文件描述符数量超过系统限制(默认为1024),系统将无法为新文件分配描述符,并可能抛出“Too many open files”错误。这通常意味着有未正确关闭的文件或连接,导致描述符占用过高。

排查步骤

  1. 发现问题 :通过监控系统发现服务的文件描述符数量异常增长。
  2. 查找服务PID :使用ps aux | grep [服务名]命令找出目标服务的进程ID。
  3. 查看当前服务占用FD数量 :执行ls /proc/[PID]/fd | wc -l检查服务当前打开的文件描述符数量。
  4. 查看FD使用情况 :详细列出当前服务的文件描述符使用情况,ls -ls /proc/[PID]/fd
  5. 检查网络连接 :使用ss -anp |grep [PID]命令查看服务相关的网络连接,帮助定位可能的泄露来源。

典型案例

以某服务的FD泄露为例:

  • 现象 :文件描述符持续增长,达到1w+。
  • 原因 :服务在高QPS(200~300)下调用第三方验证接口,由于HTTP连接默认超时时间较长(60s),且未主动关闭连接,导致大量描述符持续占用。
  • 复现 :通过脚本模拟高频率请求,持续观察FD数量变化,验证泄露情况。
  • 排查 :利用上述步骤定位到问题来源为HTTP请求未正确关闭。
  • 代码修改 :增加了连接超时和读写超时设置,确保连接在指定时间内被关闭,从而释放描述符。
  • 结果 :服务使用的FD数量显著下降,泄露问题得到解决。
Licensed under CC BY-NC-SA 4.0
Last updated on Dec 10, 2024 00:00 UTC
Built with Hugo
Theme Stack designed by Jimmy