1、背景
使用docker做的生产环境部署,log是打印的debug级别。最初是由于一次活动,访问量增加,导致的服务挂了。观察的服务器的情况,内存占用达到了100%,从而导致了服务不可用。
后续的过程中也出现过类似的问题,基本上是3-4天左右就会出现同样的问题,docker重启之后,问题就会得到解决,内存使用量会大幅度下降
2、调查分析过程
我们首先是分析了接口调用量和数据库的效率,整体上没有发现问题,数据库没有死锁,慢sql等问题,接口的调用量也远远达不到上限,而且这个接口的耗时也比较的低。
也就是从服务本身而言没有问题。但是实际表现上确实是内存100%。
由于后续固定周期就会出现问题,这么在这期间监控内存的变化,发现的问题是
(1)、实际的占用内存(常驻内存)其实很少,一直在持续增长的其实是缓存(buffer)
(2)、调用量增加的时候,相应的缓存的占用量增速也会变快
(3)、监控期间,缓存会有波动(也就是会有少许的释放),但是整体上是缓慢增长的状态
3、最终的原因
docker自身的问题,docker在进行大量的IO操作的时候,会使得page cahe飙升,导致linux系统一直未将日志文件的缓存flush到磁盘导致;
这里的大量IO操作其实就是日志的写入
4、解决办法
1、把日志级别降低,不要使用debug,使用error或者info。这样的可以让缓存的增长变慢
2、定时执行释放命令:echo 1 > /proc/sys/vm/drop_caches (推荐这个做法)
参考文章
My Process Used Minimal Memory, and My Docker Memory Usage Exploded