一、升级原因
- 在Docker 17.0.6版本中,由于docker hang死的bug,导致该物理机上的容器都有问题,以及hang 死后 unknow host 异常
- 减少任务分配不上资源的现象
基于以上两个问题,做了以下升级:Docker 版本升级 17.0.6 -> 18.0.3
二、升级中遇到的问题
- container 物理内存超 被kill 掉
- 连接异常
三、问题分析
- 内存问题
- 异常信息:'PHYSICAL' memory limit. Current usage: 7.1 GB of 7 GB physical memory used; 8.7 GB of 350 GB virtual memory used. Killing container.
- 首先排查的是堆内内存,打印堆内内存信息,发现并没有问题,其次,如果堆内内存超了,应用程序也会抓到 OOM jave heap space 异常信息。
- 排查堆外内存,调大堆外内存 为2G,运行正常
描述:
那么,问题来了,为什么没升级之前没问题,升级后反而有问题了呢。
认真想了下,这次docker 做的升级是为了解决docker hang 死的bug,那么,为什么docker 会被hang 死?顺着这问题不难想到,docker中跑的是我们的应用程序,那么,是不是我们的内存有问题而导致的呢?
结合升级后的异常信息,我们推测,是我们的容器内存用超,导致docker hang 死,新版本的docker 发现内存问题后kill 掉了 container。
那么为什么 堆外会用超呢?查了 JVM 8 的 内存模型发现,永久代 己经被 metaspace 代替,而metaspace 默认是没有做内存限制的,而之前做的 -XX:PermSize=128M -XX:MaxPermSize=1024M 都己经失效了,找到了跟本原因,下面的问题就好做了,我们调下 maxMetaSpace,如下:-XX:ReservedCodeCacheSize=128M -XX:MaxMetaspaceSize=1024M -XX:CompressedClassSpaceSize=256,问题解决。
- 连接异常问题
- 异常信息:Failed to connect to nn-? 或 Call From nm-? to IP:port failed on connection exception 异常
- 这个问题排查的时间还是比较长的,第一次升级后,有大部分容器都发生这异常信息,但是检查容器跟容器之间的网络的时候他是通的,这就很奇怪了,明明刚才不通,为什么又通了?排查多次还是同样的问题,为了不影响线上任务,又把docker 版本降回,建个生产的克隆环境重新测,可这次偏偏就没那问题了。所以又将线上做了下升级,这次,终于问题又来了,这次比较明确的,只有一个nm-?发生问题,其他容器都正常,而刚好这次连接的问题一直都在,终于发现是网卡的一个bug,docer 容器重启后问题好了。
描述:
为什么这个问题排了好几天?看的异常是网络连接问题,可是查的时候是没问题的。后来当有个容器网络问题比较严时发现,容器网络也不是一直不通,时通时不通,这才找到问题的原因所在。(ps:不过运维的同事还在继续跟进,说网络问题是好几个问题共同触发的,还有2 个bug 需要修复 )