Golang Profiling - pprof 使用

news2024/11/15 14:10:00

Golang Profiling - pprof 使用

在编写大型应用程序,处理复杂业务与逻辑时,开发者经常面临系统内存泄漏问题。查找代码是否有效运行的一种有效方法是检查内存堆、CPU、磁盘的使用情况。

要在运行时检查Go应用程序的CPU和内存使用情况以及其他配置文件,开发者可以使用 pprof包。根据profile提供的基础功能在运行时检查以下详细信息:

  • CPU
  • Memory/Heap
  • Thread/Go routines
  • Block
  • Mutex

pprof 用法的基本顺序如下

  • 启动 profiles
  • 保存 profiles文件
  • 分析 profiles

开启Profile

导入pprof包并设置Web服务器以获取go profile。要做到这一点,只需要引入pprof包即可

import  _ "net/http/pprof"

完整代码如下

package main

import (
	"fmt"
	"log"
	"net/http"
	_ "net/http/pprof"
	"sync"
	"time"
)

func main() {
	// we need a webserver to get the pprof webserver
	go func() {
		log.Println(http.ListenAndServe("localhost:6060", nil))
	}()
	fmt.Println("hello world")
	var wg sync.WaitGroup
	wg.Add(1)
	go leakyFunction(wg)
	wg.Wait()
}

func leakyFunction(wg sync.WaitGroup) {
	defer wg.Done()
	s := make([]string, 3)
	for i := 0; i < 10000000; i++ {
		s = append(s, "magical pandas")
		if (i % 100000) == 0 {
			time.Sleep(500 * time.Millisecond)
		}
	}
}

代码开发完成之后,启动程序

保存Profile

运行Go应用程序,选择待分析的Profile信息,调用web服务获取profile相关指标。

  • 获取运行时堆栈信息
curl http://localhost:6060/debug/pprof/heap
  • 如需要获取最近运行时间内堆栈信息,使用以下命令
curl http://localhost:6060/debug/pprof/heap?seconds=n
  • 开发者可以很方便的将运行时的堆栈信息保存为指定文件,便于时候分析
curl http://localhost:6060/debug/pprof/heap --output heap.tar.gz

在这里插入图片描述

在这里插入图片描述

分析Profile

分析堆栈信息,可以使用 go tool pprof命令,格式如下

go tool pprof heap.tar.gz

进入交互shell后,输入top命令查看内存中正在使用的函数,以及每个函数的内存使用量

在这里插入图片描述

为了简化操作的复杂性(需要先存储文件,再分析),可以将这两个步骤 合并成一个指令

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

在这里插入图片描述

  • 其他用法

Profile 可以从各种维度分析应用程序的实时运行状态,具体包含以下几类

goroutine    - stack traces of all current goroutines
heap         - a sampling of all heap allocations
threadcreate - stack traces that led to the creation of new OS threads
block        - stack traces that led to blocking on synchronization primitives
mutex        - stack traces of holders of contended mutexes
  • 获取CPU信息
curl http://localhost:6060/debug/pprof/goroutine > goroutine.tar.gz
  • 获取Thread信息
curl http://localhost:6060/debug/pprof/threadcreate > thread.tar.gz
  • 获取Profile信息
curl http://localhost:6060/debug/pprof/profile > profile.tar.gz
  • 获取trace信息
curl http://localhost:6060/debug/pprof/trace?seconds=5 > trace.tar.gz
  • 获取block信息
curl http://localhost:6060/debug/pprof/block > block.tar.gz
  • 获取mutex信息
curl http://localhost:6060/debug/pprof/mutex > mutex.tar.gz

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

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

相关文章

LeetCode | 704. 二分查找

题&#xff1a;力扣 704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c; 写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。示例 1:输入: nums [-1,0,3,5,9,1…

Lua 调试(Debug)

Lua 调试(Debug) 参考至菜鸟教程。 Lua 提供了 debug 库用于提供创建我们自定义调试器的功能。Lua 本身并未有内置的调试器&#xff0c;但很多开发者共享了他们的 Lua 调试器代码。 Lua 中 debug 库包含以下函数&#xff1a; 序号方法 & 用途1.debug():进入一个用户交互模…

2022年前端React杂记

以下记录的是&#xff0c;我在学习中的一些学习笔记&#xff0c;这篇笔记是自己学习的学习大杂烩&#xff0c;主要用于记录&#xff0c;方便查找1、学习概述React 是当下最火的前端三大框架之一。之前一直没有时间来学习&#xff0c;国庆得空来快速消掉这一块的盲点。学习react…

python 字典 小白笔记

字典反映的是一种映射关系。1.定义用花括号括起来&#xff0c;每个元素包括键值对&#xff0c;键必须是可以用哈希值计算的对象&#xff0c;通常是数字或者字符串。值可以是任何类型的对象。键和值之间用“&#xff1a;”分割。zidian{jian:zhi,jian1:zhi,}2.查找字典可以用键获…

python采集某所有数据,从此不用money

前言 大家早好、午好、晚好吖 ❤ ~ 基本思路流程: <通用的> 一. 数据来源分析: 明确需求: 明确采集的网站是什么? 明确采集的数据是什么? 通过开发者工具<浏览器自带的工具(谷歌浏览器)>, 进行抓包分析 先分析一章内容, 然后再分析如何采集多章内容 打开开发…

ubuntu docker 安装rocketmq记录

安装链接参考该博客 上面的是非ubuntu安装的docker&#xff0c;下面记录ubuntu安装docker遇到的问题及解决 1 创建挂载目录 ─── rocketmq├── conf│ └── broker.conf└── data├── broker│ ├── logs│ └── store└── namesrv├── logs└── st…

ch1_3计算机硬件的技术指标

机器字长&#xff1a; CPU一次能够处理 数据的位数&#xff1b; 与CPU中的寄存器位数有关&#xff1b; 1. 运算速度 不同的指令&#xff0c;执行的频率不同&#xff1b; 部分指令&#xff0c; 执行起来很慢&#xff0c; 但是很少执行&#xff0c;出现的次数低&#xff0c;对…

gf-v1项目结构及目录说明

文章目录1. gf版本2. 项目结构3. 目录说明1. gf版本 2. 项目结构 / ├── app │ ├── common │ │ ├── adapter │ │ ├── api │ │ ├── dao │ │ ├── service │ │ ├── model │ │ ├── … │ ├── system │ │ ├── api │ │ ├── dao │…

MySQL的14个小技巧

我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

C++ 设计模式 外观模式 The Facade Pattern

C 设计模式 外观模式 The Facade Pattern 介绍 Facade Pattern 为一组复杂的子系统提供了一个统一的简单接口&#xff0c;它是一种结构型设计模式。 它隐藏了子系统的复杂性&#xff0c;并向客户端提供了一个简单的接口来访问子系统。通过使用 Facade 模式&#xff0c;客户端…

Tag和Untag相关知识科普

欢迎来到东用知识小课堂&#xff01;端口的出和入是针对交换机而言的&#xff0c;即数据帧进入交换机即为进入某个端口。接下来我们就以PEC系列工业级交换机为例&#xff0c;来给大家详细讲解一下1.Access&#xff1a;接入链路&#xff1a;1&#xff09;.入方向&#xff1a;收到…

c++11 标准模板(STL)(std::forward_list)(十三)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

湖仓一体电商项目(一):项目背景和架构介绍

文章目录 项目背景和架构介绍 一、项目背景介绍

vue iframe展示pdf请求接口

<iframe:src"pdfUrl"style"border: none; width: 100%; height: calc(100% - 10px)"frameborder"0">iframe是一个非常好用的标签&#xff0c;用于文件的展示src地址可以一个访问后端的一个地址&#xff08;https://mp.csdn.net/mp_blog/cr…

day25|51.N皇后、37.解数独

51.N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案…

sylixos input子系统学习、调试记录

Input 子系统框架图&#xff1a; Xinput设备驱动层&#xff1a; 将所有设备抽象成xmes、xkbd设备&#xff0c;上层程序&#xff08;如Qt&#xff09;就可以像操作普通字符设备一样操作它们。 Xinput核心处理层&#xff1a; 从物理设备取得输入事件&#xff0c;然后通过消息队…

校招失败后,在小公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

【软件测试面试】国企6年测试经验大D佬分析总结测试团队面试问题......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 国企测试大佬测试面…

一起自学SLAM算法:11.5 强化学习与自主导航

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;[21]属于机器学习领域的一个分支&#xff0c;其学习目标是获得最大回报。在10.3.1节中已经讨论过&#xff0c;机器学习过程主要涉及四个要…

【Java并发详解】

参考书目&#xff1a; 堆和方法区中的数据是可以被共享的 堆中的数据是被栈中的变量所持用的&#xff0c;栈是线程隔离的&#xff0c;每个线程私有一个栈&#xff0c;所以栈中的数据不共享 调用a方法时&#xff0c;jvm会给a方法创建一块内存区&#xff0c;让其入栈&#xff…