Go oom分析(二)——导出dump离线分析

ops/2025/1/12 13:09:50/

在 Go 程序中导出内存或 CPU 的 dump 文件(通常通过 pprof 工具生成)并进行分析,以下是详细步骤:

1. 在程序中开启 pprof

在你的 Go 程序中引入 net/http/pprof,开启 pprof 服务:

import (_ "net/http/pprof""log""net/http"
)func init() {go func() {log.Println(http.ListenAndServe("localhost:6060", nil))}()
}

这样会在 localhost:6060 开启一个 HTTP 服务器,提供调试接口。

2. 导出 Dump 文件

通过访问 pprof 提供的接口,可以导出 CPU、堆内存、Goroutines 等的 dump 文件。

(1)CPU Profile

捕获一段时间的 CPU 使用数据:

curl http://localhost:6060/debug/pprof/profile?seconds=30 -o cpu.prof

默认采样时间是 30 秒,可调整 seconds 参数。

2)Heap (内存分配)

导出当前堆内存分配情况:

curl http://localhost:6060/debug/pprof/heap -o heap.prof

3)Goroutines

导出当前所有 Goroutines 的状态:

curl http://localhost:6060/debug/pprof/goroutine -o goroutine.prof

(4)其他

  • Block(阻塞分析)

curl http://localhost:6060/debug/pprof/block -o block.prof

注意:需要在程序中开启阻塞分析:

import "runtime"
func init() {runtime.SetBlockProfileRate(1)
}

Mutex(锁分析)

curl http://localhost:6060/debug/pprof/mutex -o mutex.prof

注意:需要开启锁分析:

import "runtime"
func init() {runtime.SetMutexProfileFraction(1)
}

3. 分析 Dump 文件

导出的 .prof 文件可以用以下工具分析:

(1)使用 go tool pprof

运行以下命令:

go tool pprof <binary> <dump_file>

例如:

go tool pprof ./your_app cpu.prof

在交互界面中,常用命令:

  • top:显示占用资源最多的函数。
  • list <function>:查看某个函数的详细实现。
  • web:生成调用图(需要 Graphviz 支持)。

如果是远程服务:

go tool pprof http://localhost:6060/debug/pprof/heap

(2)使用火焰图

.prof 转为火焰图形式,更直观:

  • 安装 FlameGraph 工具。
  • 导出火焰图:
go tool pprof -svg <binary> <dump_file> > profile.svg
  • 打开生成的 profile.svg 进行查看。

4. 在线分析工具

你也可以将 dump 文件上传到在线分析工具(如 pprof.me)中进行图形化展示。

5. 浏览器分析

go tool pprof -http=0.0.0.0:8080 ./your_app heap.prof

5. 示例操作

假设运行一个 Go 应用:

./your_app

程序运行中出现内存占用异常,通过以下步骤排查:

  • 导出当前堆内存:
curl http://localhost:6060/debug/pprof/heap -o heap.prof
  • 分析 dump 文件:
go tool pprof ./your_app heap.prof
  1. 在交互界面中查看:
    • top:检查内存占用最大的函数。
    • web:生成调用图。


http://www.ppmy.cn/ops/149453.html

相关文章

利用AI大模型和Mermaid生成流程图

核心点1&#xff1a;利用大模型生成流程图的语句&#xff08;Code&#xff09; 确定业务流程&#xff1a; 用户需要明确要绘制的业务流程&#xff0c;包括主要步骤、决策点以及各步骤之间的关系。将确定的业务流程以文字形式描述出来。 生成Mermaid代码&#xff1a; 将描述好的…

Windows下调试Dify相关组件(2)--后端Api

1.部署依赖的服务&#xff08;代码最外层的docker目录&#xff09; 1.1 将middleware.env.example复制&#xff0c;并改名为middleware.env。 1.2 查看docker-compose.middleware.yaml&#xff0c;有5个服务 db&#xff1a;postgres数据库。 redis&#xff1a;redis缓存。 sa…

[ComfyUI]接入Google的Whisk,巨物融合玩法介绍

一、介紹​ 前段时间&#xff0c;谷歌推出了一个图像生成工具whisk&#xff0c;有一个很好玩的图片融合玩法&#xff0c;分别提供三张图片,就可以任何组合来生成图片。​ ​ 最近我发现有人开发了对应的ComfyUI插件&#xff0c;对whisk做了支持&#xff0c;就来体验了下&#…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析

2024.12 中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 一、单选题(共25题&#xff0c;共50分) 1. 已知字典如下 dic1 { name: Ming, age:20, grade: A, Tel:6666666 } 以下哪个代码运行结果为20&#xff…

多个表单使用相同的 ref 和 rules,表单验证规则不生效

在 Vue 和 Element UI 中&#xff0c;如果多个表单使用相同的 ref 和 rules&#xff0c;可能会导致表单验证规则不生效。这是因为 ref 是唯一的&#xff0c;多个表单共享同一个 ref 会导致冲突。 解决方法&#xff1a; 1. 为每个表单设置不同的 ref 为每个表单设置不同的 re…

VTK知识学习(29)-交互问题

1、窗体类型 1&#xff09;、RenderWindowControl UserControl derived implementation of vtkRenderWindow for use in Windows Forms applications. The client area of this UserControl is completely filled with an instance of a vtkRenderWindow. 用于Windows窗体应…

本地系统A与云平台B数据对接demo演示

.一、云平台B提供工程类库【.net工程类库&#xff0c;直接调用】 本地系统A-本地电脑调用&#xff0c;电脑连接互联网 云平台B-互联网云平台-提供cs文件&#xff0c;接口文档。 1.c#类库 2.控制台或winform直接调用c#类库&#xff1b; 3.云平台B输出【c#源文件】 4.cs文件端…

【数据链电台】洛克希德·马丁(Lockheed Martin)

洛克希德马丁公司&#xff08;Lockheed Martin&#xff09;是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统&#xff0c;包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…