go语言开发工具分享
2020-12-18 本文已影响0人
voidFan
一、google的go语言分析诊断工具
- centos先安装gops
- gops —— Go 程序诊断分析工具
二、go代码调试工具
三、Golang Tool pprof 性能分析工具
- 使用pprof有2种方式,一种是web网页,一种是go tool pprof命令行交互
goroutine - 所有goroutine的信息
heap - 堆内存的信息
allocs - a sampling of all past memory allocations
threadcreate - 线程信息
block - stack traces that led to blocking on synchronization primitives
mutex - 锁的信息
goroutine: 获取程序当前所有 goroutine 的堆栈信息。
heap: 包含每个 goroutine 分配大小,分配堆栈等。每分配 runtime.MemProfileRate(默认为512K) 个字节进行一次数据采样。
threadcreate: 获取导致创建 OS 线程的 goroutine 堆栈
block: 获取导致goroutine阻塞的堆栈(如 channel, mutex 等),使用前需要先调用 runtime.SetBlockProfileRate
mutex: 获取导致 mutex 争用的 goroutine 堆栈,使用前需要先调用 runtime.SetMutexProfileFraction
上面通过浏览器访问http服务的方式,需要有图形界面。而线上服务器通常是没有图形界面的,可以通过命令行方式来分析,或者将profile拷贝到本地,再生成调用关系图
import _ "net/http/pprof"
func main() {
......
go func() {
log.Println(http.ListenAndServe("localhost:8211", nil))
}()
......
}
- Go Tool PProf 命令行
go tool pprof http://localhost:8211/debug/pprof/goroutine
go tool pprof http://localhost:8211/debug/pprof/profile
go tool pprof http://localhost:8211/debug/pprof/heap
什么是内存泄露
- 内存泄露指的是程序运行过程中已不再使用的内存,没有被释放掉,导致这些内存无法被使用,直到程序结束这些内存才被释放的问题。
- Go虽然有GC来回收不再使用的堆内存,减轻了开发人员对内存的管理负担,但这并不意味着Go程序不再有内存泄露问题。在Go程序中,如果没有Go语言的编程思维,也不遵守良好的编程实践,就可能埋下隐患,造成内存泄露问题。
怎么发现内存泄露
- 在Go中发现内存泄露有2种方法,一个是通用的监控工具,另一个是go pprof:
- 监控工具:固定周期对进程的内存占用情况进行采样,数据可视化后,根据内存占用走势(持续上升),很容易发现是否发生内存泄露。
- go pprof:适合没有监控工具的情况,使用Go提供的pprof工具判断是否发生内存泄露。
四、golang代码级调优方法
- 提前预估size, make之临时的map,slice,可采用sync.pool.大于32kb,也可以使用sync.pool
- 不要滥用time.After, 多用事件通知
- 不要滥用goroutime, 减少gc压力
- 不要滥用锁,引起runtime上下文切换
- 使用unsafe进行转换类型,不要总是[]byte,string转换
- 减少使用reflect反射使用
- 减少不必要的defer调用
- 使用atomic实现无锁逻辑
五、业务调优
- 减少网络io的消耗:批量接口、缩减网络调用链
- 缓存内存化、减少同步逻辑、使用压缩,节省带宽。