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

rfyiamcool · · 3543 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言:

      最近要上线一个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也是可以看到提升的 。


有疑问加站长微信联系(非本文作者)

本文来自:峰云就她了

感谢作者:rfyiamcool

查看原文:通过火焰图排查golang json的性能问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3543 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传