Go 程序调试总结

pprof有两个包:

net/http/pprof

runtime/pprof

其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来

实例

package main

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

func run()  {

	http.ListenAndServe(":7773", nil)
	return 
}


func main() {
	go run()
	go func() {
		for {
			fmt.Println("running...")
			time.Sleep(10 * time.Millisecond)
		}
	}()
	select {}
}

我们在本地7773端口开放了一个服务端,并在后台用一个循环来产生一些cpu消耗。

开启后我们可以访问http://localhost:7773/debug/pprof/

这个路径下还有几个子页面:

    /debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
    /debug/pprof/heap: Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
    /debug/pprof/block:block Profiling 的路径
    /debug/pprof/goroutines:运行的 goroutines 列表,以及调用关系

实例:

1、goroutine

点击goroutine 进入后显示当前函数栈:

2、heap

heap可以查看内存占用情况:http://127.0.0.1:xxxx/debug/pprof/heap?debug=1

大略的概要信息:

# runtime.MemStats
# Alloc = 80342328
# TotalAlloc = 42618843704
# Sys = 2276174456
# Lookups = 363
# Mallocs = 392353246
# Frees = 391967629
# HeapAlloc = 80342328
# HeapSys = 2141683712
# HeapIdle = 2031599616
# HeapInuse = 110084096
# HeapReleased = 2031190016
# HeapObjects = 385617
# Stack = 1933312 / 1933312
# MSpan = 3113872 / 39682048
# MCache = 41664 / 49152
# BuckHashSys = 1566273
# GCSys = 81838080
# OtherSys = 9421879
# NextGC = 156401808
# LastGC = 1586508842618898472

说明:相关字段可以自己查询下吧

当然想看详细信息可以使用go tool pprof来进行分析:
go tool pprof -alloc_space/-inuse_space http://ip:8899/debug/pprof/heap
-inuse_space:分析程序的常驻内存占用情况。-alloc_objects:分析程序的内存临时分配情况,默认是使用-inuse_space。一个函数alloc_space多不一定就代表它会导致进程的RSS高。

这个命令进入后,是一个交互式界面,输入top命令可以前10大的内存分配,flat是堆栈中当前层的inuse内存值,cum是堆栈中本层级的累计inuse内存值(包括调用的函数的inuse内存值,上面的层级)。

 

3、cpu

分析cpu时延:

go tool pprof http://localhost:xxx/debug/pprof/profile

help有使用说明,这里可以自己看介绍

 另外:我们输入gif,在当前目录生成一个gif图片。或者安装Graphviz后也可以输入pdf 生成pdf文件。

go-torch和火焰图

火焰图(Flame Graph)是 Bredan Gregg 创建的一种性能分析图表,因为它的样子近似 火焰而得名。上面的 profiling 结果也转换成火焰图,如果对火焰图比较了解可以手动来操作,不过这里我们要介绍一个工具:go-torch。这是 uber 开源的一个工具,可以直接读取 golang profiling 数据,并生成一个火焰图的 svg 文件。

安装go-touch:

go get -v github.com/uber/go-torch

安装 FlameGraph:

要生成火焰图,需要事先安装 FlameGraph工具,这个工具的安装很简单(需要perl环境支持),只要把对应的可执行文件加入到环境变量中即可。

  1. 下载安装perl:https://www.perl.org/get.html
  2. 下载FlameGraph:git clone https://github.com/brendangregg/FlameGraph.git
  3. FlameGraph目录加入到操作系统的环境变量中。

生成火焰图:

go-torch -u http://xxx.xxx.xxx.xxx:xxxx -t 20

发布了48 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cyq6239075/article/details/103908607