通过火焰图排查golang json的性能问题

前言:

      最近要上线一个golang写的高频服务端,上线前理所当然要压测一把。 在压力源足够的情况下,发现golang服务的cpu相对有些高,怎么办? 直接上golang的神器pprof来排查问题, 通过pprof可以分析heap对象,协程的stack调用栈,当前的协程数,还可以构建火焰图等等。

该文章后续仍在不断更新中, 请移步到原文地址 http://xiaorui.cc/?p=5108

排查问题

至于pprof怎么用,我就不说了。 因为太简单没啥好说的,直接import,然后run起来就完事了。听说,1.10版开启pprof会更加的简单。  接着我们再通过go-torch和FlameGraph是可以构建火焰图的。 具体安装生成火焰图的步骤,自己google。 需要注意的是,go-torch 依赖 FlameGraph perl脚本的, FlameGraph要放在PATH里。


下面是生成的火焰图,通过横向的消耗,可以得知golang标准库encoding/json相对消耗资源,但问题是 golang json性能低下是很多gopher都知道的事情,我项目初期的时候,就已经用滴滴出行平台技术部开源的json-iterator .  但为什么还有这么多的encoding/json的消耗 ?

通过排查得知,我这边使用golang gin web框架做对外的任务的投递跟接收, 在gin的readme里找到了通过build tag的方法来替换json库。但并不好用…    我这边不只gin需要json的替换,req 和 logurs都需要替换json.

gin和logrus替换json的方法

我这边有两种解决方法:

第一种,单纯的使用 gin的response对象,至于序列化方面我们自己来解决。 logrus是支持json format,我们可以通过自己构建json format来解决。

第二种,使用monkey的方法,把gin的json逻辑替换成我们自己封装的。

替换json模块后,cpu火焰图表现好了几个百分点。另外通过wrk压测qps也是可以看到提升的 。

END.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc