golang cpuprofile分析
http://www.philo.top/2015/05/29/golangProfilingAndGC/
Philo
关注Golang与Docker技术
|
golang调优之clock ticks
本blog的来源
昨天在找工作面试的时候我与面试官聊到了golang的问题。当然讨论的热点就是调优与GC。
结果面试变成了技术讨论与研究,聊了接近一个小时,真的很开心。
下面的研究内容来自goblog https://blog.golang.org/profiling-go-programs
我也只是想浓缩一遍上面的内容方便大家研习。当然文章可能比较老了。
因此我在这里重新走一遍大神之路:
问题来源:
来自论文:http://research.google.com/pubs/pub37122.html
提出的挑战,在这篇文章中golang的性能是最低的。因此在本blog中就针对这篇文章中的算法进行调优。
先说明我的各种版本号:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[#11#ljy@ljydeiMac ~/cpp_pro]$g++ --version Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn) Target: x86_64-apple-darwin14.0.0 Thread model: posix [#12#ljy@ljydeiMac ~/cpp_pro]$go version go version go1.4.2 darwin/amd64 C++ 成绩: real 0m16.791s user 0m16.093s sys 0m0.687s golang 成绩: real 0m26.582s user 0m26.393s sys 0m0.161s |
pprof运行原理and解释and调优
1 2 3 4 5 6 7 8 9 10 11 12 |
(pprof) top10 Total: 2525 samples 298 11.8% 11.8% 345 13.7% runtime.mapaccess1_fast64 268 10.6% 22.4% 2124 84.1% main.FindLoops 251 9.9% 32.4% 451 17.9% scanblock 178 7.0% 39.4% 351 13.9% hash_insert 131 5.2% 44.6% 158 6.3% sweepspan 119 4.7% 49.3% 350 13.9% main.DFS 96 3.8% 53.1% 98 3.9% flushptrbuf 95 3.8% 56.9% 95 3.8% runtime.aeshash64 95 3.8% 60.6% 101 4.0% runtime.settype_flush 88 3.5% 64.1% 988 39.1% runtime.mallocgc |
pprof模块通过每秒大概100次的对runtime 中的 stack
进行取样来进行统计的。下面来解释一下报表为啥是上面这个样子。
首先 Total 2525 程序大概运行了25s+
———-这一部分是针对单个函数的统计
col1: 在取样中作为栈顶的次数
col2: 作为堆顶的百分比,以第一行为例统计关系:298/2525 约等于 11.8% 就好理解了
col3: 排名结果的累加,都是这个位置的数的上面加左面获取的结果,有了这个就可以大概看出来几个热点占用的总比例,非常方便
———-这一部分是对整个堆栈的统计。与上面的区别是不考虑是否在堆栈顶部。
col4: 在sample堆栈中出现的次数,不管是waiting还是return只要出现就计入统计。
col5: 出现次数百分比,与左边报表左边类似。
col6: 略
这种统计方法不但不会影响太多程序性能,而且可以很好的把握程序热点在何位置。
在Intel Vtune中它会帮你完全统计出函数所用的时间。虽然非常爽但是其实没有什么大作用。
有个大概百分比就基本够用了。
不失为一种定性与定量的中间选择。其实我在做log系统的时候也可以仿照他的来做。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
(pprof) list DFS Total: 2525 samples ROUTINE ====================== main.DFS in /home/rsc/g/benchgraffiti/havlak/havlak1.go 119 697 Total samples (flat / cumulative) 3 3 240: func DFS(currentNode *BasicBlock, nodes []*UnionFindNode, number map[*BasicBlock]int, last []int, current int) int { 1 1 241: nodes[current].Init(currentNode, current) 1 37 242: number[currentNode] = current . . 243: 1 1 244: lastid := current 89 89 245: for _, target := range currentNode.OutEdges { 9 152 246: if number[target] == unvisited { 7 354 247: lastid = DFS(target, nodes, number, last, lastid+1) . . 248: } . . 249: } 7 59 250: last[number[currentNode]] = lastid 1 1 251: return lastid (pprof) |
虽然不需要解释,但是很容易看出来那句话执行时间是最长的(L:247)
主要热点问题在于使用了map进行搜索。
在这个blog中提出了使用[]int的方式给map增加类似索引的东西。效果不错。((^__^) 嘻嘻……其实我在自己做cache搜索的时候也这么做。)
Tip:作者的compiler是6g很老版本的。这里补充一下go1.4.2的成绩:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
调优前 $time ./havlak1 # of loops: 76000 (including 1 artificial root node) real 0m21.686s user 0m21.578s sys 0m0.111s 按照上面方法调优后 time ./havlak2 # of loops: 76000 (including 1 artificial root node) real 0m12.588s user 0m12.486s sys 0m0.103s 对比我们上一次测试的源代码修改了之后的成绩,可以看到与C++的成绩非常接近了。(GO:26s,CPP:16s) time ./go_pro Welcome to LoopTesterApp, Go edition Constructing Simple CFG... 15000 dummy loops Constructing CFG... Performing Loop Recognition 1 Iteration Another 50 iterations... .................................................. # of loops: 76000 (including 1 artificial root node) real 0m18.447s user 0m18.297s sys 0m0.134s |
调优过程源码:
hg clone https://code.google.com/p/benchgraffiti
总结
在本篇中,我们可以看到简单的使用pprof模块就可以针对程序的热点进行大幅度的性能改进。
当然我依然坚持认为,在项目prototype开发以及alpha版本中不适合任何角度的调优。
只考虑架构性能已经是最多了(或者说是技术方向性)
但是需要注意的是,pprof本身不会帮你调优,还是要看对golang的熟悉程度。
在这里虽然用了Index来进行调优,但是我们在实战的过程当中可能会更加复杂。
也许路还很远,下一篇GC内存调优。Continue。
分享到 Comments
- golang
- profiling
Newer
Older
- 0条评论
- 还没有评论,沙发等你来抢
philo.top正在使用多说
分类
- 技术61
- 杂谈5
标签
- BusyBox1
- CoreOS1
- Cow1
- DES1
- DaoCloud1
- Docker2
- GC1
- Golang1
- HomeBrew1
- Linux13
- MongoDB1
- RHEL1
- RunC1
- ShadowSocks1
- Ubuntu1
- article1
- atom2
- blog1
- bootstrap1
- busybox1
- butterfly1
- career1
- coreos1
- css1
- datatables1
- delegate1
- dev1
- devenv1
- docker5
- env1
- git6
- godoc1
- golang18
- grub1
- hexo3
- homebrew1
- html1
- html51
- iterm21
- java2
- js8
- linux3
- liteIDE1
- mac2
- macos1
- minecraft2
- mongodb4
- mysql2
- node1
- oop1
- osx4
- php1
- phpExtension1
- profiling2
- putty2
- python4
- require.js1
- requirejs1
- rkt1
- runc1
- shell5
- ss1
- sublime1
- test1
- tray1
- ubuntu3
- vim1
- virtualbox2
- visualization1
- web3
- wiki2
- yaml1
- 杂谈1
标签云
归档
- 八月 20152
- 七月 20158
- 六月 20153
- 五月 20156
- 四月 20151
- 三月 20155
- 二月 20158
- 一月 20151
- 十一月 189934
近期文章
- golang 项目测试方案
- 大学这些年陪我走过学习开发的硬件们
- 我的vim golang 开发环境
- 程序员的投资与投机
- 秒杀SSD,ubuntu极速开发环境搭建
友情链接
- Linux中国
- 主题作者
- 热前端
- 青春华航
- locez
- SVNT 七枚核桃
Powered by Hexo . Theme byLandscape-plus . 图片托管: 七牛云存储 .
Home Archives About Donate GeekP
golang cpuprofile分析相关推荐
- golang调用java的函数_大话golang性能分析(一):profile基本原理
引言:好久没分享了,不多废话了,准备一个专题分三期来分享下golang的性能分析. O 专题目标 理解profile基本原理 熟悉go常用性能分析工具pprof 快速对线上服务的cpu.内存.goro ...
- 【实践】golang代码覆盖率分析-goc使用
golang代码覆盖率分析-goc使用 1.安装goc 2.使用步骤 3.扩展相关 golang是一个开发效率非常高.代码安全性高的开发语言.同时具备优秀的跨平台特性,在windows.Linux.m ...
- golang性能分析工具pprof介绍
1 golang性能分析工具pprof介绍 文章目录 1 golang性能分析工具pprof介绍 1.1 pprof简介 1.2 pprof引入方法 1.3 使用pprof进行分析的方法 1.3.1 ...
- golang 内存分析/动态追踪
https://my.oschina.net/ytqvip/blog/1920459 golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序 ...
- golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践
在云原生时代和容器化浪潮中,容器的日志采集是一个看起来不起眼却又无法忽视的重要议题.对于容器日志采集我们常用的工具有filebeat和fluentd,两者对比各有优劣,相比基于ruby的fluentd ...
- golang 日志分析_Saferwall:下一代开源恶意软件分析平台
Saferwall Saferwall是一款开源的恶意软件分析平台,该工具旨在给安全社区提供以下内容: 为恶意软件研究人员提供共享样本的协作平台. 帮助研究人员自动化生成恶意软件分析报告. 寻找新的恶 ...
- Golang内存分析工具gctrace和pprof实战
目录 gctrace 参数说明 举例分析 补充说明 pprof go tool pprof分析工具 参考 gctrace gctrace用途主要是用于跟踪GC的不同阶段的耗时与GC前后的内存量对比. ...
- 记录一次Golang逃逸分析
今天偶然看到Golang关于内存的文章,其中涉及了一点逃逸分析,由于去年之前都是专研C++,Golang也是去年11月才开始学习的,学完就马上进入项目了,没有深究底层,准备这段时间边改论文边开始仔细学 ...
- golang coredump分析
背景 最近在分析golang的一个内存泄漏问题.一般来讲,使用golang自带的pprof工具就可以分析内存的使用,协程情况,是否有block等情况.但是我们项目中调用了C库,导致C库的一些东西没法通 ...
最新文章
- xdebug 远程调试
- SAP Spartacus 服务器端渲染的单步调试
- linux ubuntu 编写c/c++ 获取命令行传入参数示例
- CodeSmith实用技巧(九):重载Render方法来控制输出
- 面试:MySQL InnoDB 事务隔离
- 春节直播大战搜狐另辟蹊径 40余场直播引领牛年直播综艺新风尚
- l2-004 这是二叉搜索树吗?_MySQL索引为何选择B+树
- Win10微软帐户切换不回Administrator本地帐户的解决方法【亲测】
- Nginx1.10编译安装
- (译)Windows Azure:移动后端开发的主要更新
- Dot net GC
- 利用Python编程,分别使用梯度下降法和最小二乘法求解多元函数
- 关于报表在移动端展现你需要知道哪些?
- 宏自动生成条形码_条码打印软件如何生成SKU码
- JAVA中小型医院信息管理系统源码 医院系统源码
- 5W1H/SWOT/SMART/PDCA/时间管理
- 从电信的广告学习情景与文案的搭配
- PHP取出数组中随机一条字符串
- 计算机c盘系统自带的有哪些,电脑C盘里哪些文件是可以删除的?C盘可以删除的文件大全...
- HTML5开发系列(4) 之 样式表的三种类型
热门文章
- BCI Competition 2008 – Graz dataset A个人翻译(附MATLAB安装BioSig)
- 2021年软件开发趋势大预测
- Android监听消息(一)——应用消息捕获
- FSSC22000认证咨询,本程序适用与食品安全体系中的产品危害信息收集、分析和评估等所有活动
- 【老生谈算法】matlab实现灰度图处理源码——灰度图处理
- ******CSDN后引发 7K7K 、嘟嘟牛、178、多玩、猫扑、人人等各大知名网站数据库下载地址 (转载)...
- 六字诀教你辨肾脏是否健康
- C# winform 汽车租赁系统
- 普通人如何在5年内赚到1000万
- 噩梦的开始:动态规划之背包问题(01背包问题、完全背包问题、方案数填满型背包问题)