使用 OpenResty XRay 定位普罗米修斯应用内部 CPU 最热的 Go 代码路径

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

本教程介绍了使用OpenResty XRay识别普罗米修斯应用中最耗CPU的Go代码路径,发现垃圾回收是CPU消耗最多的原因。文章还介绍了OpenResty XRay的自动分析和报告功能。

🔎

延伸解读

从现象到根因:高CPU背后的GC瓶颈

文章通过top命令发现Prometheus进程消耗超过160%的CPU,但真正的问题并非业务逻辑本身。OpenResty XRay的分析报告指出,Go垃圾回收消耗了超过99%的CPU时间,其中scanobject和gcDrain等运行时函数是主要热点。这提示读者,当Go应用出现高CPU时,应优先排查GC压力,而非仅关注业务代码。

定位分配热点:loadWAL与Series的连锁影响

报告进一步指出,loadWAL、Series和slicebytetostring等函数分配了最多的GC对象。其中loadWAL从预写日志加载数据时,新分配的GC对象数目超过总数的19%,动态分配操作占用近11%的CPU时间。这说明减少这些路径上的对象分配,能直接降低GC负担和CPU消耗,为优化提供了具体切入点。

分析方式的选择:引导式与自动监控

文章展示了两种使用OpenResty XRay的方式:引导式分析适合针对特定进程进行实时诊断,并可设置采样时间;而Insights页面则提供以日和周为周期的自动监控报告。读者可根据场景选择——开发调试时用引导式分析,生产环境持续观察则依赖自动报告,两者互补。

❓

Q&A

Prometheus 进程 CPU 使用率过高,如何用 OpenResty XRay 定位最耗 CPU 的 Go 代码路径?

首先用 top 命令确认 Prometheus 进程 CPU 使用率超过 160%。然后打开 OpenResty XRay Web 控制台,进入 Guided Analysis 页面,选择 High CPU usage 问题类型,点击 Next,选择目标 Go 应用和对应进程,保持默认采样时间 300 秒,开始分析。系统会执行多轮分析并自动生成报告,报告中会显示最耗 CPU 的 Go 代码路径。

OpenResty XRay 分析 Prometheus 高 CPU 问题后,发现 CPU 时间主要消耗在哪里?

分析报告显示,Go 垃圾回收消耗了超过 99% 的 CPU 时间。其中 scanobject 和 gcDrain 等垃圾回收相关函数是主要原因,例如一条执行垃圾回收的 Go 代码路径占用了超过 21% 的 CPU 时间。

Prometheus 中哪些 Go 函数分配了最多的 GC 对象,导致垃圾回收开销高?

报告指出 loadWAL、Series 和 slicebytetostring 函数是分配最多 GC 对象的 Go 代码路径。loadWAL 从预写日志加载数据,Series 从缓冲区解码时序数据并添加到切片,slicebytetostring 将字节切片转换为字符串。这些函数快速分配大量 GC 对象,增加了垃圾回收器的负担。

OpenResty XRay 除了引导式分析,还能自动监控并生成报告吗?

可以。OpenResty XRay 提供 Insights 页面,可以自动监控在线进程并生成以日和周为周期的分析报告。这样用户无需手动使用 Guided Analysis 功能,也能持续获得性能分析结果。

OpenResty XRay 是什么产品,它如何分析运行中的应用程序?

OpenResty XRay 是一个动态追踪产品,能够自动分析运行中的应用程序,以解决性能问题、行为问题和安全漏洞,并提供可行的建议。它由 Y 语言驱动,支持多种运行时环境,如 Stap+、eBPF+、GDB 和 ODB,可以对未经修改的进程进行实时分析。

在 Prometheus 案例中,动态分配新 GC 对象对 CPU 有什么影响?

动态分配新 GC 对象的操作占用了将近 11% 的 CPU 时间,这不仅增加了垃圾回收器的负担,本身也消耗大量 CPU 资源。此外,loadWAL 相关代码路径新分配的 GC 对象数目超过了新分配总数的 19%。

🏷️

标签

➡️

继续阅读