线上快速定位硬盘 I/O 高的 Rust 代码路径(使用 OpenResty XRay)
在本教程中,您将学习如何利用 OpenResty XRay 对在线 Rust 应用的硬盘 I/O 高的问题进行定量分析。通过 OpenResty XRay 生成的 Rust 级别硬盘写入次数、延时以及吞吐量火焰图,您能够识别出导致硬盘读写延迟最长和数据量最大的 Rust 代码路径。此外,它还能帮助您精确到具体的 Rust 代码行,从而快速定位问题所在,并指导优化。
问题:硬盘 I/O 高
首先,运行 ps
命令来查看应用。
我们可以看到一个名为 sled-service
的 Rust 应用。它基于 Sled,一个由 Rust 编写的嵌入式 KV 数据库。
让我们使用 OpenResty XRay 来检查这个应用中硬盘的运行情况。
定位有问题的 Rust 代码路径
跳转到 OpenResty XRay 的 Web 控制台。确保当前分析的机器是正确的。
进入 “Guided Analysis” 页面。
这里可以看到系统能分析的不同类型的问题。
选择 “High disk IO”。
点击 “Next”。
选择名为 sled-service
的 Rust 应用。
选择这个 rust
进程。
确保应用的类型是正确的。通常默认值就是对的。
这里的语言级别就只有 “Rust” 了。
我们还可以设置最长的分析时间。这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析。目前它正在运行第一轮分析。
第一轮分析已经完成,现在进入第二轮。对这个例子来说,运行一轮分析就够了。
停止分析。
可以看到自动生成了一份分析报告。
这是我们要分析的问题类型,“Disk I/O”。
这是对硬盘写入操作次数的分析。
这条代码路径的磁盘写入操作最多。
这两个 __libc_pwrite64
函数,是用于在文件的特定位置写入数据的 C 函数。
在 Rust 标准库中,write_at
和 write_at_all
都是在文件中特定位置写入数据的函数。
pwrite_all
函数负责支持将整页数据并行写入文件。
write_to_log
函数用于将数据写入日志文件,以便进行持久化存储或其他操作。
点击查看更多详情。
这条热代码路径是从这个 Rust 级别的硬盘写入次数火焰图自动推导出来的。
下面是对问题更详细的解释和建议。
它提到了函数 pwrite64
。
让我们回到原始的代码路径。将鼠标停在这个函数的绿框上。在提示框中可以看到源文件名的完整路径。
这行源码的行号是 730。
点击这个图标,复制这个函数的源文件路径。
用 vim 编辑器打开源文件。 查看文件里的 Rust 代码。您可以使用任何您喜欢的编辑器。
正如 OpenResty XRay 建议的那样检查第 730 行。
pwrite_all
函数是 Sled 库中用于将数据写入日志文件的函数。它的作用是以原子方式将一个数据块写入到文件的特定偏移量处。
这是对硬盘写入延时的分析。
这条代码路径正在向数据库数据文件写入代码。
它几乎是硬盘写入延时的全部来源。
这是对硬盘写入吞吐量的分析。
它与写入数据库数据文件的代码路径相同。
这条路径的写入速率接近 12 兆字节每秒。
这些是磁盘写入最频繁的文件。
该文件的写入数据量最大。它是 Sled 应用的数据库文件。
其读取速率达到了 6.4MB 每秒。
这些是累积写入延时最长的文件。
这个文件也是写入数据延迟最高的文件。
延时占比约为 40%。
全自动分析报告
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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!