Json-Iterator 在 swagger 下卡死程序的排查

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

事件经过:

  1. 收到反馈测试环境某个服务打开 swagger ,进程会卡死
  2. 根据经验,初步判定是有死循环。
  3. 在本地启动该服务,打开 swagger ,发现 CPU 单核100%,确认有死循环
  4. pprof 抓取 cpu profile
cpu profile
  1. 在 marshal 前后打断点,对于特定链接,marshal 没结束(没看到 done 日志)
  2. 更换为官方 json 库,恢复正常。确认是 json-iterator 导致
image.png
  1. 在其他项目做同样操作,未能复现问题。对比jsoniter 版本,初步判定是版本过老导致。
  2. 通过 debug,确认是下面这个循环走不出来
  3. 升级 jsoniter ,恢复正常
image.png
  1. 到官方一看,这个bug 很早就解决了。但是出事的服务还在依赖 2017-8-9 的版本。(修复链接:https://github.com/json-iterator/go/commit/f7063353029dd177a959dbf6b29f48746441fbfa#diff-34ab17b5ece86461ae47905134a8d94c
image.png

回到初始问题,为什么有 for{} 进程会假死

原因在于 非抢占式调度+Full GC,导致 stw 停不下来。

暴露的问题

  • 对 Go 底层完全 hold 不住
  • 第三方包管理不规范

参考链接


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

本文来自:简书

感谢作者:xzing

查看原文:Json-Iterator 在 swagger 下卡死程序的排查

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

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