使用pprof调试go程序

pprof可以用来调试go程序,在go中有两个库可以使用,1. net/http/pprof 2. runtime/pprof

方法1 - net/http/pprof

测试代码

  • 启动http的方式
# cat main1.go
package main import (
_ "fmt"
"net/http"
_ "net/http/pprof"
"time"
) func hello() {
for {
time.Sleep(1 * time.Microsecond)
//fmt.Printf("hello\n")
}
} func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
hello()
}

查看web

http://localhost:6060/debug/pprof/

分析MEM

# go tool pprof http://localhost:6060/debug/pprof/heap

$ go tool pprof -base pprof.demo2.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz pprof.demo2.alloc_objects.alloc_space.inuse_objects.inuse_space.002.pb.gz

分析CPU

# go tool pprof http://localhost:6060/debug/pprof/profile
# go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

方法2 - runtime/pprof

测试代码

  • 注意,必须要执行完才可以
# cat main2.go
package main import (
_ "fmt"
"os"
"runtime/pprof"
"time"
) func hello() {
i := 0
for {
time.Sleep(1 * time.Microsecond)
i += 1 if i > 100000 {
break
}
}
} func main() {
cpuProfile, _ := os.Create("cpu_profile")
pprof.StartCPUProfile(cpuProfile)
defer pprof.StopCPUProfile()
hello()
}

获得 cpu_profile 文件;

分析CPU:

命令行读取cpu_profile 文件

# go tool pprof cpu_profile
Type: cpu
Time: Aug 2, 2019 at 7:46pm (CST)
Duration: 1.11s, Total samples = 1.17s (105.58%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top --cum
Showing nodes accounting for 430ms, 36.75% of 1170ms total
Showing top 10 nodes out of 32
flat flat% sum% cum cum%
0 0% 0% 760ms 64.96% runtime.semasleep
0 0% 0% 450ms 38.46% runtime.notetsleep_internal
0 0% 0% 440ms 37.61% runtime.findrunnable
0 0% 0% 440ms 37.61% runtime.mcall
0 0% 0% 440ms 37.61% runtime.park_m
0 0% 0% 440ms 37.61% runtime.schedule
0 0% 0% 430ms 36.75% runtime.notesleep
430ms 36.75% 36.75% 430ms 36.75% runtime.pthread_cond_wait
0 0% 36.75% 430ms 36.75% runtime.stopm
0 0% 36.75% 400ms 34.19% runtime.notetsleepg
(pprof)

Flame Graph读取cpu_profile 文件

go-torch 在 Go 1.11 之前是作为非官方的可视化工具存在的, 它可以为监控数据生成一个类似下面这样的图形界面, 红红火火的, 因而得名. 从 Go 1.11 开始, 火焰图被集成进入 Go 官方的 pprof 库.

go-torch is deprecated, use pprof instead

As of Go 1.11, flamegraph visualizations are available in go tool pprof directly!

执行:

go tool pprof -http=":8081" main2.go cpu_profile

测试

go test -bench . -cpuprofile cpu.prof

采集MEM:

// ...
memProfile, _ := os.Create("mem_profile")
pprof.WriteHeapProfile(memProfile)

Docs

使用pprof调试go程序的更多相关文章

  1. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

  2. 使用未付费的账号真机调试 iOS 程序,过几天后程序一打开就会闪退

    使用未付费的苹果开发者账号真机调试 iOS 程序,过几天后程序一打开就会闪退.   解决办法: 删除 Provisioning Profile,重新配置一次. 终极解决办法:花钱购买苹果开发者账号. ...

  3. Gdb调试多进程程序

    Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...

  4. 利用 PhpStorm、Idea 等 IDE 如何 运行/调试 Go 程序 ?

    以自己常用的 PhpStorm 为例 第一步:下载安装 Go插件 File -> Settings -> Plugins -> 输入关键字:Go 第二步:新建 Go项目 File - ...

  5. PDB调试Python程序

    pdb是python内置的调试工具, 它可以在终端中调试Python程序, 这允许pdb在很多无法安装IDE的服务器上使用. 虽然远程调试使用广泛, 但在必要的时候(比如难以在本地搭建运行环境)pdb ...

  6. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  7. 【php】使用gdb调试php程序

    1.简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.同时GDB也具有例如d ...

  8. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  9. 使用webstorm调试node程序

    前言 相信大家接触过不少node代码了,如果你应用的比较初级或者针对你的项目不需要接触过深的node代码,也许你仅仅需要简单的console.log('your variable')就完全满足你的需要 ...

随机推荐

  1. spring Cloud Feign作为HTTP客户端调用远程HTTP服务

    在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...

  2. 在github上优雅的搭建个人博客

    前言 啊啊啊---,经过差不多两天的持续摸索优化,个人博客算是初步完成了,现在自己看的效果还是非常不错的.这篇文章就是讲我怎么搭建一个这样的博客的.早在17年的时候就用hexo 结合github搭建过 ...

  3. rhel6.2配置在线yum源

    由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源. 本文包括配置本地源及第三方源.第三方源包括:网易,epel, ...

  4. MySQL中的内连接、左连接、右连接、全连接、交叉连接

    创建两个表(a_table.b_table),两个表的关联字段分别为:a_table.a_id和b_table.b_id CREATE TABLE a_table ( a_id int NOT NUL ...

  5. Hive架构与工作原理

    组成及作用: 用户接口:ClientCLI(hive shell).JDBC/ODBC(java访问hive).WEBUI(浏览器访问hive) 元数据:Metastore 元数据包括:表名.表所属的 ...

  6. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  7. 解决window.location.href参数太长 post提交数据

    前言:一提到页面跳转,最常用的一般就是window.location.href,如果需要带参数,也许可以在后面用?拼上,但这样并不安全,而且有个更严重的问题,这样的拼接是有长度限制的,如果达到好几千个 ...

  8. 在WinDbg中调试时如何查看类/结构对象成员的值

    有时,当您调试应用程序时,会碰巧得到指向类的指针,该类只有几个成员变量,包括结构和其他类对象!如何看待内部类/结构变量成员的值??所以,这是提示.下面是用于演示命令的代码. struct testSt ...

  9. netflix flamescope 方便的不同时间范围的火焰图查看工具

    flamescope 是netflix 开源的方便的火焰图查看工具,我们可以选择不同时间范围的数据,方便分析调用链 环境准备 使用docker-compose运行,基于官方的dockerfile 创建 ...

  10. P1501 [国家集训队]Tree II LCT

    链接 luogu 思路 简单题 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namesp ...