Go 提供了一些出色的诊断工具,可帮助我们深入了解应用程序的执行情况。
1. 分析工具
分析工具可观测应用程序执行的各种指标。它使我们能够解决性能问题、检测争用、定位内存泄漏等。这些指标可以通过以下几个配置文件收集:
- CPU--确定应用程序将时间花在了哪里
- Goroutine--报告正在进行的 goroutine 的栈跟踪
- Heap--报告堆内存分配以监控当前内存使用情况,并检查可能的内存泄露
- Mutex--报告锁争用,以查看代码中使用的互斥锁的行为,以及应用程序是否在锁定调用上花费了太多时间
- Block--显示 goroutine 阻塞等待同步原语的位置。
在 Go 中,有一款分析工具名为 pprof 。首先,让我们了解如何以及何时启用 pprof; 然后,我们讨论最关键的配置文件类型。
启用 pprof
有几种方法可以启用 pprof 。例如,我们可以使用 net/http/pprof 包通过 HTTP提供分析数据:
package main
import (
"fmt"
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "")
})
log.Fatal(http.ListenAndServe(":80", nil))
}
导入 net/http/pprof 会产生副作用,使我们能够访问 pprof URL, http://host/debug/pprof。请注意,即使在生产环境中启用 pprof 也是安全的。影响性能的配置,如 CPU 分析,默认情况下不启用,也不会连续运行,它们仅在特定时间段内被激活。
现在我们已经了解了如何暴露 pprof 服务端,让我们讨论最常见的配置。
CPU 分析
CPU分析依赖于操作系统和信号。当它被激活时,应用程序默认通过 SIGPROF 信号要求操作系统每 10 ms 中断一次。当应用程序收到 SIGPROF 信号时,它会暂停当前活动并将执行转移到分析工具。分析工具收集诸如当前 goroutine 活动之类的数据,并汇总我们可以检索的执行统计信息。然后分析工具停止,应用程序继续执行直到下一个 SIGPROF 。
我们可以通过访问 /debug/pprof/profile 端点来激活 CPU 分析。默认情况下,访问此端点会执行 30 s 的 CPU 分析。在 30 s内,应用程序每 10 ms 中断一次。 请注意, 我们可以更改这两个默认值:可以使用 second 参数向端点传递分析应该持续多长时间(例如,/debug/pprof/profile?seconds=15),还可以更改中断速率 (甚至小于 10 ms)。但在大多数情况下,10 ms 应该足够了,在减小这个值 (意味着增加速率) 时,应该注意不要损害性能。 30 s 后,我们可下载 CPU 分析的结果。
从这个文件中,我们可以使用 go tool 浏览到分析结果:
$ go tool pprof -http=:8080 <file>
此命令会打开一个显示调用图的 Web UI。下图显示了一个应用程序的例子。箭头越大,它越是热门路径。然后我们可以浏览到这张图表并获得执行参数。
下图告诉我们,在 30s 内, decode 方法