Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

49 | 程序性能分析基础(下)

自定义HTTP请求多路复用器
/debug/pprof/路径下的子路径
net/http/pprof代码包
概要名称
Profile值
runtime/pprof包中的Lookup函数
blockprofilerate变量
SetBlockProfileRate函数
runtime.ReadMemStats函数
WriteHeapProfile函数
runtime.MemProfileRate变量
基于HTTP协议的网络服务添加性能分析接口
runtime/pprof.Lookup函数的正确调用方式
获取阻塞概要信息
内存概要信息的采样频率设定
知识扩展
runtime/trace代码包的功用
性能分析基础(下)
思考题
程序性能分析
性能分析基础

该思维导图由 AI 生成,仅供参考

你好,我是郝林,今天我们继续分享程序性能分析基础的内容。
在上一篇文章中,我们围绕着“怎样让程序对 CPU 概要信息进行采样”这一问题进行了探讨,今天,我们再来一起看看它的拓展问题。

知识扩展

问题 1:怎样设定内存概要信息的采样频率?

针对内存概要信息的采样会按照一定比例收集 Go 程序在运行期间的堆内存使用情况。设定内存概要信息采样频率的方法很简单,只要为runtime.MemProfileRate变量赋值即可。
这个变量的含义是,平均每分配多少个字节,就对堆内存的使用情况进行一次采样。如果把该变量的值设为0,那么,Go 语言运行时系统就会完全停止对内存概要信息的采样。该变量的缺省值是512 KB,也就是512千字节。
注意,如果你要设定这个采样频率,那么越早设定越好,并且只应该设定一次,否则就可能会对 Go 语言运行时系统的采样工作,造成不良影响。比如,只在main函数的开始处设定一次。
在这之后,当我们想获取内存概要信息的时候,还需要调用runtime/pprof包中的WriteHeapProfile函数。该函数会把收集好的内存概要信息,写到我们指定的写入器中。
注意,我们通过WriteHeapProfile函数得到的内存概要信息并不是实时的,它是一个快照,是在最近一次的内存垃圾收集工作完成时产生的。如果你想要实时的信息,那么可以调用runtime.ReadMemStats函数。不过要特别注意,该函数会引起 Go 语言调度器的短暂停顿。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Go语言程序性能分析的基础知识和技巧,包括内存和阻塞概要信息的采样设定和获取,以及`runtime/pprof.Lookup`函数的使用方法。作者首先讨论了如何设定内存概要信息的采样频率,然后介绍了获取阻塞概要信息的方法,包括采样频率设定和获取阻塞概要信息的具体步骤。此外,文章还详细解释了`runtime/pprof.Lookup`函数的正确调用方式,以及不同参数值对应的概要信息收集方法和输出规格。另外,文章还介绍了如何为基于HTTP协议的网络服务添加性能分析接口,包括使用`net/http/pprof`包提供的程序实体来实现性能分析接口的嵌入。总的来说,本文内容丰富,对于需要进行程序性能优化和分析的开发人员具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • 张sir
    请问老师,我如何通过这些分析指标来定位具体哪个代码包或者哪个方法执行会有性能问题,比如pprof/goroutine采样结果,我输入topN或者web,输出0 0% 100% 36 64.29% github.com/go-redis/redis/internal/pool.(*ConnPool).reaper这些内容,应该怎么去分析呢

    作者回复: 这里有一些参考:https://github.com/hyper0x/go_command_tutorial/blob/master/0.12.md

    2019-12-01
    11
  • nullptr
    老师好,我在生产环境遇到gc时panic的问题,不知道老师有没有好的建议来定位一下

    作者回复: 这得看具体情况,输出了什么之类。看不到堆栈无从判断。

    2020-07-31
    2
  • 安排
    go语言可执行程序加载到内存中,内存布局和 C语言的一样吗?go编出来的可执行程序也是elf格式吗?编译go程序的步骤是什么样的?预处理,编译汇编这些都有吗?可不可以只执行预处理或者只编译不链接?

    作者回复: Go 属于现代高级编程语言,所以隐藏了很多编译的东西。这方面的东西你可以参看 Go 语言的源码,具体在 cmd/compile 等包下。

    2019-09-10
    2
  • kuzan
    老师好,golang的gc会根据什么尺寸做回收呢,比如java里有xmx,那go呢?

    作者回复: 可以查阅 runtime/debug.SetGCPercent 函数的文档。

    2019-01-21
    1
  • nullptr
    没法回复老师的评论,我再评论一个新的。 代码工程比较大,而且主要代码没直接用到cgo,但是在gc时候panic了,信息也提示了cgo相关,不知道老师有没有啥工具可以定位。

    作者回复: 估计是依赖包用到cgo了,这种情况用pprof和trace都不一定判断的出来,你只能细看stack,看看有没有线索。最好好好回想一下哪些依赖包有可能用到cgo。或者看看你的环境变量里有没有跟cgo有关的设定。

    2020-07-31
  • nullptr
    老师好,我在生产环境遇到了一个gc时panic,不知道如何定位,老师有没有啥好的思路。这个是部分报错信息: runtime: pointer 0xc011207d40 to unused region of span span.base()=0xc0009a2000 span.limit=0xc0009aa000 span.state=1 runtime: found in object at *(0xc005cd6420+0x28) object=0xc005cd6420 s.base()=0xc005cd6000 s.limit=0xc005cd7fa0 s.spanclass=24 s.elemsize=176 s.state=mSpanInUse *(object+0) = 0x1010000000068 *(object+8) = 0xc011206de0 *(object+16) = 0x1a71b0e *(object+24) = 0x0 *(object+32) = 0x0 *(object+40) = 0xc011207d40 <== *(object+48) = 0x20d8220 *(object+56) = 0xc011206ef0 *(object+64) = 0x1a71ae2 *(object+72) = 0x0 *(object+80) = 0x0 *(object+88) = 0x0 *(object+96) = 0x0 *(object+104) = 0x0 *(object+112) = 0x0 *(object+120) = 0x0 *(object+128) = 0x0 *(object+136) = 0x0 *(object+144) = 0x0 *(object+152) = 0x0 *(object+160) = 0x0 *(object+168) = 0x0 fatal error: found bad pointer in Go heap (incorrect use of unsafe or cgo?) runtime stack: runtime.throw(0x2037360, 0x3e) /usr/local/go/src/runtime/panic.go:1112 +0x72 fp=0x7f427953ba28 sp=0x7f427953b9f8 pc=0x4460f2 runtime.badPointer(0x7f426b52ade0, 0xc011207d40, 0xc005cd6420, 0x28) /usr/local/go/src/runtime/mbitmap.go:380 +0x230 fp=0x7f427953ba70 sp=0x7f427953ba28 pc=0x426530 runtime.findObject(0xc011207d40, 0xc005cd6420, 0x28, 0x7f42a9710a78, 0xc000050e98, 0x2) /usr/local/go/src/runtime/mbitmap.go:416 +0x9b fp=0x7f427953baa8 sp=0x7f427953ba70 pc=0x4265db runtime.scanobject(0xc005cd6420, 0xc000050e98) /usr/local/go/src/runtime/mgcmark.go:1274 +0x235 fp=0x7f427953bb38 sp=0x7f427953baa8 pc=0x431675 runtime.gcDrainN(0xc000050e98, 0x10000, 0xc002ee1800) /usr/local/go/src/runtime/mgcmark.go:1126 +0x12d fp=0x7f427953bb68 sp=0x7f427953bb38 pc=0x4311bd runtime.gcAssistAlloc1(0xc002ee1800, 0x10000) /usr/local/go/src/runtime/mgcmark.go:531 +0xf3 fp=0x7f427953bbb8 sp=0x7f427953bb68 pc=0x42fc43 runtime.gcAssistAlloc.func1() /usr/local/go/src/runtime/mgcmark.go:442 +0x33 fp=0x7f427953bbd8 sp=0x7f

    作者回复: 关键在这一句:fatal error: found bad pointer in Go heap (incorrect use of unsafe or cgo?)

    2020-07-31
  • 至少看完了,可能因为一直都用的go中简单的"技能"吧,对于后边的一些技能感触不是太深,但至少心里有个大概印象了,等到工作中用上了在来翻看这些内容。这些知识的确不同于一般的go教程,所涉及到的每个技术点都很有深度,对提升go技能很有帮助,但初学者不建议看。
    2019-07-31
    9
  • 虢國技醬
    二刷理解更加深刻😊
    2019-08-24
    1
    3
  • 嘎嘎
    runtime/trace可以跟踪代码执行期间的每一个事件,“The trace contains events related to goroutine scheduling: a goroutine starts executing on a processor, a goroutine blocks on a synchronization primitive, a goroutine creates or unblocks another goroutine; network-related events: a goroutine blocks on network IO, a goroutine is unblocked on network IO; syscalls-related events: a goroutine enters into syscall, a goroutine returns from syscall; garbage-collector-related events: GC start/stop, concurrent sweep start/stop; and user events. Here and below by "processor" I mean a logical processor, unit of GOMAXPROCS. Each event contains event id, a precise timestamp, OS thread id, processor id, goroutine id, stack trace and other relevant information” -- https://docs.google.com/document/u/1/d/1FP5apqzBgr7ahCCgFO-yoVhk4YZrNIDNf9RybngBc14/pub
    2019-04-08
    3
  • Geek_4b9101
    老师,这种网上都有,我们这里能不能来点新的,比如 性能分析案例
    2022-04-17
    1
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部