Go诊断工具

        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 方法

相关推荐

  1. Linux诊断机器故障工具—dmesg命令

    2024-04-25 19:40:02       38 阅读
  2. Go 语言开发工具

    2024-04-25 19:40:02       61 阅读
  3. go-工具】pprof

    2024-04-25 19:40:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 19:40:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 19:40:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 19:40:02       82 阅读
  4. Python语言-面向对象

    2024-04-25 19:40:02       91 阅读

热门阅读

  1. el-table 表格自带全选按钮隐藏

    2024-04-25 19:40:02       25 阅读
  2. flask + celery + redis + flower

    2024-04-25 19:40:02       33 阅读
  3. C 语言实例 - 字符转 ASCII 码

    2024-04-25 19:40:02       32 阅读
  4. HashMap 和 HashTable的异同

    2024-04-25 19:40:02       32 阅读
  5. Linux c++ 中文字符转十六进制 UTF-8 编码

    2024-04-25 19:40:02       23 阅读
  6. 【React】生命周期

    2024-04-25 19:40:02       31 阅读
  7. 【vue】axios封装拦截

    2024-04-25 19:40:02       27 阅读
  8. Electron vue 进程间消息通行

    2024-04-25 19:40:02       34 阅读
  9. LeetCode-数组中最长的方波

    2024-04-25 19:40:02       35 阅读