eBPF 可观测性技术 3 分钟锁定银行信创云垃圾文件罪魁祸首 原创
摘要:在某国有银行的信创云日常运维中,发现大量未知的垃圾文件,存在严重的系统运行隐患,其承载的分布式核心交易系统的运行稳定性随时可能受到影响,运维人员尝试寻找产生垃圾文件的源程序,但却发现传统监控工具对未知程序在未知时间、未知节点、未知路径,写入未知文件的故障诊断并不是一件容易的事情,而 DeepFlow 使用 eBPF 技术实现的可观测性可以为运维人员提供纤毫毕现的文件读写观测能力,让此类问题的诊断定位变得极其轻松。
01|蹊跷的 inode 资源用量变化
在某国有银行的信创云(鲲鹏 ARM 计算平台 + 麒麟 OS + 华为 CCE 集群)的日常运维中,运维巡检人员敏锐的发现某批容器节点在磁盘空间用量无明显变化的情况下,文件数量异常,大量垃圾文件消耗了操作系统的 inode 资源,存在严重的系统运行隐患,极有可能由于 inode 资源消耗殆尽而引起严重的系统故障,其承载的分布式核心交易系统的运行稳定性随时可能受到影响。
inode(索引节点,index node)是文件系统中用于存储文件或目录元数据的结构,每个文件和目录都有一个对应的 inode,它包含了有关该文件或目录的所有信息,但不包括文件的实际数据内容或文件名。
当 inode 资源耗尽时,即文件系统中的所有 inode 都被用完,即使磁盘上可能还有大量可用的存储空间,仍将导致严重的后果,包括:
- 无法创建新文件或目录
- 文件系统不稳定或表现异常
- 文件系统损坏
- 无法处理硬链接
- 日志系统失效
- 系统无法启动特定服务
- 业务应用程序崩溃或异常
02|曲折的定位过程
传统监控工具诊断
看起来问题并不复杂,只需要找到制造垃圾文件的源进程,并将其下线即可。
1)使用 lsof 工具只能守株待兔
系统运维人员首先尝试使用 lsof 工具进行诊断。lsof 工具用于列出系统中所有当前打开的文件,包括设备、管道、网络连接等,可以帮助了解哪些进程正在访问哪些文件,方便排查问题、监控系统资源以及进行故障诊断。但 lsof 工具可以对系统中当前正在打开的文件进行诊断,但不能监控实时的文件读写事件,所以无法诊断瞬时完成或已经完成的文件读写问题。
此时发现,垃圾文件的新建、读、写过程早已完成,产生垃圾文件的程序可能随着容器 Pod 的迁移、扩容、缩容而销毁,当前无法确定是哪个 Pod 制造的垃圾文件,也不知道该问题未来在什么时间、在哪个节点会再次发生。使用 lsof 工具只能守株待兔,有可能在未来的某一天撞到这只“兔子”,锁定垃圾文件的源程序遥遥无期。
2)使用 Auditd 工具无从着手
再次尝试使用 Auditd 工具对问题进行诊断,但很快发现 Auditd 可以记录特定文件的读写,以及执行这些操作的用户和进程信息,但使用的前提是预先知道需要监控的文件名,所以对未知路径、未知文件的读写问题无能为力。
3)inotify 工具缺乏详细信息
再次尝试使用 inotify 工具对故障进行诊断定位,inotify 工具可以持续监控文件或目录的变化(例如,创建、删除、修改等),但无法提供执行读写操作的进程信息。
至此系统运维人员发现尝试锁定在未知时间、未知节点、未知路径,写入未知文件的未知程序并不是一件容易的事情。
DeepFlow eBPF 可观测性技术快速诊断
应用程序通过 read()、write() 等系统调用操作系统内核,实现对文件的读、写、新建、删除操作。
DeepFlow 采集器通过 eBPF 技术实现了对节点应用进程的系统调用观测能力,其中包括文件读写所用的 read()、write() 方法,从而可以记录并观测每一次瞬时的文件 I/O 事件。
系统运维人员进入 DeepFlow 的 追踪->文件读写 功能入口,使用 chost = 目标主机 event_type = 写 条件过滤,呈现目标主机节点指定时段的所有文件写事件,可观测信息包括时间、进程 ID、线程名、写字节数、写事件持续时间等,至此应用进程对目标主机节点的所有文件写入操作一览无余。
随即在 3 分钟内,系统运维人员找到特定文件的写操作源进程,确定罪魁祸首是某个批处理业务的容器,再检查发现容器内的某个脚本不完善,执行后会在操作系统中新建文件且在容器 Pod 销毁后产生垃圾文件残留,数量累积后威胁节点的运行稳定性和分布式核心交易业务的稳定性。
至此完全确定故障隐患的根因,通过批处理业务的运维开发人员修改脚本逻辑,增加文件清理过程,消除了此次重大故障隐患。
补充:如何开启 DeepFlow 的 eBPF 文件读写数据采集
1)打开 DeepFlow 的 Web 页面
2)进入 系统->采集器->配置->采集器组配置->高级配置 中添加如下 eBPF 文件读写采集参数:
static_config:
ebpf:
io-event-collect-mode: 2
io-event-minimal-duration: 1ns
03|场景总结
DeepFlow 通过 eBPF 技术实现对文件读写可观测,使得应用进程在操作系统内的文件操作纤毫毕现,监控时代文件操作相关的疑难杂症在进入可观测性时代后将变得简单易解、手到擒来。
04|什么是 DeepFlow
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云原生及 AI 应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code)采集,并结合智能标签(SmartEncoding)技术实现了所有观测信号的全栈(Full Stack)关联和高效存取。使用 DeepFlow,可以让云原生及 AI 应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。
GitHub 地址:https://github.com/deepflowio/deepflow
访问 DeepFlow Demo[1],体验零侵扰、全栈的可观测性。
参考资料
[1]DeepFlow Demo: https://deepflow.io/docs/zh/ce-install/overview/