go cpu、内存监控、性能分析:PProf

news2024/10/5 5:28:01

PProf

PProf 是什么

PProf是 golang 官方提供的性能调优分析工具,用于分析和优化Go程序的性能。

PProf通过收集和分析程序的运行时数据来生成性能分析报告。它使用Go语言的运行时特性,如代码注释和特殊的程序运行标记,来收集性能数据。PProf可以检测和测量程序中的CPU利用率、内存分配、阻塞等情况,并生成可视化的报告和图表,以帮助开发人员理解程序的行为和性能瓶颈。

PProf 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)。 profile.proto 是一个 Protobuf v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式。

有哪几种采样方式

  • runtime/pprof:采集程序(非 Server)的指定区块的运行数据进行分析。
  • net/http/pprof:基于 HTTP Server 运行,并且可以采集运行时数据进行分析。
  • go test:通过运行测试用例,并指定所需标识来进行采集。

支持什么使用模式

  • Report generation:报告生成。
  • Interactive terminal use:交互式终端使用。
  • Web interface:Web 界面。

可以做什么

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置。
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏。
  • Block Profiling:阻塞分析,记录 Goroutine 阻塞等待同步(包括定时器通道)的位置,默认不开启,需要调用 runtime.SetBlockProfileRate 进行设置。
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况,默认不开启,需要调用 runtime.SetMutexProfileFraction 进行设置。
  • Goroutine Profiling: Goroutine 分析,可以对当前应用程序正在运行的 Goroutine 进行堆栈跟踪和分析。这项功能在实际排查中会经常用到,因为很多问题出现时的表象就是 Goroutine 暴增,而这时候我们要做的事情之一就是查看应用程序中的 Goroutine 正在做什么事情,因为什么阻塞了,然后再进行下一步。

HTTP Server 使用举例

1.代码

提供一个http server,最重要一步,就是在 import 中添加 _ "net/http/pprof" 的引用

import (
	"log"
	"net/http"
	"time"

	_ "net/http/pprof"
)

var datas []string

func main() {
	go func() {
		for {
			log.Printf("len: %d", Add("go-programming-tour-book"))
			time.Sleep(time.Millisecond * 10)
		}
	}()

	_ = http.ListenAndServe("0.0.0.0:6060", nil)
}

func Add(str string) int {
	data := []byte(str)
	datas = append(datas, string(data))
	return len(datas)
}

下载安装 pprof 包,go get github.com/google/pprof 。

启动程序,访问 http://127.0.0.1:6060/debug/pprof/ ,检查是否正常响应。 

2.浏览器访问

访问 http://127.0.0.1:6060/debug/pprof/ ,页面如下:

allocs: 所有过去内存分配的样本

block: 导致同步阻塞的堆栈跟踪

cmdline: 当前程序的命令行调用

goroutine: 所有当前 goroutine 的堆栈跟踪

heap: 活动对象的内存分配情况。您可以指定 gc GET 参数以在获取堆样本之前运行 GC。

mutex: 争用互斥锁持有者的堆栈跟踪

profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。您可以在秒 GET 参数中指定持续时间。获取配置文件后,使用 go tool pprof 命令来调查配置文件。

threadcreate: 创建新操作系统线程的堆栈跟踪

trace: 当前程序的执行轨迹。您可以在秒 GET 参数中指定持续时间。获取跟踪文件后,使用 go tool trace 命令来调查跟踪。

3.可视化界面分析profile文件

1、文件下载

浏览器页面直接下载:http://127.0.0.1:6060/debug/pprof/

或者终端命令下载:wget http://127.0.0.1:6060/debug/pprof/profile

有时可能存在网络隔离问题,那也可以这么做:

curl http://localhost:6060/debug/pprof/heap?seconds=30 > heap.out

# 下载heap.out到本地
go tool pprof heap.out

2、文件分析

本地执行终端命令:该命令将在所指定的端口号运行一个 PProf 分析用的站点。

go tool pprof -http=:6001 profile文件 

如果出现错误提示 Could not execute dot; may need to install graphviz.,那么意味着你需要安装 graphviz 组件。参考 安装Graphviz

3、文件内容

通过 PProf 所提供的可视化界面,我们能够更方便、更直观的看到 Go 应用程序的调用链、使用情况等。另外在 View 菜单栏中,PProf 还支持多种分析方式的切换,如下:

接下来我们将基于 CPU Profiling 所抓取的 Profile 进行一一介绍,而其它 Profile 类型的分析模式也是互通的,只要我们了解了一种,其余的也就会了。 

Top

  • flat:函数自身的运行耗时。
  • flat%:函数自身在 CPU 运行耗时总比例。
  • sum%:函数自身累积使用 CPU 总比例。
  • cum:函数自身及其调用函数的运行总耗时。
  • cum%:函数自身及其调用函数的运行耗时总比例。
  • Name:函数名。

在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,知道当前是什么函数,正在做什么事情,占用了多少资源,谁又是占用资源的大头,以此来得到一个初步的分析方向。

Graph

该视图展示的为整体的函数调用流程,框越大、线越粗、框颜色越鲜艳(红色)就代表它占用的时间越久,开销越大。相反若框颜色越淡,越小则代表在整体的函数调用流程中,它的开销是相对较小的。

因此我们可以用此视图去分析谁才是开销大头,它又是因为什么调用流程而被调用的。

Flame Graph

 Flame Graph(火焰图)它是可动态的,调用顺序由上到下(A -> B -> C -> D),每一块代表一个函数、颜色越鲜艳(红)、区块越大代表占用 CPU 的时间更长。同时它也支持点击块深入进行分析,这样子我们就可以根据不同函数的多维度层级进行分析,能够更好的观察其流转并发现问题。

Flame Graph(new)

Peek

此视图相较于 Top 视图,增加了所属的上下文信息的展示,也就是函数的输出调用者/被调用者。 

Source

该视图主要是增加了面向源代码的追踪和分析,可以看到其开销主要消耗在哪里。

安装Graphviz

1、安装Homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

官网地址:https://brew.sh/index.html 

2、安装graphviz程序。

brew install graphviz

参考

https://golang2.eddycjy.com/posts/ch6/01-pprof-1/

Go程序内存泄露问题快速定位 - MySpace

pprof 性能分析 | Go 语言高性能编程 | 极客兔兔 

https://www.cnblogs.com/jiujuan/p/14598141.html 

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

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

相关文章

【数据结构】二叉树--链式结构的实现 (遍历)

目录 一 二叉树的遍历 1 构建一个二叉树 2 前序遍历 3 中序遍历 4 后续遍历 5 层序 6 二叉树销毁 二 应用(递归思想) 1 二叉树节点个数 2 叶子节点个数 3 第K层的节点个数 4 二叉树查找值为x的节点 5 判断是否是二叉树 一 二叉树的遍历 学习二叉树结构&#xff0…

ubuntu22.04 电脑声音和腾讯会议等声音很小怎么修复

电脑的声音很小,特别是开微信会议的时候几乎听不到声音,而声音设置都已经设置为最大 这时候就是用命令 alsamixer腾讯会议的声音 调整这两个声音的大小即可 H键弹出帮助菜单 F6按键选择声卡 左右按键选择轨道 M键静音所选轨道 上下按键调整音量…

共生与共享:线程与进程的关系

🌍前言 在计算机科学和操作系统领域,线程(Thread)和进程(Process)是两个关键概念。它们之间存在密切的关系,但又有着明显的区别。本文将深入探讨线程和进程之间的关系,以及它们在并…

CCF CSP认证 历年题目自练Day29

题目一 试题编号: 202112-1 试题名称: 序列查询 时间限制: 300ms 内存限制: 512.0MB 样例1输入 3 10 2 5 8 样例1输出 15 样例2输入 9 10 1 2 3 4 5 6 7 8 9 样例2输出 45 题目分析(个人理解) 还是…

数据库静态脱敏和动态脱敏解决方案 安当加密

安当KDPS数据保护系统的数据库脱敏功能是一种安全策略,它可以将数据库中的敏感数据进行脱敏处理,使得数据在被访问时不会泄露敏感信息。该功能主要具有以下特点: 可扩展性:可以支持多种数据库类型,如Oracle、MySQL、S…

分布式系统开发技术中的CAP定理原理

分布式系统开发技术中的CAP定理原理 在分布式系统开发中,CAP定理(一致性、可用性和分区容忍性)是指导我们设计、开发和维护系统的核心原理。该定理阐述了分布式系统中一致性、可用性和扩展性之间无法同时满足的矛盾关系,为我们提…

HDMI 基于 4 层 PCB 的布线指南

HDMI 基于 4 层 PCB 的布线指南 简介 HDMI 规范文件里面规定其差分线阻抗要求控制在 100Ω 15%,其中 Rev.1.3a 里面规定相对放宽了一些,容忍阻抗失控在 100Ω 25%范围内,不要超过 250ps。 通常,在 PCB 设计时,注意控…

深度学习_3_张量运算

代码: import torchimport osimport pandas as pd import numpy as npx torch.tensor([[1, 2, 3], [4, 5, 6]]) print(x) sumA x.sum(dim 0) print(sumA) print(torch.sum(x, dim 0, keepdim True)) print(x/torch.sum(x, dim 0, keepdim True) )

『Linux工具之』yum

前言 yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所…

rv1126-rknpu-v1.7.3添加opencv库

rv1126所使用的rknn sdk里默认是不带opencv库的,官方所用的例程里也没有使用opencv,但是这样在进行图像处理的时候有点麻烦了,这里有两种办法: 一是先用python将所需要的图片处理好后在转化为bin格式文件,在使用c或c进行读取&…

地下城堡3魂之诗食谱,地下城堡3菜谱37种

地下城堡3魂之诗食谱大全,让你解锁制作各种美食的方法!不同的食材搭配不同的配方制作,食物效果和失效也迥异。但有时候我们可能会不知道如何制作这些食物,下面为您介绍地下城堡3菜谱37种。 关注【娱乐天梯】,获取内部福…

Vue-2.8插槽

插槽分为默认插槽(组件内定制一处结构)、具名插槽(组件内定制多处结构) 作用域插槽不属于以上,只是插槽的一个传参语法 默认插槽 作用:让组件内部的一些结构支持自定义 需求:要在页面中显示…

Learning Sample Relationship for Exposure Correction 论文阅读笔记

这是中科大发表在CVPR2023的一篇论文,提出了一个module和一个损失项,能够提高现有exposure correction网络的性能。这已经是最近第三次看到这种论文了,前两篇分别是CVPR2022的ENC(和这篇文章是同一个一作作者)和CVPR20…

初识Java 13-3 异常

目录 try-with-resources语句 一些细节 新特性:try-with-resources中的实际变量 异常匹配 其他可选方式 检查型异常的一些观点 链式异常的使用 异常的使用指南 小结 本笔记参考自: 《On Java 中文版》 try-with-resources语句 层层叠叠的异常很…

消除springboot+thymeleaf时页面的红色波浪线告警

setting->Editor->Inspections取消掉Thymeleaf的√ 效果:

Zabbix登录页面出现数据库访问异常

问题概述 这是我遇到过最无语的一套zabbix服务器部署,也不知道是否有心要刁难我…搞定一波又来一波,每次都不重样的。这次是客户自己不知道倒腾什么东西,竟然是将zabbix密码给改了的。他的意思是项目完毕,公司规定必须要将密码进…

记录:R语言生成热图(非相关性)

今天解决了一个困扰了我很久的问题,就是如何绘制不添加相关性的热图。一般绘制热图是使用corrplot包画相关性图,但是这样有一个前提,就是输入的数据集必须进行相关性分析。那么如果我不需要进行相关性分析,而是直接绘制能够反应数…

微信小程序 movable-view 控制长按才触发拖动 轻轻滑动页面正常滚动效果

今天写 movable-areamovable-view遇到了个头疼的问题 那就是 movable-view 监听了用户拖拽自己 但 我们小程序 上下滚动页面靠的也是拖拽 也就是说 如果放在这里 用户拖动 movable-view部分 就会永远触发不了滚动 那么 我们先可以 加一个 bindlongpress"longpressHandler…

网工内推 | 技术支持工程师,厂商公司,HCIA即可,有带薪年假

01 华为终端有限公司 招聘岗位:初级技术支持 职责描述: 1、通过远程方式处理华为用户在产品使用过程中各种售后问题; 2、收集并整理消费者声音,提供服务持续优化建议; 3、对服务中发现的热点、难点问题及其他有可能造…

火伞云Web应用防火墙的特点与优势

在前文中,我们已经介绍了Web应用防火墙(WAF)的基本原理和重要性。接下来,我们将深入探讨火伞云Web应用防火墙的特点与优势,了解它如何为企业提供更为完善和专业的网络安全保障。 一、强大的防御能力 火伞云Web应用防火…