Go 程序调试总结

前言:环境准备

1、安装go

先打开网址:Downloads - The Go Programming Language 下载需要的版本

 2、安装git

yum install git

正文:

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有使用说明,这里可以自己看介绍

如果输入svg  可以生成图片:

另外:我们输入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

export GO111MODULE=on

export GOPROXY=https://goproxy.cn

安装 FlameGraph:

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

  1. 下载安装perl:Perl Download - www.perl.org
  2. 下载FlameGraph:git clone https://github.com/brendangregg/FlameGraph.git
  3. FlameGraph目录加入到操作系统的环境变量中。export PATH=$PATH:$GOPATH/FlameGraph

安装graphviz

yum install graphviz

如果没有安装的perl的需要安装:

yum install perl

生成火焰图:

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

2、根据cpu统计信息生成火焰图

先生成cpu统计文件:

在生成火焰图:

记录踩过的一个坑:

生成火焰图时报错:

INFO[22:45:45] Run pprof command: go tool pprof -raw -seconds 30 http://127.0.0.1:7070/debug/pprof/profile
FATAL[22:46:15] Failed: could not parse raw pprof output: strconv.ParseInt: parsing "runtime.findrunnable": invalid syntax

搜索资料无果,经过排查发现我的程序是在windows上编译的,再linux上生成图片会出问题,改成再linux上编译程序,解决。

tips:

windows上生成火焰图:

先下载graphviz

https://graphviz.org/download/

选择windows安装包。安装后在cmd中执行:dot -version 确认安装是否成功。

启动go程序,然后在cmd中执行:

go tool pprof -http=:7773 http://localhost:7773/debug/pprof/profile

等30秒,就会自动的打开一个网页。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值