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

devtools/2025/1/12 11:57:25/

在 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/devtools/149865.html

相关文章

Differential Transformer

Differential Transformer 差分Transformer ​ ​论文地址:https://arxiv.org/pdf/2410.05258 差分 Transformer 的轻量实现,https://github.com/Jaykef/ai-algorithms/blob/main/DIFF_Transformer.ipynb 摘要 Transformer倾向于过度分配注意力到无关的上下文。在本文中…

MySQL8 使用 ProxySQL 来实现 MySQL 主从同步的读写分离和负载均衡

好的,使用 ProxySQL 来实现 MySQL 主从同步的读写分离和负载均衡是一个非常不错的选择!我可以带你逐步了解如何配置和使用 ProxySQL。以下是一个简单的入门教程,帮助你在 MySQL 环境中配置 ProxySQL。 1. 安装 ProxySQL 首先,你需要安装 ProxySQL。它支持多种操作系统,下…

ISP各模块功能介绍

--------声明&#xff0c;本文为转载整理------- ISP各个模块功能介绍&#xff1a; 各模块前后效果对比&#xff1a; 黑电平补偿&#xff08;BLC&#xff09; 在理想情况下&#xff0c;没有光照射的像素点其响应值应为0。但是&#xff0c;由于杂质、受热等其它原因的影响&…

工业互联网项目开发工作流及各阶段核心关注点

工业互联网项目开发全流程V3.0 工业互联网项目开发工作流程及核心问题 一、需求分析 1、共享平台需求分析 这个平台要解决什么问题&#xff1f; 这个平台的用户群体是谁&#xff1f; 这个平台应该具备哪些主要功能&#xff1f; 这个平台的使用场景是什么&#xff1f; 这个平…

RCE漏洞

rce漏洞&#xff0c;即远程代码执行和远程命令执行漏洞。这种漏洞允许攻击者在后台服务器上远程注入操作系统命令或代码&#xff0c;从而控制后台系统。 在很多Web应用中&#xff0c;开发人员会使用一些特殊函数&#xff0c;这些函数以一些字符串作为输入&#xff0c;功能是将…

Redis:持久化机制

Redis 的持久化机制是确保数据在服务器重启后不会丢失的关键功能。它提供了两种主要的持久化方式:RDB(Redis Database Backup)快照和 AOF(Append Only File)日志记录。 1. RDB 快照(Redis Database Backup) 简介 概念:RDB 是 Redis 在指定的时间点将内存中的所有数据…

网络数通之DHCP

DHCP 概念&#xff1a;动态主机配置协议&#xff0c;该协议提供了一种动态分配网络配置参数的机制&#xff0c;并向后兼容BOOTP协议。 DHCP的工作原理&#xff1a; &#xff08;1&#xff09;发现阶段&#xff1a;DHCP客户寻找DHCP服务器的过程。DHCP客户端依广播的形式发送…

Golang笔记——语言基础知识

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Go语言的基础知识&#xff0c;包括数据类型&#xff0c;深浅拷贝&#xff0c;编程范式&#xff0c;Go语言是一种静态&#xff08;静态类型语言 和…