Java应用Docker化部署GC变长的采坑经历

作者简介

超哥,2008年毕业后进入IT行业,目前就职于饿了么物流架构部,曾就职于联想研究院的AR设备视觉团队和阿里巴巴的业务中台团队。 工作内容涉及大数据计算平台构建,计算视觉端应用,业务中间件研发以及业务领域模型抽象与实现等。 即时配送业务的高速增长,对系统的复杂度提出了更大的挑战,同时也给我们足够多的场景去尝试与征服。

开发同学反馈应用docker化部署之后,gc时间比KVM部署时涨了好几倍,最近正好手热,上机器撸了一把。

问题定位

通过gc日志收集工具,查看jvm的gc信息,平均单次ygc的时间非常不稳定,但基本上都在100ms以上。

Java应用Docker化部署GC变长的采坑经历

集群里随机挑了几台机器看了一下gc log,每次gc的堆大小都比较正常,但是时间不太科学。

Java应用Docker化部署GC变长的采坑经历

猜测是gc线程出了问题。jinfo查看了

Java应用Docker化部署GC变长的采坑经历

服务的docker容器分配了8核16g的资源,上面拉出来的gc线程和并发标记线程数是38和10,显然不科学(猜测拉的宿主机的核数)。

默认的gc线程和并发标记线程数计算公式如下:

Java应用Docker化部署GC变长的采坑经历

通过与运维同学沟通,了解到宿主机是56核,根据上面公式进行计算,对上了。

修改配置灰度验证

从集群中随机挑选几台机器进行灰度,修改下jvm启动参数,增加 -XX:ParallelGCThreads=8 (8是容器核数),设置了ParallelGCThreads之后CMS的并发标记线程数会同步下降。

Java应用Docker化部署GC变长的采坑经历

运行了一个晚上和一个白天,发现灰度机的ygc变的非常平稳,时间降到了 10ms左右,gc的log如下:

Java应用Docker化部署GC变长的采坑经历

原文 

https://juejin.im/post/5b63ff20e51d4519946020b1

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java应用Docker化部署GC变长的采坑经历

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址