记录一次线上的文件描述符泄露问题

发布于:2023-01-22 ⋅ 阅读:(14) ⋅ 点赞:(0) ⋅ 评论:(0)

本文最开始发表于择维士社区
本文记录了一次线上文件描述符异常问题的分析过程以及方法.

起因

某天,在查看系统资源时,发现我们的核心后台backend服务进程文件句柄一直在缓慢增长如下图:
问题

如上图左下角所示,过去一周文件句柄一直在缓慢规律的增加当中.

调查

因为文件句柄一直在缓慢增长中,那么一般有如下2种情况:

  • 文件流没有关闭
  • Socket没有关闭

本来想直接上BTrace来调查(之前也调查过类似的问题记录一次TCP连接异常问题使用btrace),但是毕竟还要写脚本,有没有更简单的办法呢?

想起来我们的监控产品中有查找相似性的功能,或许能找到些蛛丝马迹:
原始数据:
在这里插入图片描述

AI找到的相似的数据1:
AI1

AI找到的相似的数据2:
在这里插入图片描述

从上面来看就比较明显了,大概率是文件系统相关造成的句柄泄露.

那么登录容器(backend服务在容器内运行), 执行(7是进程ID):

ls -l /proc/7/fd > fd.txt

然后查看fd.txt,发现有很多如下的记录:

lr-x------ 1 root root 64 Aug  8 08:13 615 -> /data/alert-evaluator/0_2/rocksdb/alertState/000636.sst
lr-x------ 1 root root 64 Aug  8 08:13 616 -> /data/alert-evaluator/0_2/rocksdb/recentNStore/000476.sst
lr-x------ 1 root root 64 Aug  8 08:13 617 -> /data/alert-evaluator/0_2/rocksdb/alertState/000624.sst
lr-x------ 1 root root 64 Aug  8 08:13 618 -> /data/alert-evaluator/0_2/rocksdb/alertState/000625.sst
lr-x------ 1 root root 64 Aug  8 08:13 619 -> /data/alert-evaluator/0_2/rocksdb/alertState/000657.sst
lrwx------ 1 root root 64 Aug  8 08:13 62 -> anon_inode:[eventpoll]
lr-x------ 1 root root 64 Aug  8 08:13 620 -> /data/alert-evaluator/0_2/rocksdb/alertState/000629.sst
lrwx------ 1 root root 64 Aug  8 08:13 621 -> socket:[2715092561]
lr-x------ 1 root root 64 Aug  8 08:13 622 -> /data/alert-evaluator/0_2/rocksdb/alertState/000628.sst
lr-x------ 1 root root 64 Aug  8 08:13 623 -> /data/alert-evaluator/0_2/rocksdb/alertState/000630.sst
lr-x------ 1 root root 64 Aug  8 08:13 624 -> /data/alert-evaluator/0_2/rocksdb/alertState/000634.sst
lr-x------ 1 root root 64 Aug  8 08:13 625 -> /data/alert-evaluator/0_2/rocksdb/alertState/000637.sst
lr-x------ 1 root root 64 Aug  8 08:13 626 -> /data/alert-evaluator/0_2/rocksdb/recentNStore/000480.sst
lr-x------ 1 root root 64 Aug  8 08:13 627 -> /data/alert-evaluator/0_2/rocksdb/alertState/000632.sst

该文件是kafka stream的persistent store的数据文件,最终定位下来是使用的KeyValueStore的Iterator是需要关闭的:

 try (KeyValueIterator<String, byte[]> iterator = recentNStore.all()) {
        ....
}

总结

在遇到不同寻常的数据时,往往会关联其他数据也出现异常,而且很有可能有相似的模式,而AI非常适合来找到这些隐藏的关联来辅助我们定位和发现问题从而节约开发定位问题的时间.

广告时间:
择维士提供的数据监控产品支持如下的AI功能:

  • 预测: 预测未来一段时间的数据. 比如磁盘占用.
  • 相关性: 发现与选定数据模式高度匹配的数据. 用来问题关联分析.
  • 异常数据: 自动发现当前系统中的可能异常的数据. 并推送通知.