首先,查看 docker 版本和 docker info 信息
版本还算比较新,查看 docker 日志:
日志中存在明显的异常堆栈打印,分析可知,启动过程中走到 Loading containers: start. 之后卡住,然后打印 fatal error: runtime: out of memory ,也就是内存爆了。根据堆栈信息,可以看出异常的调用路径如下:
拉取对应版本的代码,根据上述调用过程,找到指定的代码位置:
可以看出,这段是读取 boltdb 数据库(用于缓存网络配置),从之前了解看,这个数据库在异常断电时很容易损坏,所以怀疑是数据库损坏了,导致此处的遍历读取超出了预期的循环次数,而每次循环都会创建变量,分配内存,最终被内核 OOM 。
在 docker 社区查找相关 issue [1] [2],发现确实存在 boltdb 数据库损坏的现象,不过最终报错的现象不太一样。最后,在 docker 社区也提了个 issue [3],社区反馈也是怀疑 boltdb 数据库损坏,并建议可以把 local-kv.db 文件删除再重启来恢复。
个人觉得,上面报错的地方可以优化一下,对 db 文件做一次检查,如果检查到异常,提前抛异常,而不是不停地吃内存(由于异常的环境被破坏了,这个想法需要等复现后再考虑优化)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)