Go程序出问题了?有pprof!

news2024/10/18 15:05:42

什么情况下会关注程序的问题?

一是没事儿的时候

二是真有问题的时候

哈哈哈,今天我们就来一起了解一下Go程序的排查工具,可以说即简单又优雅,它就是pprof。

在 Go 中,pprof 工具提供了一种强大而灵活的机制来分析 Go 程序。pprof是 Go 中"profile"的缩写,是一种用于收集和分析 Go 程序运行时配置文件的工具。它提供了各种类型的配置文件,包括 CPU 分析、内存分析、goroutine 分析等。

程序中打开pprof的默认主页:

Go 语言 pprof 工具支持分享的指标:

(1) allocs: 所有过去内存分配的采样。

(2) block: 导致在同步原语上阻塞的堆栈跟踪。

(3) cmdline: 当前程序的命令行调用。

(4) goroutine: 所有当前 goroutine 的堆栈跟踪。使用 debug=2 作为查询参数可以以与未恢复的 panic 相同的格式导出。

(5) heap: 活跃对象的内存分配的采样。你可以指定 gc GET 参数来在采集堆样本之前运行 GC(垃圾回收)。

(6) mutex: 有争用的互斥锁持有者的堆栈跟踪。

(7) profile: CPU 分析文件。你可以指定 seconds GET 参数来指定分析的持续时间。获取到分析文件后,使用 go tool pprof 命令来调查分析。

(8) threadcreate: 导致创建新的 OS 线程的堆栈跟踪。

(9) trace: 当前程序的执行跟踪。你可以指定 seconds GET 参数来指定跟踪的持续时间。获取到跟踪文件后,使用 go tool trace 命令来调查跟踪。

其实总结下来,我们在日常使用pprof主要分析三个方面

  • CPU 性能分析: CPU 分析允许开发人员分析在 Go 程序中执行不同功能所花费的时间。这有助于识别消耗大量 CPU 时间的函数,并且可以进行优化以提高性能。

  • 内存分析: 内存分析有助于识别 Go 程序中的内存泄漏、内存分配过多和内存使用效率低下。它提供了对内存分配模式的见解,使开发人员能够优化内存使用并防止与内存相关的问题。

  • goroutine分析:goroutine 分析提供有关 Go 程序中 goroutine 的创建、阻止和销毁的信息。这有助于识别可能影响性能的问题,例如过多的 goroutine 创建或阻止操作。

使用pprof

要使用 pprof,我们需要在Go程序中导入 net/http/pprof,当然除了Go语言自带的分析工具,也有其他的三方工具帮助我们进行程序性能分析,比如github.com/mkevac/debugcharts,我们同pprof一样的方式进行导入。

除此之外,我们在程序中还提供了两个方法,并能够通过http进行访问:

  • manyGo:增加程序运行中的goruntine数量

  • memoryLeak:增加程序运行中的内存

下面是具体的代码:

package main

import (
	"fmt"
	"net/http"
	"time"

	_ "github.com/mkevac/debugcharts" // 添加后可以查看几个实时图表数据
	_ "net/http/pprof"
)

func memoryLeak() {
	var s [][]int
	for i := 0; i < 1000; i++ {
		s = append(s, make([]int, 1000))
	}
}

func main() {
	http.HandleFunc("/manyGo", func(writer http.ResponseWriter, request *http.Request) {
		fmt.Println("manyGo...")
		go func() {
			time.Sleep(30 * time.Minute)
		}()
		_, _ = writer.Write([]byte("Hello"))
	})
	http.HandleFunc("/memoryLeak", func(writer http.ResponseWriter, request *http.Request) {
		fmt.Println("memoryLeak...")
		memoryLeak()
		_, _ = writer.Write([]byte("Hello"))
	})
	_ = http.ListenAndServe(":8001", nil)
}

启动服务后我们先看下当前的状态:

首先看下pprof(http://localhost:8001/debug/pprof)

再看下插件显示的:

然后我们使用jmeter进行HTTP接口的多线程测试:

(1)使用10*10个线程访问http://localhost:8001/manyGo接口:

观察goruntine情况:

图表观察:

(2)使用100*10个线程访问http://localhost:8001/memoryLeak接口:

观察堆内存情况:

图表观察:

对比程序找出问题

我们再看下具体的goruntine信息http://localhost:8001/debug/pprof/goroutine?debug=1,会发现goruntine出现在哪一行代码

然后我们还可以使用Go自带的pprof查看工具来看一下:

go tool pprof -seconds=10 -http=:9999 http://localhost:8001/debug/pprof/heap

然后我们打开http://localhost:9999/ui:

就会发现这个工具会在网页端以源码的方式展示出内存使用和比例信息等,可以帮助我们深入的分析。

总结

通过上面对pprof工具的使用,发现其在Go程序分析中具有重要作用。具体来说,pprof通过收集程序运行时的信息,生成可视化的报告,帮助开发者理解程序的行为,并找出代码中的性能问题。

其他相关博客推荐

https://colobu.com/2019/08/28/go-memory-leak-i-dont-think-so/

https://medium.com/@danielmalagurti/managing-memory-leaks-in-go-a-practical-guide-54d3c8d6487d

https://www.cnblogs.com/aquester/p/14344975.html

https://blog.xizhibei.me/2021/06/27/golang-heap-profiling/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看潮成长日程表用户手册(上)

看潮成长日程表用户手册&#xff08;上&#xff09; 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程&#xff0c;按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?

作者&#xff1a;zhang siege 链接&#xff1a;https://www.zhihu.com/question/20400700/answer/91106397 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 首先&#xff0c;泛型的出现时为了安全&#xff0c;所有与…

ai发展会不会带来企业的员工垄断呢

写代码写累了&#xff0c;写点个人不成熟的想法&#xff0c;作为记录 随着gpt-4o发布&#xff0c;可以预计的是&#xff0c;AI逐渐能够通过各种外接设备和传感器和真实世界实时交互。那么未来一个接上摄像头&#xff0c;键盘&#xff0c;音响&#xff0c;可移动身体的的AI还会…

改进rust代码的35种具体方法-类型(十九)-避免使用反射

上一篇文章 从其他语言来到Rust的程序员通常习惯于将反思作为工具箱中的工具。他们可能会浪费很多时间试图在Rust中实现基于反射的设计&#xff0c;却发现他们所尝试的事情只能做得不好&#xff0c;如果有的话。这个项目希望通过描述Rust在反思方面做什么和不做什么&#xff0c…

VS QT 里头文件的<>和““的区别

今天在跑项目的时候遇到这么个问题&#xff0c;在添加api宏定义的时候&#xff0c;不加显示无法识别的外部错误&#xff0c;加了显示找不到文件。反正就是怎么都是错的&#xff0c;但是我检查了CmakeLists、模块所在文件夹、项目路径都是没有问题的。非常奇怪。 然后就开始尝试…

Stable Diffusion WebUI能运行但无法调试,一直报错:TypeError: ‘Task‘ object is not callable

Stable Diffusion WebUI正常运行模式&#xff08;Run&#xff09;能运行&#xff0c;但是调试模式&#xff08;Debug&#xff09;无法运行&#xff0c;一直报错&#xff1a;TypeError: ‘Task‘ object is not callable ⚙️1.软件环境⚙️&#x1f50d;2.问题描述&#x1f50d…

【vue/uniapp】ucharts 可以横向拖动查看数据(当图表数据过多时),避免叠加

效果参考&#xff1a; 实现&#xff1a; 需要在 opts 中配置&#xff1a;enableScroll: true 和 ontouch:true&#xff1b;在 opts 的 xAxis 中配置&#xff1a;itemCount: 5&#xff08;值可以自定义&#xff0c;如图&#xff0c;为默认展示几个&#xff09;&#xff1b; …

theharvester一键收集域名信息(KALI工具系列十)

目录 1、KALI LINUX简介 2、theharvester工具简介 3、在KALI中使用theharvester 3.1 用搜索引擎扫描 3.2 扫描并输出结果 3.3 扫描某域名下的所有账号 3.4 使用所有的搜索引擎扫描 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&…

vue koa post 请求代理失败问题总结

场景是在使用 koa 写接口时&#xff0c;客户端发送 post 请求&#xff0c;服务端会报下面这个错误&#xff0c;导致接口未能访问成功&#xff1a; 前端接口一直 Pending 状态&#xff0c; 解决方案&#xff1a;走的是本地 mock 数据&#xff0c;未访问服务端的接口 总结&#x…

AWR中的电磁仿真算法---特点与运用场景

AWR中的电磁仿真算法—特点与运用场景 在使用AWR软件进行射频电路、芯片设计时&#xff0c;发现其中有非常多的仿真器选项&#xff0c;这些电磁仿真器有什么特点呢&#xff1f;在此简单分析介绍。 算法名称运用场景特点AXIEM算法微带线、带状线、MMIC矩量法运算&#xff0c;…

自用升级centos7.2的默认Python 2.7.5为python3.8

wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgztar zxvf Python-3.8.8.tgz 进入刚刚解压后的目录 ./configure --prefix/data/soft/python3按照上面截图所属&#xff0c;需要安装gcc 安装报错需要安装 sudo yum install zlib1g-dev make -j4 make install -…

芯品荟 | 理疗仪屏驱案例分享

PART ONE 市场简介 - Market Profile - 理疗仪&#xff08;Physiotherapy instrument&#xff09;是物理治疗仪器的简称&#xff0c;是将物理因子作用于人体&#xff0c;使之产生好转的设备&#xff0c;适用于家庭、办公室等场所。 红外理疗仪能发挥作用&#xff0c;主要靠…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

走进波士顿科学公司,艾威张老师为其分享项目管理方法,提升员工项目管理能力!

2024年5月22日下午&#xff0c;艾威培训公司应邀为波士顿科学公司PMO部门举办了一场特别的项目管理在线知识分享。本次分享由艾威培训项目管理讲师张老师主讲&#xff0c;主题为“一小时读懂项目管理”。此次活动旨在帮助波士顿科学公司的员工更好地理解项目管理的基本概念和实…

5.29高通技术分享抢先看 | 2024高通边缘智能创新应用大赛公开课

火力全开&#xff01;2024高通边缘智能创新应用大赛首期公开课将在5月29日晚上8点炫酷启动&#xff01; 届时&#xff0c;来自大赛主办方高通技术公司的产品市场总监李骏捷和高级资深工程师李万俊将于云端聚首&#xff0c;带来一场关于边缘智能的前沿技术对话。 各位参赛者及…

LLM提示工程的技巧

1. 从简单开始&#xff08;Start Simple&#xff09; 避免在一开始就增加太多的复杂性。 从简单的提示开始&#xff0c;然后在后续提示中添加更多信息和上下文。 这样&#xff0c;提示就是一个迭代过程&#xff0c;提示在此过程中进一步发展。 从简单的开始&#xff0c;就有足…

基于transformers框架实践Bert系列5-阅读理解(文本摘要)

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组&#xff0c;我们在利用单调栈模板的基础上还需要将给定数组扩大一倍&#xff0c;但实际上我们只需要利用取余的操作模拟扩大数组即可&#xff08;具体操作看代码。在解决有…

git push后一直卡在在Writing objects:问题

git push后一直卡在Writing objects: 解决&#xff1a;设置 git config --global http.postBuffer 5242880000在执行git push。 一般设置后就可以成功了&#xff0c;后面不用看。 2. 我这里结果又报错&#xff1a; fatal: protocol error: bad line length 8192 MiB | 107.46 …

科技与心理学的协同舞蹈

在探讨盲人如何利用如“蝙蝠避障”这样的辅助软件融入日常生活的同时&#xff0c;我们不得不深入触及盲人教育心理学的核心&#xff0c;这一领域致力于理解盲人在学习与成长过程中独特的心理需求与挑战&#xff0c;以及如何通过教育策略激发他们的潜能&#xff0c;促进全面发展…