背景描述:
观察发现,有台MYSQL机器每天凌晨0:00-5:00间,SWAP都会增长(如图所示);虽然每天增长的不多,但日积月累,会逐步造成SWAP负载满的情况,从而引发OOM风险;所以要查明该原因;
经查,0:00-5:00之间,内存抖动比较厉害,表明此间进行了SWAP OUT,导致内存增长;(下图是内存使用率,未算上cache)
内存使用率(包含cache)
早上5:00前通过SWAP OUT 部分内存至SWAP,降低内存使用率,SWAP增大;白天的时候是正常使用CACHE;SWAP没有增长;而如果算上cache的话,内存使用率其实并不高;只有50%不到,在这种情况下缺用了2G多的SWAP,从历史数据看,基本每天增长50-200M的SWAP使用;
查看慢查询日志,可以到每天凌晨0:40--4:50之间进行了对200个库进行统计,进行了创建大临时表操作,与研发沟通也确认每天凌晨会统计前一天的数据;但研发也确实需要改统计,那么如何解决这个问题;
理论上,该操作需要内存,但DB的内存都在cache中,db应该调用内核去清理脏页,空闲出的空间来做该计算 用;但实际上DB找内存,没有内存后进行了SWAP OUT,导致SWAP增长;
给出2个建议:
1,echo 1 > /proc/sys/vm/drop_caches 清空page cache(page cache也被作为其它文件类型的缓存设备来用);通过这样手动释放cache,而后凌晨的计划计算任务就可以拥有内存来进行计算;
2, swapniess当前是10,将其修改为1(不要改为0,否则会造成swap还有很多,却发生OOM风险)
经测试:
第一个方法不适用,因为系统在无时无刻地进行写操作,刚释放的资源会被立马使用,导致物理内存资源瞬间地回升的现象;SWAP还是正常地上升;
采用方法二,修改swapniess,观察发现SWAP没有继续增长了;
观察了几天,问题已解决;