前言:
最近要上线一个golang写的高频服务端,上线前理所当然要压测一把。 在压力源足够的情况下,发现golang服务的cpu相对有些高,怎么办? 直接上golang的神器pprof来排查问题, 通过pprof可以分析heap对象,协程的stack调用栈,当前的协程数,还可以构建火焰图等等。
排查问题
至于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也是可以看到提升的 。
有疑问加站长微信联系(非本文作者)