OpenResty XRay Supported Tech Stacks: CPU Flame Graphs and Memory Analysis for LuaJIT, C/C++, Rust, Java, Go, Python, Node.js, PHP, Erlang, Perl, Ruby and the Linux Kernel

支持的技术栈

你的剖析工具止步于技术栈边界,OpenResty XRay 不会。

OpenResty XRay 在同一条调用栈里剖析你的应用语言、底层系统库与内核。以下是完整的技术栈支持矩阵,逐一标注各技术栈的分析深度。

预约演示
预约演示

完整支持矩阵

技术栈CPU 火焰图内存分析更多
LuaJIT / Lua
(OpenResty, Nginx, Kong)
Supported含 Lua↔C 混合栈引用链级 — GC 对象引用、分配路径相关文章 →
C / C++Supported精确到源码行分配器级 — 泄漏检测、内存碎片相关文章 →
RustSupported分配器级相关文章 →
JavaSupported引用链级 — GC 引用分析,无 stop-the-world 停顿相关文章 →
GoSupported引用链级相关文章 →
PythonSupported深入解释器内部引用链级相关文章 →
Node.jsSupported引用链级相关文章 →
PHPSupported引用链级相关文章 →
ErlangSupported视工作负载而定 †相关文章 →
PerlSupported引用链级相关文章 →
RubySupported视工作负载而定 †—
操作系统内核Supported独立内核火焰图网络协议栈、进程调度器、系统调用分析相关文章 →

引用链级 = OpenResty XRay 遍历 GC 对象引用关系,指出是谁持有了泄漏的内存,并给出分配代码路径。 分配器级 = 泄漏检测、内存碎片与分配器行为分析,不含对象引用链——前者定位到”哪个对象持有了不应释放的内存”,后者发现”内存总量在持续增长”。

† 内存分析深度视工作负载而定

Erlang 和 Ruby 完整支持 CPU 剖析。内存分析的深度取决于具体的工作负载和运行时版本。告诉我们你的技术栈,我们会在部署之前说明针对你的环境能达到的确切分析深度。

一个 Agent,三层覆盖,一条调用栈

OpenResty XRay 从外部接入正在运行的进程——不改代码、不重启、不预加载任何库。每一次采样都会贯穿三层进行栈展开与符号化,合成一条连续的调用栈。

第 1 层 · 应用层

深入解释器与 JIT 内部

OpenResty XRay 直接解析运行时自身的内部数据结构——LuaJIT、CPython、JVM、Go、PHP、Node.js、Erlang、Perl、Ruby——还原出你的源文件和代码行,而不只是解释器的 C 函数帧。

第 2 层 · 系统层

解析底层系统库

C、C++ 和 Rust 帧——nginx、OpenSSL、glibc 以及你自己的模块——即使是去除了符号的生产环境二进制,也能借助中央符号库完成符号化。

第 3 层 · 内核层

直达内核

调度器、网络协议栈、内存管理和系统调用出现在同一条调用栈里,因此阻塞在内核中的 off-CPU 时间可以归因到发起等待的应用代码。

生产环境实案

跨越语言边界的真实诊断

44.8% CPU

libcrypto 中的 pkey_rsa_decrypt 消耗了将近半个核的 CPU。OpenResty XRay 顺着 JWT 库一路回溯到某个 Lua 插件的第 93 行——这条跨语言调用链是 perf 无法呈现的。

阅读诊断过程 →
无 STW 停顿

JVM 堆在多次 Full GC 之后仍持续增长。OpenResty XRay 在运行中的 JVM 上遍历 GC 对象引用链,定位到持有内存的数据结构——无需 heap dump,没有 stop-the-world。

阅读诊断过程 →
100% CPU,现场

B 站一次生产事故中,所有 worker 进程 CPU 达到 100%。分析是在事故发生期间直接针对运行中的进程完成的,而不是事后搭建复现环境。

阅读事故复盘 →
“OpenResty XRay 的故障排除和性能优化功能显著地提高了我们的生产力,使我们能够精准定位生产环境中各类的诡异问题。 ”
— Jun Xiao | Site Manager
FAQ

常见问题

需要调试符号或重新编译应用吗?

不需要。对于主流发行版的软件包,OpenResty XRay 从中央符号库解析符号;对于改动过的开源软件构建,OpenResty XRay 会近似重建符号;对于你自己的私有二进制,OpenResty XRay 可以自动提取符号,也可以接受上传的 RPM/DEB 包。你的生产构建保持原样。

可以。每一次采样得到的调用栈都会跨越三层展开并完成符号化,所以一张火焰图里同时包含你的应用帧、其下的 C 帧,以及再往下的内核帧。正因如此,一个吃 CPU 的 C 函数才能被归因回调用它的那一行应用代码。

OpenResty XRay Agent 运行在宿主机上,需要 root 权限和一个内核模块。你的应用进程不会被修改:不注入任何代码、不预加载任何库;没有分析任务运行时,与应用进程完全没有接触。仅支持 Linux 服务器;容器场景下,宿主机上的 Agent 可以分析该主机上所有容器内的进程。

你的技术栈就在矩阵里。了解它在 XRay 下的全貌。

告诉我们你的技术栈,我们会在部署前说明针对你的环境能达到的确切分析深度。

预约演示