服务器内存告警
运维的一台线上数据库服务器,抛出内存过高的告警,上去看了下,大概是内存used显示满了总16G内存,used16G内存,其实大部分是在缓存cache中,也就是问题所在是cache缓存占用过高
解决办法
开始着手考虑,内存偏高先找出是哪些程序在占用cache,但是linux没有带这样的工具,废了九牛二虎之力在网上找到了hcache这个工具,这个是编译过可以直接用,这里贴上
wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
chmod +x hcache
mv hcache /usr/local/bin/
经过分析可以看出大部分都是在数据库使用,也不好动。
清空cache
大致步骤是先执行sync保存缓存数据,然后清空 #sync; echo 1 > /proc/sys/vm/drop_caches #释放 pagecache sync; echo 2 > /proc/sys/vm/drop_caches #释放 dentries 和 inodes: #sync; echo 3 > /proc/sys/vm/drop_caches #释放 pagecache,dentries 和 inodes: sync; echo 0 > /proc/sys/vm/drop_caches #默认0为不释放,让系统自己调节 发现作用比较小,隔一会缓存就上来了
限制cache
既然不能删除某些程序,就想了个办法,如何去限制这个cache,给free留点空间 网上找的办法有一下几种 1.ulimit(不管用) 2.cgroups(6.5系统不自带,安装不了) 3.sysctl,修改内核资源参数的,管用 执行sysctl -w vm.min_free_kbytes=2400000,这个是临时修改,永久生效的办法是写入/etc/sysctl.conf里 执行后发现确实有效
总结
经过这次事件 1.了解到linux的cache机制,会把大部分free里的内存拿出去,做高速缓存使用,例如使用了第一次find第二次find就会很快,内存有一个avaliable概念,就是free+buffers+cached就是可用的内存,cache里的内存是可以被强制征用的,不会影响实际使用 2.sysctl限制内核和一些内核调优参数对服务器影响比较有效
|