高质量编程与性能调优实战
pprof 实战
pprof主要训练我们使用高效的调试工具测试项目,修改错误,,优化项目性能.
结果分析
我们按照安装步骤将项目部署到golang的集成环境中.,发现这是一些无用的显示结果,并且内存消耗达到2G.接下来,我将具体寻找程序消耗内存的原因.
控制台结果显示
性能调优
- 调优一 首先我们输入 ``` go tool pprof http://localhost:6060/debug/pprof/heap 调试工具,输入top
- 调优二
我们在这里主要进行GC垃圾回收机制分析.我们发现github.com/wolfogre/go-pprof-practice/animal/canidae/dog.(*Dog).Run (inline)
函数调用了94.12%的内存存储数据.
- 调优三
我们在下图可以发现共有14条协程.
接着使用pprof中的goroutine打开发现是github.com/wolfogre/go-pprof-practice/animal/canidae/wolf.(*Wolf).Drink.func1 一直在创建该协程.在程序中Drink函数每次循环十次,意味着会创建十个协程并不断使用休眠函数停留三十秒,这样导致大量的协程泄露并堵塞,增加了内存占用率.
最后,我们将循环块注释,发现协程数量骤降.结果如下图所示.
- 调优四
我们发现最后内存降低了,但程序运行速度很慢,我猜测是不是程序中存在协程竞争导致排他锁的反复使用.
我们使用 go tool pprof http://localhost:6060/debug/pprof/mutex 工具查询发现 github.com/wolfogre/go-pprof-practice/animal/canidae/wolf.(*Wolf).Howl.func1 该函数反复使用了排他锁.使用同样的方法,我打算注释掉
结果发现锁问题已经被清理掉.
- 调优五
根据下图我们发现进程中存在两个堵塞,并且堵塞代码端位于github.com/wolfogre/go-pprof-practice/animal/felidae/cat.(*Cat).Live
函数中,从该函数中我们可以看出该进程的作用是输入,但在数据输出时故意堵塞了一秒钟.而这种堵塞持续发生了两次.
同样将代码注释掉后我们发现堵塞问题被解决
堵塞情况: github.com/wolfogre/go-pprof-practice/animal/felidae/cat.(*Cat).Pee 该方法造成堵塞
总结
我们发现影响程序性能的因素有许多,例如,多协程竞争加锁,堵塞,内存过剩,gc调用次数过多,但最终都是由于人为设计原因.有时我们设计了过多的循环块,多次使用变量,多次回收数据,并发处理进程,这样都会无形增加处理器的速率.