golang代码笔记 --pprof的基本使用和程序性能分析

本文介绍了Golang性能分析的基础方法,包括pprof工具的使用,如goroutine、堆栈、CPU信息的导出,以及web封装的pprof分析。此外,还探讨了当pprof不足以解决问题时,如何利用trace信息进行深入的调试和性能诊断。通过设置环境变量开启golang的debug模式,分析调度和GC详情,有助于快速定位性能问题。
摘要由CSDN通过智能技术生成

背景

由于最近线上服务业务量正大暴露出一些性能问题(CPU比日常翻倍、内存释放过程不如预期),所有,不得不借助golang提供的系列工具来分析,帮助快速定位问题代码段,进而优化代码逻辑的(加深对语言特性的理解);

主要内容

  1. pprof工具的使用
  2. trace日志信息

1. pprof工具的使用

主要package:

// 性能分析基础包
"runtime/pprof"
// web封装
“net/http/pprof

1.1 基础包的使用

使用pprof基础包可以很方便的讲程序运行的某个时间段内的goroutine、堆栈、CPU等信息导出;
在使用golang工具链中的pprof工具输出更加直观的信息,方便分析;
通过第三方提供的工具/补丁,甚至可以实现火焰图输出;

package main

import (
	"os"
	"runtime/pprof"
	"sort"
	"time"
)

func main() {
	var arr []int
	pprofCPU, _ := os.OpenFile("./pprof_cpu", os.O_RDWR|os.O_CREATE, 775)
	defer pprofCPU.Close()
	pprofHeap, _ := os.OpenFile("./pprof_heap", os.O_RDWR|os.O_CREATE, 775)
	defer pprofHeap.Close()
	pprof.StartCPUProfile(pprofCPU)
	defer pprof.StopCPUProfile()
	pprof.WriteHeapProfile(pprofHeap)
	for i := 0; i < 1000; i++ {
		t := time.Tick(10 * time.Millisecond)
		<-t
		arr = append(arr, i)
	}
	sort.Sort(sort.IntSlice(arr))
	time.Sleep(time.Second)
}

其中几个最常用的几个函数:

// 开始/结束CPU分析
StartCPUProfile func(w io.Writer) error
StopCPUProfile func()

// 堆栈分析
WriteHeapProfile func(w io.Writer) error

使用以上函数,可以输出相应的文件,通过go tool pprof可以对结果进行简单的分析:

go tool pprof ./pprof_cpu 

之后进入pprof的交互界面:

help:查看所有命令
top、list等分析类命令
web、svg、git等导出类命令 
exit 退出

## sudo apt install graphviz

pprof支持的命令可通过help查询

1.2 web封装

golang在http层实现了对pprof的封装,使用也更加简单;

示例

package main

import (
	"net/http"
	_ "net/http/pprof"
)

func main() {
	http.ListenAndServe(":1999", nil)
}

使用方式:

http://localhost:1999/debug/pprof/

--  block
-- goroutine
-- heap 堆栈信息
-- mutex
-- threadcreate 线程创建信息

同样的我们可以借助pprof分析web应用的性能问题:

// 分析一段时间内的CPU计算信息 -- 查找CPU过度消耗问题
go tool pprof http://localhost:1999/debug/pprof/profile

// 堆栈信息 -- 查找内存泄露问题
go tool pprof http://localhost:1999/debug/pprof/heap

2. trace信息

如果通过pprof工具无法找到问题所在,我们或许需要在本地开启debug模式,查看和分析golang调度和GC的细节过程来找到过滤,并发现问题所在;

要开启golang的debug模式主要是通过设置环境变量来完成的:

## 方法一
GODEBUG=gctrace=1 go run ./pprof_tool.go  2>trace.log

## 方法二
设置用户环境变量:GODEBUG=gctrace=1,schedtrace=100

常用标志:
gctrace: 打印GC信息
schedtrace: 打印调度信息
scavenge: scavenge信息

输出信息的具体含义,参考源码和网上资料;

总结

主要介绍了golang程序性能分析的最基础的方法,可以提供参考;具体到实际的应用中还需要更多更有效的手段来缩短我们定位问题代码的时间;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值