排查Docker容器内存占用问题记录

情况说明

前段时间,服务器总是莫名宕机,部署在上面一些站点当然也就不行了。然后我就去后台看了一下,发现应该是内存占用过高引起的:

一开始也没太当回事,因为每次宕机一般间隔几天,想着宕机以后去重启一下就好了。于是就先安了一个监控,监控部署在上面的站点,一旦站点无法访问,就会通知我去重启,问题暂时从表面解决了。
但是接下来几天,情况愈演愈烈,一天就要宕机好几次。博客上的一些图片也是放在上面的,影响了博客的加载速度,没办法了,只好着手解决。
查看了上一周的使用状况:

初步判断应该是Docker容器占用了太多的内存,主要服务器上也就部署了几个容器,第一时间想到的肯定是容器的锅,结果也确实是。

排查过程

部署在服务器上的项目:兰空图床、Picsur图床、一个支持端到端连接的聊天工具、Nginx Proxy Manager和长亭雷池。

  • 首先排除一下磁盘占用的问题
    挂载的磁盘占用还是非常健康的,可以暂时排除这个原因。
  • 观察CPU和内存资源
    发现内存占用很高。尝试清除缓存:
    1
    2
    3
    4
    5
    6
    7
    8
    To free pagecache:仅清除页面缓存(PageCache)
    echo 1 > /proc/sys/vm/drop_caches

    To free dentries and inodes:清除目录项和inode
    echo 2 > /proc/sys/vm/drop_caches

    To free pagecache, dentries and inodes:清除页面缓存,目录项和inode
    echo 3 > /proc/sys/vm/drop_caches
    发现内存使用还是居高不下,问题多半是出在docker容器上了。
  • 应该不会是内存泄露的问题,当然也应该不会是日志文件的大量读写,因为内存占用并没有一直膨胀,io使用率也是正常的。
  • 使用docker stop $(docker ps -a -q)命令结束所有容器
  • 逐个开启容器,然后使用docker stats查看资源占用情况
    最后发现长亭雷池兰空图床的占用过高,一般有下面的解决方式:
  1. 限制容器的内存占用
  2. 开辟swap交换空间
  3. 关闭部分高占用容器(简单粗暴)
    开始的两种方式好像并不能无脑使用,需要结合自身使用情况进行合理的配置。

最终解决方式

其实我挺纳闷的,我明明已经早早地设置了交换空间,为什么还会出现这种情况呢?感觉还存在知识盲区吧,一开始部署的时候其实就考虑了内存占用的问题,并提前设置了两倍内存的交换空间,但是内存占用过高的问题还是出现了。

至于设置了交换空间,却没有起到显著的效果,还需要研究一下,有可能很复杂,也有可能很简单……

最后,还是把兰空图床给停用了,并限制了雷池的内存占用,观察了几天,发现没有再出现之前的问题了,是能说暂时安全了,可能这台服务器经不起这样造(doge)。

关于Docker内存限制管理,网上有不少优秀案例,推荐一篇: