Golang为我们提供了非常方便的性能测试工具pprof,使用pprof可以非常方便地对Go程序的运行效率进行监测。本文讲述如何使用pprof对Go程序进行性能测试,并使用qcachegrind查看性能测试的输出文件。

载入pprof模块

想要对一个Go程序进行pprof监测,第一步是在main函数所在的模块中添加 net/http/pprof 模块。import后面的“_”是一定要加上的。

import _ "net/http/pprof"

运行HTTP服务器

如果你的程序不是一个Web服务器,那么你还需要再程序中启动一个Http服务器,如下所示:

go func() {
http.ListenAndServe("localhost:13001", nil)
}()

重新编译并运行程序。然后我们可以通过网页浏览器查看当前程序的运行状态:http://localhost:13001/debug/pprof 。如果运行正常,可以看到类似如下的输出:

/debug/pprof/

profiles:
0 block
9 goroutine
7 heap
0 mutex
12 threadcreate full goroutine stack dump

在这个网页里我们可以查看程序当前的goroutine运行状态、内存使用情况等信息。

使用go tool pprof命令

打开命令行,输入命令: go tool pprof http://localhost:13001/debug/pprof/profile ,此时命令行会卡出,并打印类似如下信息:

C:\Users\Administrator>go tool pprof http://localhost:13001/debug/pprof/profile
Fetching profile from http://localhost:13001/debug/pprof/profile
Please wait... (30s)
Saved profile in \pprof\pprof.localhost:13001.samples.cpu.007.pb.gz
Entering interactive mode (type "help" for commands)

在经过30秒的等待之后,性能测试完成,会在本地保存压测结果。

可以使用top命令查看开销最大的一些函数,或者使用web命令直接在网页中查看,其他的命令还包括:svg,pdf,png等,你可以选择自己所习惯的工具查看性能检测结果。

(pprof) top20
970ms of 1130ms total (85.84%)
Showing top 20 nodes out of 86 (cum >= 20ms)
flat flat% sum% cum cum%
280ms 24.78% 24.78% 300ms 26.55% runtime.stdcall1
100ms 8.85% 33.63% 110ms 9.73% runtime.acquirep
100ms 8.85% 42.48% 100ms 8.85% runtime.siftdownTimer
90ms 7.96% 50.44% 90ms 7.96% runtime.osyield
80ms 7.08% 57.52% 260ms 23.01% runtime.timerproc
60ms 5.31% 62.83% 60ms 5.31% runtime.memeqbody
50ms 4.42% 67.26% 50ms 4.42% runtime.casgstatus
30ms 2.65% 69.91% 30ms 2.65% runtime.cgocall
30ms 2.65% 72.57% 430ms 38.05% runtime.exitsyscallfast_pidle
20ms 1.77% 74.34% 20ms 1.77% runtime.asmstdcall
20ms 1.77% 76.11% 20ms 1.77% runtime.goready
20ms 1.77% 77.88% 20ms 1.77% runtime.pidleget
20ms 1.77% 79.65% 60ms 5.31% runtime.startm
10ms 0.88% 80.53% 20ms 1.77% github.com/xiaonanln/goworld/netutil.(*PacketConnection).Flush
10ms 0.88% 81.42% 10ms 0.88% github.com/xiaonanln/goworld/netutil.allocPacket
10ms 0.88% 82.30% 80ms 7.08% main.(*DispatcherService).getEntityDispatcherInfoForRead
10ms 0.88% 83.19% 10ms 0.88% net.(*fdMutex).rwunlock
10ms 0.88% 84.07% 10ms 0.88% runtime.(*guintptr).cas
10ms 0.88% 84.96% 10ms 0.88% runtime.acquirep1
10ms 0.88% 85.84% 20ms 1.77% runtime.asmcgocall

值得一提的是,如果我们的程序中一台Linux服务器上运行,我们也可以在自己的Windows电脑上运行go tool pprof命令,只需要将网址里的localhost替换为Linux服务器的地址即可。

使用qcachegrind查看性能监测结果

相比top、web、svg等命令,查看性能检测结果最方便的工具还是qcachegrind。首先需要前往 https://sourceforge.net/projects/qcachegrindwin/files/ 下载Windows版的qcachegrind。

在go tool pprof的命令行里,使用callgrind命令生成qcachegrind工具所支持的文件类型:

(pprof) callgrind
Generating report in profile010.callgraph.out

然后使用下载的qcachegrind.exe打开生成的文件即可,此处为:profile010.callgraph.out。使用qcachegrind可以在各个函数之间自由跳转,查看函数内部的CPU占用情况,相对其他格式要更加灵活方便。例如以下是我们对GoWorld游戏服务器进行一次性能测试的结果。

不成熟的优化是万恶之源!因此我们在对自己的Go程序进行优化之前,不妨先使用go tool pprof对程序性能进行检测,然后对关键的性能瓶颈部分进行优化,这样才会起到事半功倍的效果。Golang提供的pprof是进行性能测试的利器,经过我们的实际使用发现,即使在开启性能测试的30s里,pprof对程序带来的性能损耗并不大。

开源分布式游戏服务器引擎:https://github.com/xiaonanln/goworld,欢迎赏星,共同学习

对Go语言服务端开发感兴趣的朋友欢迎加入QQ讨论群:662182346

Golang使用pprof和qcachegrind进行性能监控的更多相关文章

  1. golang 使用pprof和go-torch做性能分析

    软件开发过程中,项目上线并不是终点.上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写. golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能 ...

  2. Go pprof性能监控

    Go net/http/pprof包提供了一个在WEB项目中使用的性能监控的工具, 使用时只需要引用包: _"net/http/pprof" 然后就可以在浏览器中访问地址: htt ...

  3. Go 程序的性能监控与分析 pprof

    你有没有考虑过,你的goroutines是如何被go的runtime系统调度的?是否尝试理解过为什么在程序中增加了并发,但并没有给它带来更好的性能?go执行跟踪程序可以帮助回答这些疑问,还有其他和其有 ...

  4. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  5. jvm系列(五):tomcat性能调优和性能监控(visualvm)

    tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...

  6. spring拦截器 实现应用之性能监控

    package cn.ximi.erp.web.common.interceptors; import cn.ximi.core.common.utils.string.StringUtil; imp ...

  7. Performance Monitor1:开始性能监控

    Performance Monitor是Windows内置的一个可视化监控工具,能够在OS级别上实时记录系统资源的使用情况,通过收集和存储日志数据,在SQL Server发生异常时,能够还原系统当时的 ...

  8. 前端性能监控方案window.performance 调研(转)

    1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...

  9. Apache服务器性能监控

    Apache服务器性能监控 1.使用自带mod_status模块监控 1)加载mod_status.so 模块 在httpd.conf中打开LoadModule status_module modul ...

随机推荐

  1. 增强for循环用法

    1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的, 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容.不能获取 ...

  2. Linux命令 文件的建立移动删除

    cat [功能说明] 建立文件  #cat命令用来串接文件或显示文件内容的但是如果从标准输入设备中读入数据并将结果重定向到一个新的文件中,则可以到达建立新文件的目的.Cat命令只能在编辑新的文件时只能 ...

  3. 行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?

    块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...

  4. ClistCtrl用法及总结(由怎样隐藏ListCtrl列表头的排序小三角形这个bug学习到的知识)

    1 怎样隐藏ListCtrl列表头的排序小三角形 在创建控件是加入|LVS_NOSORTHEADER风格即可. 一下是用法总结: 本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧. ...

  5. cordova.js的坑

    最近在使用cordova开发app,一开始只引用了cordova.js,cordova通过function exec(){}来链接本地和H5,之前代码被下载到了本地,在苹果和android上都能实现功 ...

  6. libpng处理png图片(二)

    一,实现效果:图片剪切, 图片拼接                      ------------------切割后------------------>                  ...

  7. Docker 初步认识

    1.docker 是什么? 一个开源的应用容器引擎,个人理解 就是虚拟的应用运行环境. 2.安装Docker for windows 下载地址 :https://store.docker.com/ed ...

  8. Spring Web 配置文件加载路径问题

    Spring:   定位   载入   注册 我们常用的加载context文件的方法有如下三个: 1.FileSystemXmlApplicationContext 这个方法是从文件绝对路径加载配置文 ...

  9. 简单的视频采集demo

    打算做个简单的聊天软件,其中一个我没做过的,就是视频采集. 在网上查了许久资料,终于搞清楚了dshow采集视频的流程 参考资料如下: https://msdn.microsoft.com/en-us/ ...

  10. 【Android Developers Training】 20. 创建一个Fragment

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...