golang 性能剖析pprof

作为一个golang coder,使用golang编写代码是基本的要求。
能够写出代码,并能够熟悉程序执行过程中各方面的性能指标,则是更上一层楼。

如果在程序出现性能问题的时候,可以快速定位和解决问题,那么写起代码来,会更加自信。

本文介绍的pprof,是golang 自带性能剖析工具,可以帮助定位程序中可能存在的问题。

1.引入pprof

例子代码如下:

package main

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

func main() {

        go func() {
                log.Println(http.ListenAndServe("localhost:6060", nil))
        }()

        go worker()

        select{}
}

// simple worker
func worker(){

        strSlice := []string{}
        for {
                str := "hello world "
                strSlice = append(strSlice, str)

                time.Sleep(time.Second)
        }

}

代码开始引入net/http/pprof,在端口6060启动http服务。

启动应用程序

go build simple.go

./simpe

1.1 查看内存使用情况

使用heap profile查看内存使用情况。

go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in /Users/lanyang/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Type: inuse_space
Time: Sep 21, 2019 at 1:56pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
(pprof) top10
Showing nodes accounting for 514kB, 100% of 514kB total
      flat  flat%   sum%        cum   cum%
     514kB   100%   100%      514kB   100%  unicode.init
         0     0%   100%      514kB   100%  runtime.doInit
         0     0%   100%      514kB   100%  runtime.main
(pprof)

默认的Type是inuse_space,即常驻内存.
与之对应的是alloc_objects,表示临时分配的内存。

列出top10的内存占用。

1.2 查看CPU使用情况

使用cpu profile查看cpu使用情况。

例如查看过去30s的cpu profile

go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile?seconds=30
Saved profile in /Users/lanyang/pprof/pprof.samples.cpu.001.pb.gz
Type: cpu
Time: Sep 21, 2019 at 2:19pm (CST)
Duration: 30s, Total samples = 0
No samples were found with the default sample value type.
Try "sample_index" command to analyze different sample values.
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

1.3 浏览器打开pprof页面

浏览器中打开http://localhost:6060/debug/pprof/
如图所示,列出了很多监控项,

 Profile Descriptions:

allocs:
A sampling of all past memory allocations

block:
Stack traces that led to blocking on synchronization primitives

cmdline:
The command line invocation of the current program

goroutine:
Stack traces of all current goroutines

heap:
A sampling of memory allocations of live objects. You can specify the gc GET parameter to run GC before taking the heap sample.

mutex:
Stack traces of holders of contended mutexes

profile:
CPU profile. You can specify the duration in the seconds GET parameter. After you get the profile file, use the go tool pprof command to investigate the profile.

threadcreate:
Stack traces that led to the creation of new OS threads

trace:
A trace of execution of the current program. You can specify the duration in the seconds GET parameter. After you get the trace file, use the go tool trace command to investigate the trace.

可以通过链接跳转到对应界面。

1.4 保存profile文件

从pprof使用上看,是首先保存profile文件,再进行分析的。

在一些场景,例如在线上环境,最好保存profile,拿到线下做分析。

将profile文件保存下来:

wget  http://localhost:6060/debug/pprof/heap
--2019-09-21 15:20:17--  http://localhost:6060/debug/pprof/heap
正在解析主机 localhost (localhost)... ::1, 127.0.0.1
正在连接 localhost (localhost)|::1|:6060... 失败:Connection refused。
正在连接 localhost (localhost)|127.0.0.1|:6060... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1162 (1.1K) [application/octet-stream]
正在保存至: “heap”

heap                                         100%[============================================================================================>]   1.13K  --.-KB/s  用时 0s

2019-09-21 15:20:17 (111 MB/s) - 已保存 “heap” [1162/1162])

ll
-rw-r--r--  1 lanyang  staff   1.1K  9 21 15:20 heap

然后使用pprof进行分析,其中,./simple是可执行文件,用于解析各种符号,./heap是刚才获取到的profile文件。

go tool pprof ./simple ./heap
Type: inuse_space
Time: Sep 21, 2019 at 3:20pm (CST)
No samples were found with the default sample value type.
Try "sample_index" command to analyze different sample values.
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)

2.火焰图

go 1.11已经可以查看火焰图了,直接使用如下命令:

$ go tool pprof -http=":8081" [binary] [profile]

会打开浏览器页面。
端口可以自己选择,这里使用了8081。
binary是应用的可执行文件,读取符号信息。
profile 是profile文件,可以是本地文件,或者http地址。

例如,使用以保存的profile文件:

$ go tool pprof -http=":8081" ./simple ./heap

或者,通过http 的profile:

go tool pprof -http=":8081" ./simple  http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in /Users/zhangyunyang/pprof/pprof.simple.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Serving web UI on http://localhost:8081

火焰图如图所示,示例代码比较简单,所以火焰图不是很明显。

如果不能使用go1.11,则可以使用最新的pprof工具:

# Get the pprof tool directly
$ go get -u github.com/google/pprof

$ pprof -http=":8081" [binary] [profile]

参考

Package pprof

使用 pprof 和火焰图调试 golang 应用

Profiling Go Programs

go-torch

原文地址:https://www.cnblogs.com/lanyangsh/p/11563539.html

时间: 2024-10-22 20:30:28

golang 性能剖析pprof的相关文章

性能剖析器

 PerformanceProfiler.h: #include<iostream> using namespace std; #include<map> #include<windows.h> #include<time.h> #include<string> #include<assert.h> #include<stdarg.h> #include<thread> #include<mutex>

Linux的系统级性能剖析工具-perf

一直在找个靠谱且易用的性能分析工具,perf 貌似是很符合要求的,先给出阿里整理的几篇文档: Linux的系统级性能剖析工具-perf-1.pdf Linux的系统级性能剖析工具-perf-2.pdf Linux的系统级性能剖析工具-perf-3.pdf Perf在Linux性能评估中的应用_v3.pdf Linux的系统级性能剖析工具-perf,布布扣,bubuko.com

MySQL之服务器性能剖析

关于mysql服务器性能,可能需要关注的点会比较多,如:如何确认服务器是否达到了性能最佳的状态,找出某条语句为什么执行不够快,以及诊断被用户描述成“停顿“,“堆积“或者“卡死“的某些间歇性疑难故障.这看起来很不简单.但是事实证明,有一个简单的方法能够从噪声中发现苗头. 这个方法就是专注于测量服务器的时间花费在哪里,使用的技术则是性能剖析. mysql性能的问题,可能不同人会有不同的说法.例如:每秒查询数,cpu利用率,可扩展性  等等. 每个人在不同场景对性能有不同的理解. 但在这我们将给出一个

C++ 性能剖析 (一)

C++ 性能剖析 (一) 性能问题也不是仅仅用“技术”可以解决的,它往往是架构,测试,假设等综合难题.不过,对于一个工程师来说,必须从小做起,把一些“明显”的小问题解决.否则的话积小成多,千里堤坝,溃于蚁穴. C++ 的性能为什么总是排在C之后 (见http://benchmarksgame.alioth.debian.org/u32/performance.php?test=binarytrees 等网站的最新测试结果)?我认为这是3个方面的原因: 1)用于测试的C++ 编译器没有使用最新的优

ANTS Performance Profiler 8:支持对Web请求、异步代码和WinRT的性能剖析

下载与激活:http://download.csdn.net/detail/lone112/6734291 离线激活 位于英国的Red Gate Software有限公司最近发布了ANTS Performance Profiler 8 Beta,支持对Web请求.异步代码和Windows商店应用的性能剖析.该版本还支持SharePoint 2013和一个新的时间线,这使开发者不但能够监控应用程序的性能,还能深入到想要检查的具体区域. Web请求剖析使开发者能够捕获向外的HTTP请求,其中包括请求

【性能分析】初探VS2010中的Profile(性能剖析)功能

VS2010中的Profile(性能剖析)功能十分实用,它可以协助程序员迅速锁定当前程序的性能瓶颈,为程序的优化做准备. 点击VS2010的Analyze菜单,选择Launch Performance Wizard,依照提示可以很方便地完成Profile的必需配置.可能你会碰到"Injection of runtime library failed"错误,这时就不要使用Wizard,而要选择Analyze下拉菜单中的Profiler->Attach/Detach...,将Prof

Python脚本性能剖析

################### #Python脚本性能剖析 ################### cProfile/profile/hotshot用于统计Python脚本各部分运行频率和耗费时间等统计信息.pstats可用于格式化这些信息 cProfile,属C扩展.开销较小,适合剖析长时间执行的Python程序,推荐使用此模块 profile.纯Python模块,存在明显开销,但想对其扩展的话相对照较easy hotshot,实验性的C模块.主要关注开销最小化,现已不再被维护将来可能

服务器性能剖析(profiling)之——简介

性能剖析(profiling)是专注于测量服务器时间花费在哪里的一种技术,这里"性能即响应时间". 测量是一项很有挑战性的工作,并且分析结果也同样有挑战性,测出时间花在哪里,和知道为什么花在那里是两码事-- 性能剖析一般有两个步骤: 测量任务所花费的时间: 对结果进行统计和排序,将重要的任务排到前面. 关于性能剖析报告: 任务名.任务的执行时间.任务的消耗时间.任务的平均执行时间.该任务执行时间占全部时间的百分比. 性能剖析报告会按照任务的消耗时间进行降序排序. 有两种比较常见的情况会

快速学习C语言二: 编译自动化, 静态分析, 单元测试,coredump调试,性能剖析

上次的Hello world算是入门了,现在学习一些相关工具的使用 编译自动化 写好程序,首先要编译,就用gcc就好了,基本用法如下 gcc helloworld.c -o helloworld.o helloworld.c是源码,helloworld.o是编译后的可执行文件,运行的话就用 ./helloworld.o就可以了. 但是如果代码写的多了,每次改动完都手动用gcc编译太麻烦了,所以要用Makefile来 自动化这项工作,在当前目录下创建Makefile文件,大概如下 hellowor