golang服务器性能指标,Golang性能分析

[TOC]

Golang性能分析

pprof

web查看必备工具

brew install graphviz

sudo apt install graphviz

sudo yum install graphviz

# 验证是否安装成功

dot -version

执行时间分析

net/http/pprof

package main

import (

"log"

"net/http"

_ "net/http/pprof" //在初始化导包的时候,pprof 包会自动注册 handler

"time"

)

func main() {

go func() {

for {

log.Println("this is pprof http demo: ", time.Now())

time.Sleep(time.Second * 10)

}

}()

http.ListenAndServe("0.0.0.0:2385", nil)

}

而后通过浏览器访问即可查看,注:如果用了框架的话也没有关系,监听不同的端口,通过不同的端口访问即可.

直接访问总列表,该内容是原始数据,展示效果不太友好

http://localhost:2385/debug/pprof/

报告类型

allocs 和 heap 采样的信息类似,不过前者是所有对象的内存分配,而 heap 则是活跃对象的内存分配

序号

报告类型

备注

1

allocs

过去所有内存分配的样本

2

block

导致同步原语阻塞的堆栈跟踪

3

cmdline

当前程序的命令行调用

4

goroutine

所有当前goroutine的堆栈痕迹

5

heap

活动对象的内存分配抽样。您可以指定gc GET参数,以便在获取堆样本之前运行gc。

6

mutex

争用互斥锁持有者的堆栈跟踪

7

profile

CPU配置文件。可以以秒为单位指定持续时间。获得概要文件后,使用go工具pprof命令来研究概要文件。

8

threadcreate

导致创建新的操作系统线程的堆栈跟踪

9

trace

当前程序的执行轨迹。可以以秒为单位指定持续时间。获得跟踪文件后,使用go工具跟踪命令来调查跟踪。

通过web访问,展示格式更丰富,选项更多,还有火焰图等 [推荐]

go tool pprof URL 会将文件自动下载下来,默认到~/pprof/目录下每请求一次生成一个gz文件.

后续可以使用go tool pprof ./fileName进入命令行来继续使用,也可对比不同的文件分析两次的差异.

# 每秒将远程的信息下载到本地,并且提供一个本地的8080端口以供web访问,同时会自动打开浏览器访问

go tool pprof --http=0.0.0.0:8081 --seconds=1 http://IP:PORT/debug/pprof/heap

# 同上,但是不会自动刷新数据

go tool pprof --http=0.0.0.0:8081 localhost:8080/debug/pprof/heap

# 同上,不过是访问本地的数据

go tool pprof --http=0.0.0.0:8081 ./pprof.main.alloc_objects.alloc_space.inuse_objects.inuse_space.049.pb.gz

命令行访问

go tool pprof http://localhost:2385/debug/pprof/heap

wget -O trace.out localhost:8080/debug/pprof/trace

go tool trace --http=:8081 trace.out

命令行标题含义

lat--- 该函数占时

flat% --- 该函数相对于总耗时的百分比

sum% --- 前面累计每一行flat 占比

cum --- 该函数以及该函数调用的其他函数总耗时

cum% --- 对应的百分比

pprof常用参数

-http在主机:在本地提供一个web服务用来查看。如上面的--http=0.0.0.0:8081

Host是可选的,默认为'localhost'。

端口是可选的,默认情况下是随机可用的端口。

-no_browser跳过为交互式web UI打开浏览器。

-tools对象工具的搜索路径

-inuse_space同-sample_index=inuse_space 查看正在使用的内存

-inuse_objects同-sample_index=inuse_objects

-alloc_space同-sample_index=alloc_space 查看全部历史内存分配统计,可以通过这个指标确定大量内存用在哪些地方

-alloc_objects同-sample_index=alloc_objects

-total_delay同-sample_index=delay

-contentions同-sample_index=contentions

-mean_delay同-mean -sample_index=delay

-diff_base source基本配置文件的源文件,用于比较

-base source用于减形的基本轮廓源

-seconds基于时间的配置文件收集时间

pprof命令行命令

进入命令行后可通过以下参数进行输出不同的格式

常用展示格式

top N

本地取样计数排名列表: 在默认情况下,top命令会输出以本地取样计数为顺序的列表, 默认是10个

web

生成一个svg文件,然后自动调用本地工具打开(一般是浏览器)

png

生成一个png文件,自动保存到当前目录下.

list 函数名

结合top,可以直接定位到消耗资源的代码处

traces

列出函数的调用栈

一般首先通过profile,定位cpu消耗暂时较大的函数,然后通过heap定位内存占用较大的函数逻辑。

其他展示格式

-callgrind以callgrind格式输出图形

-comments输出所有配置文件注释

-disasm输出带有示例注释的程序集清单

-dot以DOT格式输出图形

-eog通过eog可视化图形

-evince通过evince可视化图形

-gif输出GIF格式的图形图像

-gv通过gv可视化图形

-kcachegrind在KCachegrind可视化报告

-list输出与regexp匹配的带注释的函数源

-pdf以PDF格式输出图形

-peek匹配regexp的函数的输出调用者/调用者

-png输出PNG格式的图形图像

-proto以压缩的protobuf格式输出配置文件

-ps输出PS格式的图形

-raw输出原始配置文件的文本表示形式

-svg以SVG格式输出图形

-tags输出配置文件中的所有标记

-text以文本形式输出顶部条目

-top以文本形式输出top条目

-topproto以压缩的protobuf格式输出top项

-trace以文本形式输出所有概要文件示例(列出函数的调用栈)

-tree输出调用图的文本呈现

-web通过web浏览器可视化图形

-weblist在浏览器中显示带注释的源代码

参数的选项

粒度

-functions在函数级聚合。

-filefunctions在函数级聚合。

-files在文件级进行聚合。

-lines在源代码行级别聚合。

-address在地址级进行聚合。

排序

-cum根据累积权重对条目进行排序

-flat根据自己的权重对条目进行排序

runtime/pprof

package main

import (

"log"

"os"

"runtime/pprof"

)

func main() {

fc, err := os.OpenFile("./cpu.pprof", os.O_RDWR|os.O_CREATE, 0755)

if err != nil {

log.Fatal(err)

}

fm, err := os.OpenFile("./mem.pprof", os.O_RDWR|os.O_CREATE, 0755)

if err != nil {

log.Fatal(err)

}

pprof.StartCPUProfile(fc)

//内存消耗分析

pprof.WriteHeapProfile(fm)

pprof.StopCPUProfile()

fc.Close()

}

进入命令行

go tool pprof ./cpu.prof

之后的命令行操作与上面的一样,这里就不再赘述了

对比

go tool pprof XXX间隔一段时间采集文件, 对比是否存在明显的增加.

go tool pprof -base file1 file2 对比两个文件,top或web获取对比.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值