Go -- pprof协程监控
go中有pprof包来做代码的性能监控,在两个地方有包:
net/http/pprof
runtime/pprof
其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来
pprof包
web 服务器
如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。
服务进程
如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。
比如:
go func() {log.Println(http.ListenAndServe("localhost:6060", nil))
}()
应用程序
如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。比如下面的例子:
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") func main() { flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() }
…
运行程序的时候加一个--cpuprofile参数,比如fabonacci --cpuprofile=fabonacci.prof
这样程序运行的时候的cpu信息就会记录到XXX.prof中了。
下一步就可以使用这个prof信息做出性能分析图了(需要安装graphviz)。
使用go tool pprof (应用程序) (应用程序的prof文件)
进入到pprof,使用web命令就会在/tmp下生成svg文件,svg文件是可以在浏览器下看的。像这个样子:
如果你的程序非常简单,比如只有println一个语句,你用pprof.StartCPUProfile是打印不出任何东西的。
举例
下面拿go-tour举个例子,这是个web程序,我在代码中加入了
_ "net/http/pprof"
在浏览器中我就可以直接看prof信息了
生成CPU状态分析图
下面我们想要生成CPU状态分析图,调用go tool pprof http://localhost:3999/debug/pprof/profile
就会进入30秒的profile收集时间,在这段事件内猛刷新点击go-tour浏览器上的页面,尽量让cpu占用性能产生数据。
(pprof) top10
Total: 3 samples
1 33.3% 33.3% 1 33.3% MHeap_AllocLocked
1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors
1 33.3% 100.0% 1 33.3% runtime.sigprocmask
0 0.0% 100.0% 1 33.3% MCentral_Grow
0 0.0% 100.0% 2 66.7% main.Compile
0 0.0% 100.0% 2 66.7% main.compile
0 0.0% 100.0% 2 66.7% main.run
0 0.0% 100.0% 1 33.3% makeslice1
0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP
0 0.0% 100.0% 2 66.7% net/http.(*conn).serve
(pprof)web
参考
http://blog.golang.org/2011/06/profiling-go-programs.html
这篇官方文章说得很仔细了,但是要注意,将里面的gopprof工具换成go tool pprof就行了
转载于:https://www.cnblogs.com/mafeng/p/7323812.html
Go -- pprof协程监控相关推荐
- k8s与监控--从telegraf改造谈golang多协程精确控制
从telegraf改造谈golang多协程精确控制 前言 telegraf是infuxdb公司开源出来的一个基于插件机制的收集metrics的 项目.整个架构和elastic公司的日志收集系统极其类似 ...
- python中的协程(二)
协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...
- java 协程 实现 Akka
2019独角兽企业重金招聘Python工程师标准>>> java 协程 实现 Akka 博客分类: java Akka是开源的,可以通过Apache 2许可获得.可以从 http:/ ...
- 网关技术选型,为什么选择 Openresty ?事件驱动、协程...
今天跟大家聊下关于网关的话题 互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面: 数据量过大,如何定制化存储 访问量高了,如何集群化部署,流量负载均衡 响应速度慢了,如 ...
- rabbitmq 查询版本_Hyperf 发布 v2.0.14 版本 | 企业级的 PHP 微服务云原生协程框架
更新内容 本周主要新增了 hyperf/scout hyperf/resource 和 hyperf/resource-grpc 三个组件,并修复了一些组件的 Bug,继续提升 Hyperf 的稳定性 ...
- API聚合网关技术选型参考-网友实战-使用协程
2019独角兽企业重金招聘Python工程师标准>>> http://www.open-open.com/lib/view/open1468892776625.html 最近遇到的一 ...
- Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列
内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...
- 操作系统的线程和进程的区别_进程,线程,协程,有何区别?
进程 cpu是计算机的核心,主要处理计算机的计算任务.操作系统是计算机的管理员,它负责任务的调度,资源的管理和分配,统一管理计算机的硬件资源.应用程序则是具有某种功能的程序,应用程序运行于操作系统 ...
- python3之协程(3)---greenlet实现协程操作
原文链接:https://www.cnblogs.com/xybaby/p/6337944.html 正文 在前面的文章中提到python原生的generator是semicoroutine,而gre ...
最新文章
- Navisworks Api Quantification
- android 调用本地第三方应用软件,如qq、微信、微博和视频播放器等
- adb.exe可能被其他程序关闭_木工中央除尘设备系统正式运行的操作程序
- 【1】C++语法与数据结构之C语言学生管理系统转C++学生管理系统
- 前端学习(3132):react-hello-react之react中事件处理
- 数据结构:在一个单链表中,若删除p指向节点的后继节点,则执行的操作为:( )
- gcc学习(二)[第二版]
- 知道路程时间求加速度_人教版高中物理必修一重点知识点—加速度分析与讲解...
- override和new的区别
- 淘宝技术这十年——光棍节的狂欢
- cmake Can‘t find third_party/gtest
- QT_布局管理器 网格布局管理器 QGridLayout 超简单
- DevExpress中使用ChartControl绘制折线图和导出图表为Excel文件
- 《SAP从入门到精通》——导读
- 使用 pyecharts 以及matplotlib分析猫眼哪吒影评
- Python爬虫——新浪微博登陆
- MySQL数据库之分库分表方案
- JZOJ 3339. 【NOI2013模拟】wyl8899和法法塔的游戏
- [树莓派 PICO(基于MicroPython)]基础教程02-按键测试、按键控制外设LED开关
- [CTSC2016]时空旅行(线段树+凸包)
热门文章
- 项目管理三大认证体系,该选择谁?
- C# OracleParameter 传参 实例
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
- multipart/form-data ajax 提交问题(未解决)
- sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析
- ReSharper 配置及用法(转)
- 高级性能服务器编程模型【IOCP完成端口】开发实现【二】
- [收集] C++ memset ,memcpy 和strcpy 的区别
- 用单循环链表实现约瑟夫问题。
- tensorflow.reshap(tensor,shape,name)的使用说明