前言:

      最近要上线一个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.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

Golang使用pprof监控性能及GC调优

这两天用golang在写一个监控的agent,发现长时间运行后会有内存泄露的情况,着实让人郁闷半天… 要解决golang泄露的问题,要理解goalng gc那是事情,...

阅读全文

评论已关闭。