第八章--性能优化--pprof详细研究

简介: pprof的基本操作, 上次博客有记录, 这里进一步研究pprof接下来开始今天的学习内容. 计划今天研究以下几个部分的内容

接着上次的博客: https://www.cnblogs.com/ITPower/articles/12315637.html


pprof的基本操作, 上次博客有记录, 这里进一步研究pprof


接下来开始今天的学习内容. 计划今天研究以下几个部分的内容


1. pprof扩展


  a. 在单元测试testing.B中测试检测程序的性能


  b. web项目中检测程序的性能


2. pprof的使用, 以及如何看生成的svg图.


3. 使用pprof分析近期做过的一个beego项目. 详见另一篇博客:


https://www.cnblogs.com/ITPower/articles/12324659.html


4. 调研pprof是否能够使用在生成环境.


5. 研究testing.T, testing.B testing.TB testing.N的区别: 详见博客


https://www.cnblogs.com/ITPower/articles/12320577.html

 

一. pprof扩展


Go语言自带了强大的性能测试工具pprof,位于 net/http 包下的 pprof, 官方文档


go中有pprof包来做代码的性能监控,在两个地方有包:net/http/pprof


和 runtime/pprof


其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来.


  • net/http/pprof : 可以做到直接看到当前 web 服务的状态,包括 CPU 占用情况和内存使用情况等。如果服务是一直运行的,如 web 应用,可以很方便的使用第一种方式 import "net/http/pprof"。


  • runtime/pprof : 可以用来产生 dump 文件,再使用 Go Tool PProf 来分析这运行日志。

 

我们研究pprof的使用从两个方面研究 :


  1. 如何查看单元测试中对性能的测试分析


  2. 查看web服务的性能

 

1. 查看单元测试中对性能的测试分析


我们借用上一次的一个例子. 对异常处理的代码部分进行性能分析


第一步: 写性能分析的测试用例.


比如: 我们模拟用户错误的输出情况


func BenchmarkWrapError(t *testing.B) {
    h := handlerUserError
    code := 400
    message := "user error"
    for i := 0; i < t.N ; i ++  {
        f := WrapError(h)
        // 模拟Request和response
        response := httptest.NewRecorder()
        request := httptest.NewRequest(http.MethodGet, "http://www.baidu.com", nil)
        f(response, request)
        //读取reponse返回的body
        b, _ := ioutil.ReadAll(response.Body)
        body := strings.Trim(string(b), "\n")
        if code != response.Code || message != body {
            t.Errorf("except--code: %d, message: %s \n actual--code:%d, message:%s",
                code, message, response.Code, body)
        }
    }
}


第二步: 进入到文件目录, 在命令行执行 go test -bench . -cpuprofile cpu.out  性能测试cpu的消耗情况


go test -bench . -cpuprofile cpu.out


第三步: 执行pprof分析


go tool pprof cpu.out


第四步: 输入web, 会生成一个svg的文件, 然后使用浏览器查看视图. 微信图片_20220510130628.png微信图片_20220510130642.png从图中可以看出每一步花费的时间大概是多少. 其中哪一个步骤花费的时间最长. 然后我们就可以针对其进行优化了


备注: 要想以web视图的方式查看上述结果, 需要下载graphviz, 下载方式参考


https://www.cnblogs.com/ITPower/articles/12315637.html的第四点, 附截图

微信图片_20220510130702.png

2. 查看web服务的性能


第一步: import 增加net/http/pprof包  


import(
    _ net/http/pprof
)


第二步: 打开http端的监听端口


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


第三步: 在网页上查看, 输入http://localhost:8888/debug/profile, 这是会看到如下页面


微信图片_20220510130749.png

这个页面分为两部分. 第一部分是当前服务的使用情况. 第二部分, 对命令的解析使用情况


截图如下微信图片_20220510130807.pngCount 表示当前服务使用数, 比如2, 是消耗内存的进程数. 21表示线程创建数, 2 表示历史数据. 等等

Profile 是性能指标名

 

命令说明如下:


  • allocs: 过去所有内存分配的样本


  • block: 堆栈导致对原始同步的阻塞


  • cmline: 当前程序的命令行调用


  • goroutine: 当前所有goroutine的堆栈跟踪


  • heap: 活动对象内存分配的采样。您可以指定gc GET参数以在获取堆样本之前运行GC。


  • mutex: 竞争互斥持有人的堆栈痕迹


  • profile: CPU配置文件。您可以在GET参数中指定持续时间。获取概要文件后,请使用go tool pprof命令调查文件。


  • threadcreate: 导致创建新OS线程的堆栈跟踪


  • trace: 当前程序执行的痕迹。您可以在GET参数中指定持续时间。获取跟踪文件后,使用go工具trace命令调查跟踪。


第四步: 通过Graphviz, 查看heap


从图中看, cpu的使用是0, heap的使用是2, 所以, 我们查看heap.


go tool pprof http://127.0.0.1:8888/debug/pprof/heap


接下来我们可以通过help 查看pprof都有哪些命令. 常用的命令有. tree, top, web

我们用tree查看内存的使用情况


微信图片_20220510130918.png


还可以使用top查看最消耗内存的地方

微信图片_20220510130938.png


接下来还是使用web查看视图微信图片_20220510130955.png 

视图更加直观, 哪一步消耗了多少内存

 

第五步: 模拟并发, 测试性能


这样的程序都是刚刚运行, 所以内存消耗, cpu消耗都比较少. 接下来我们模拟大量请求, 试一试性能如何


1. 下载一个模拟http请求的工具wrk(模拟现实, 了解系统瓶颈, 将服务器置于一个繁忙的状态, 就像生产环境一样. ), 下载地址: https://github.com/wg/wrk.git


在github上也有这个工具的介绍,


git clonehttps://github.com/wg/wrk.git
cd wrk
make


备注: 整个操作参考github上的说明即可.


2. 安装好wrk以后, 模拟批量请求


./wrk -c400 -t8 -d5m http://localhost:8899/v1/user/login


我模拟的是批量登录, 参数含义如下


  • -c400: 我们有400个连接可以保持打开状态


  • -t8 :意味着我们使用8个线程来构建请求


  • -d5m 表示测试时间将持续5分钟


3. 在浏览器输入


http://localhost:8899/debug/pprof/


查看使用情况


微信图片_20220510131100.png4. awk执行完以后, 查看执行结果汇总


微信图片_20220510131118.png


5. 接下来用go tool pprof 查看 heap


go tool pprof -alloc_space/-inuse_space http://localhost:8899/debug/pprof/heap


-alloc_space: 过去使用的内存数据


-inuse_space: 正在使用的内存数据


返回的视图


微信图片_20220510131306.png微信图片_20220510131317.png微信图片_20220510131328.png方框越大, 表示内存消耗越多.  


参考文献:


1. https://blog.csdn.net/guyan0319/article/details/85007181


2. https://www.cnblogs.com/mrblue/p/9555118.html


3. https://www.jianshu.com/p/aa9b148e90e5

目录
打赏
0
0
0
0
19
分享
相关文章
浅析JAVA日志中的性能实践与原理解释问题之"Garbage Free"技术的实现方式问题如何解决
浅析JAVA日志中的性能实践与原理解释问题之"Garbage Free"技术的实现方式问题如何解决
《OpenACC并行程序设计:性能优化实践指南》一 2.1 测试代码:共轭梯度法
本节书摘来自华章出版社《OpenACC并行程序设计:性能优化实践指南》一 书中的第2章,第2.1节,作者:[美] 罗布·法伯(Rob Farber),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1711 0
《OpenACC并行程序设计:性能优化实践指南》一 第3章 使用Score-P和Vampir分析混合应用性能
本节书摘来自华章出版社《OpenACC并行程序设计:性能优化实践指南》一 书中的第3章,作者:[美] 罗布·法伯(Rob Farber),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1279 0
《OpenACC并行程序设计:性能优化实践指南》一 3.1 性能分析技术和术语
本节书摘来自华章出版社《OpenACC并行程序设计:性能优化实践指南》一 书中的第3章,第3.1节,作者:[美] 罗布·法伯(Rob Farber),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1195 0
官方文档:Androi“.NET研究”d应用程序运行的性能设计
  Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序。
1114 0
程序性能优化入门锦集--设计+代码+JVM调优+数据库优化策略
关于优化是一项很大的内容。本文结合菜鸟结算项目优化点分析以及书籍《JAVA程序性能优化》阅读心得,给出个人觉得可供参考的优化思路,共涉及四个方面,分别是:设计篇、代码优化篇、JVM内存调优和数据库操作优化。
2389 0
浅析JAVA日志中的几则性能实践与原理解释
本篇文章通过几个技术点说明日志记录过程中的性能实践,计算机领域的性能往往都遵循着冰山法则,即你能看得见的、程序员能感知的只是其中的一小部分,还有大量的细节隐藏在冰山之下。
带你读《More Effective C#:改善C#代码的50个有效方法》之二:API设计
本书围绕一些关于C#和.NET的重要主题,包括C#语言元素、.NET资源管理、使用C#表达设计、创建二进制组件和使用框架等,讲述了最常见的50个问题的解决方案,为程序员提供了改善C#和.NET程序的方法。本书通过将每个条款构建在之前的条款之上,并合理地利用之前的条款,来让读者最大限度地学习书中的内容,为其在不同情况下使用最佳构造提供指导,适合各层次的C#程序员阅读。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等