第八章--实际项目性能分析--pprof分析beego项目的性能
时间:2022-07-25
本文章向大家介绍第八章--实际项目性能分析--pprof分析beego项目的性能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下面分析近期做过的一个beego项目
最新开发了一个go项目, 目前已经上线, 昨天研究了性能测试, 那就对之前做的项目进行一个性能分析吧
给beeg项目添加pprof功能. 百度查了, 说beego是支持pprof的, 只需要在配置文件中beego.PprofOn = true开启即可, 但我试了似乎不行. 采用另一种方法
第一步: import 增加net/http/pprof包
import(
_ net/http/pprof
)
第二步: 打开http端的监听端口
go func() {
http.ListenAndServe("localhost:8888", nil)
}()
这里定义了一个协程, 我直接把这个协程放在main启动函数里了, 和main函数一起启动监听程序
第三步: 在网页上查看, 输入http://localhost:8888/debug/profile, 这是会看到如下页面
为什么我们的heap才是2, 原因是,这个项目我是刚刚启动的。 随着请求访问的增加,连接数也会增加。 后面我们来模拟大量http请求, 具体含义如下
- 2 allocs: 过去所有内存分配的样本
- 0 block: 堆栈导致对原始同步的阻塞
- 0 cmline: 当前程序的命令行调用
- 16 goroutine: 当前所有goroutine的堆栈跟踪
- 2 heap: 活动对象内存分配的采样。您可以指定gc GET参数以在获取堆样本之前运行GC。
- 0 mutex: 竞争互斥持有人的堆栈痕迹
- 0 profile: CPU配置文件。您可以在GET参数中指定持续时间。获取概要文件后,请使用go tool pprof命令调查文件。
- 21 threadcreate: 导致创建新OS线程的堆栈跟踪
- 0 trace: 当前程序执行的痕迹。您可以在GET参数中指定持续时间。获取跟踪文件后,使用go工具trace命令调查跟踪。
第四步: 通过Graphviz, 查看heap
从图中看, cpu的使用是0, heap的使用是2, 所以, 我们查看heap.
go tool pprof http://127.0.0.1:8888/debug/pprof/heap
然后输入web, 生成svg文件, 直接用浏览器打开, 如下:
inuse_space表示的是数据的类型是实时数据
通过这个图, 我们看到main调用以后的执行过程, 每一步的耗时是多少。
第五步: 模拟并发, 测试性能
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:8888/deer/v1/user/login
我模拟的是批量登录, 参数含义如下
- -c400: 我们有400个连接可以保持打开状态
- -t8 :意味着我们使用8个线程来构建请求
- -d5m 表示测试时间将持续5分钟
3. 在浏览器输入
http://localhost:8888/debug/pprof/
查看使用情况:
4. awk执行完以后, 查看执行结果汇总
5. 接下来用go tool pprof 查看 heap
go tool pprof -alloc_space/-inuse_space http://localhost:8888/debug/pprof/heap
可以清晰的看到两块占内存使用最多的地方, 第一个是bufio的Writer和Reader, 另一个是操作数据库。 这样我们就可以有针对性的进行优化了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序——轮播图、组件传值、下拉刷新、导航 实战开发
- 从微信网页授权到OAuth 2.0
- 微信小程序常用组件
- React进阶篇(七)React 同构
- 商业数据分析从入门到入职(5)Python基本语法和数据类型
- JavaScript 同步和异步的执行机制问题
- Vue 与小程序:父组件给子组件传值的区别
- Canvas悟空推箱子
- Spring Cloud 之服务网关 Zuul (一)
- React进阶篇(八)react redux
- 通过一个简单例子理解JavaScript闭包和this对象
- Spring Cloud 之服务网关 Gateway (一)
- Hacking with iOS: SwiftUI Edition - Hot Prospects项目(二)
- HarmonyOS-对Android开发者也太友好了吧
- 你还在使用复杂的 zkclient 开发 zookeeper 么?是时候用 Curator 了 !