高质量编程与性能调优实战 | 青训营

76 阅读2分钟

高质量编程与性能调优实战

pprof 实战

pprof主要训练我们使用高效的调试工具测试项目,修改错误,,优化项目性能.

结果分析

我们按照安装步骤将项目部署到golang的集成环境中.,发现这是一些无用的显示结果,并且内存消耗达到2G.接下来,我将具体寻找程序消耗内存的原因. image.png
控制台结果显示 image.png image.png

性能调优

  • 调优一 首先我们输入 ``` 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%的内存存储数据.

image.png

  • 调优三 我们在下图可以发现共有14条协程. image.png
    接着使用pprof中的goroutine打开发现是github.com/wolfogre/go-pprof-practice/animal/canidae/wolf.(*Wolf).Drink.func1 一直在创建该协程.在程序中Drink函数每次循环十次,意味着会创建十个协程并不断使用休眠函数停留三十秒,这样导致大量的协程泄露并堵塞,增加了内存占用率.

image.png
最后,我们将循环块注释,发现协程数量骤降.结果如下图所示.

image.png

  • 调优四
    我们发现最后内存降低了,但程序运行速度很慢,我猜测是不是程序中存在协程竞争导致排他锁的反复使用.
    我们使用 go tool pprof http://localhost:6060/debug/pprof/mutex 工具查询发现 github.com/wolfogre/go-pprof-practice/animal/canidae/wolf.(*Wolf).Howl.func1 该函数反复使用了排他锁.使用同样的方法,我打算注释掉

image.png
结果发现锁问题已经被清理掉.

image.png

  • 调优五 根据下图我们发现进程中存在两个堵塞,并且堵塞代码端位于github.com/wolfogre/go-pprof-practice/animal/felidae/cat.(*Cat).Live 函数中,从该函数中我们可以看出该进程的作用是输入,但在数据输出时故意堵塞了一秒钟.而这种堵塞持续发生了两次.
    同样将代码注释掉后我们发现堵塞问题被解决 image.png
    堵塞情况: github.com/wolfogre/go-pprof-practice/animal/felidae/cat.(*Cat).Pee 该方法造成堵塞 image.png

总结

我们发现影响程序性能的因素有许多,例如,多协程竞争加锁,堵塞,内存过剩,gc调用次数过多,但最终都是由于人为设计原因.有时我们设计了过多的循环块,多次使用变量,多次回收数据,并发处理进程,这样都会无形增加处理器的速率.