当前位置: 首页 > 科技观察

曹大带我学习Go中的面向火焰图编程

时间:2023-03-17 22:20:59 科技观察

大家好,我是小X,曹大最近开了一个Go课程,小X跟曹大一起去。本系列将讨论从课程中学到的一些有启发性的东西,拨开乌云,带你回到Go。现实中,我听过各种面向XX的编程,比如面向过程的编程,面向对象的编程;还有一些好玩的,比如面向工资的编程,面向老板的编程;曹达之前也写过一篇文章,面向事故的编程。今天我们将讨论火焰图的编程。一般我们在做性能优化的时候,都会先做压测,然后进入pprof寻找可能的原因和解决方案。从服务的角度,关注的指标包括:请求数ErrorsLatency从用户的角度,就是:LatencyThroughput性能优化的最终目标是最大化系统吞吐量。对于Go服务,需要多看:每秒GC次数GCpauseduration(p99,max)GC占用的CPU大小HeapmemorysizeNumbercoroutinesNumberofapplicationsandreleasedmemorysize请求性能优化的对象数,我们可以在几个层面进行优化:业务层、应用层、底层。你在上层优化的越多,奖励就越高。举个简单的例子,由于历史原因,有些业务方在服务启动后,会周期性调用我们的接口获取一些数据。但是,业务变更后,获取到的数据并没有被使用,相应的代码也没有下线。而且因为对方的集群非常大,所以这次调用的量级也是相当大的。现在我们的服务容量即将达到顶峰,需要优化服务或者扩容。如果我们去压测、优化、扩容,大概就能解决问题。而且优化做得好,也能体现出自身的价值。但是平行世界还有一个解决方案,就是梳理一下业务端的使用场景。很有可能直接下载一半的流量,利润会大很多,操作也更容易。然而,通常我们可能没有那么幸运,我们还是要针对火焰图进行优化。火焰图的定义并不复杂:在Go中,pprofweb直接输入的图不好理解,应该看看火焰图。火焰图取决于宽度。宽度越宽,占用空间越大。不要怕它的高,要怕它的宽。曹大说如果你要黑围棋,一张图就够了:7在这里分享两个小点:pprof的火焰图中,当前柱的时间除以顶柱的时间得到一个某个函数的耗时比。将该块当前内存使用率乘以RSS,得到的值就是我们优化该块内存使用量所节省的内存量。火焰图中的台面值得优化。什么是平顶山,到底应该优化什么?总之,顶部很平的酒吧叫平顶山??。优化后,mesa变窄或消失:但是尖锐的不好优化:最后总结一下,火焰图的编程很简单:我们只需要优化mesa即可。现实中,可能是因为公司安全部门设置了重重障碍,我们无法轻易获取到profile文件,自然也就不能愉快的做性能优化了。基础设施部门要做的就是让火焰图尽可能方便的提供给研发。好了,今天就到这里吧~我是小X,下期见~