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

事件经过:

  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 不住
  • 第三方包管理不规范

参考链接

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容