如何使用 Diago 诊断 Go 程序中的 CPU 和内存使用情况

如何使用 Diago 诊断 Go 程序中的 CPU 和内存使用情况

原文链接:https://remy.io/blog/how-to-use-diago-to-diagnose-cpu-and-memory-usage-in-go-programs/

作者:Rémy Mathieu

https://github.com/remeh/diago

Diago 是借助 pprof 生成的配置文件和堆快照的可视化工具。

它是一个独立的应用程序,显示每个函数(或函数中每行代码)的 CPU 使用率的调用树,但也可以显示堆快照。

我们将在这篇简短的文章中介绍如何使用 Diago 来深入了解 Go 程序并帮助您调试它们。

Diago displaying the CPU usage of each function in a call tree

在 Go 程序中运行 pprof

如果您知道如何将 pprof 与 Go 二进制文件一起使用,则本节没有你太多不知道的内容。如果你不熟悉 pprof,您会发现它其实很简单。

有几种使用 pprof 进行性能分析的方法,我们将重点介绍最简单的方法:使用 HTTP Handler。

Go 标准库附带了一个 HTTP 处理程序,该处理程序导出了概要分析样本,堆快照,goroutines 信息,trace 等等。如果您已经在程序中使用了 HTTP 服务器,则通过导入 net/http/pprof 即可启用它:

import _ "net/http/pprof"

如果您尚未在程序中提供 HTTP 服务,则最简单的入门方法是如上所述导入包并将此代码段添加到程序中:

go func() {
    log.Println(http.ListenAndServe("localhost:6060", nil))
}()

完成此操作后,通过 http://localhost:6060/debug/pprof 可以获得所有 pprof 信息。

获取 profile 和堆快照

既然通过 HTTP 公开了 pprof 数据,那么检索 profile 和堆快照非常容易。

Profile

Profile 将包含有关每个函数在 CPU 中花费的时间的信息。这是一个比例值:pprof 不会确切统计每个函数在 CPU 上运行了多长时间,相反,pprof 按一定频率捕获 CPU 使用情况的样本,然后由可视化工具进行汇总。

由于样本是按频率由 pprof 捕获的,因此您可以决定希望 pprof 收集它们多久的时间。假设我们要让 pprof 运行 30 秒,我们可以使用 curl 下载 30 秒的 Profile 文件:

curl "http://localhost:6060/debug/pprof/profile?seconds=30" > profile

堆快照

pprof 还允许您捕获堆的快照。这是捕获它的命令:

curl "http://localhost:6060/debug/pprof/heap" > heap

我们将在可视化章节中看到该文件中包含两种信息:自程序启动以来为每个函数分配的内存总量,以及每个函数在捕获时使用的内存量。

使用 Diago 可视化 Profile 文件和堆快照

首先,如果要编译和安装 Diago,请使用以下命令:

go get -u github.com/remeh/diago

为了使 profile 文件可视化,请启动 Diago 并使用 -file 选项提供要打开的文件路径:

./diago -file profile

这时,您应该具有这样的可视化效果:

Diago displaying the CPU usage of each function in a call tree

您可以执行相同的操作来打开堆快照:

./diago -file heap

Diago displaying the memory allocated of each function in a call tree

在上面的屏幕快照中,您可以观察到我们正在查看该程序自启动以来每个函数分配的总内存(此屏幕快照中观察到的堆实际上是 Diago 的堆快照)。

在右上角,您可以看到一个开关,用于选择其他模式,以显示捕获时的内存使用情况。

结论

还有其他工具可以帮助您在火焰图或点图中可视化这些文件,甚至可以使用 pprof 命令行工具按最高值等显示数据。

我之所以开发此工具,是因为有时我想在树中可视化此类信息,并希望它也对您有用。

欢迎关注我的公众号:

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据