CPU 时间是如何耗费在 Rust 的 Sled 库内部的(使用 OpenResty XRay)
在本教程中,我们将逐步演示如何用 OpenResty XRay 定量地分析 Rust 的 Sled 库中 CPU 时间的消耗情况。我们将展示其中占用 CPU 最多的那些 Rust 代码路径。这些热代码路径是 OpenResty XRay 自动分析和解读 Rust 语言级别的 CPU 火焰图得来的。
Problem: 高 CPU 使用率
Sled 是一个由 Rust 编写的嵌入式 KV 数据库。
我们有一个基于 Sled 的内部 cache 服务。
可以看到 CPU 的使用率非常高,超过 100%。
使用 OpenResty XRay 的引导式分析功能分析 Rust 的 Sled 库中 CPU 时间的消耗情况
让我们使用 OpenResty XRay 来检查这个未经修改的进程。您可以对它进行实时分析,并找出原因。
确保我们当前分析的是正确的机器。
如果当前显示的机器不对,您可以从下面的列表中选择一个正确的。
进入 “Guided Analysis” 页面。
这里可以看到系统能分析的不同类型的问题。
让我们选择 “High CPU Usage”。
点击 “Next”。
选择之前的 sled 应用,是 Rust 应用类型。
选择消耗超过 100% CPU 资源的进程。也就是我们之前在 top
中看到的。
确保应用的类型是正确的。通常默认值就是对的。
这里的语言级别就只有 “Rust” 了。
我们还可以设置最大分析时间。这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析。现在它正在运行第一轮分析。
第一轮分析已经完成,现在进入第二轮分析。对这个例子来说,运行一轮分析就够了。
现在停止分析。
可以看到自动生成了一份分析报告。
这是现在我们要分析的问题类型,是CPU。
这个是占用 CPU 时间最多的 Rust 代码路径。
第一个函数 sled::tree::Tree::insert
在 Sled 中用于数据插入。
点击 “More” 查看详情。
上面的热代码路径是从这个 Rust 级别的 CPU 火焰图中自动推导出来的。
下面是对当前问题更详细的解释和建议。它提到了我们之前看到的 insert
函数。
点击这个图标放大火焰图。
点击 insert
函数查看更多详情。
在左侧,可以看到 view_for_key
函数占比较大。这是 Sled 库中为给定 key 获取快照视图的函数。
在右侧能看到,pagecache 是 Sled 的一个组件,用于按页面管理数据。写入的数据首先存储在 pagecache 的内存页面中。然后当批次写满时,通过刷新磁盘来持久化。
点击放大。
这是在 Glibc 中的 realloc 函数,是一个内存分配函数。我们可以看到 libc 的内存分配函数比较热。
在终端上,使用 find
命令在 cargo 缓存中查找 Sled 库源码目录。
复制找到的目录,进入 Sled 源码目录。
让我们回到原始的热代码路径。将鼠标悬停在 insert
函数的绿框上。在提示框中可以看到这个函数的源文件名。
这行源码的行号是 164。
点击这个图标,复制这个函数的源文件路径。
用 vim 编辑器打开源文件。粘贴我们刚才复制的文件路径。您可以使用任何您喜欢的编辑器。
正如 OpenResty XRay 建议的那样跳转到第 164 行。
这行代码是在 insert
函数内的。
接下来查看第二条代码路径。第二占用 CPU 时间的代码路径,消耗了近 40% 的 CPU 时间。
顶层的函数调用 get_inner
,是 Sled 库内部用于获取数据的接口。
get
函数是库对外暴露的接口,它在内部调用了 get_inner
函数。
点击 “More” 查看详情。
放大火焰图,查看 get_inner
函数调用的详情。
放大 get_inner
。
可以看到,get_inner
函数内的大部分 CPU 时间都是被前面提到的 view_for_key
函数占用。
Rust 的 Sled 库中用 sled::lru::Lru::accessed
函数,来更新 LRU 缓存中项目的访问状态。并返回需要剔除的页面 ID 列表。
全自动分析报告
OpenResty XRay 也可以自动监控在线进程,并显示分析报告。
切换到 “Insights” 页面。
您可以在 “Insights” 页面中找到以日和周为周期的报告。其实您不是非得用 “Guided Analysis” 功能。
当然 “Guided Analysis” 对于应用的开发和演示是很有用的。
关于 OpenResty XRay
OpenResty XRay 是一个动态追踪产品,它可以自动分析运行中的应用程序,以解决性能问题、行为问题和安全漏洞,并提供可行的建议。在底层实现上,OpenResty XRay 由我们的 Y 语言 驱动,可以在不同环境下支持多种不同的运行时,如 Stap+、eBPF+、GDB 和 ODB。
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!