内存buff/cache占用过大

在使用阿里云k8s集群的过程中,由于应用对于free内存的容量要求较高,设置了阈值较低的mem告警策略

收到告警mem free不足,登录主机top发现16g内存,10g左右均为buff/cache,

通过查找资料,整理出简单的总结:

原因:buff为写文件缓存,cache为读文件缓存,linux在缓存使用后并不会马上释放,而是用来缓存其他信息提高io效率,所以有过大文件读写操作就会造成buff/cache 变高

手动清理cache方法:

#将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件,确保文件系统的完整性
sync

#执行清理内存指令
#0:不释放(系统默认值)
#1:释放页缓存
#2:释放dentries和inodes
#3:释放所有缓存
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

释放后free -m查看内存占用情况cache明显减少

#恢复内存清理策略为不清理
echo 0 > /proc/sys/vm/drop_caches

在恢复内存清理策略的过程中报错:echo: write error: invalid argument(ubuntu 16.04) ,也不支持vim修改, 尝试重启主机后,drop_caches值自动恢复为0,不过在重启主机的过程中,free发现cache又不断增加,没有解决,

定位占用cache的文件:(使用开源工具pcstat ,centos需要yum install lsof)

安装pcstat:

#安装高版本go(ubuntu16.04 apt-get默认安装1.6版本,编译会报错)
#卸载1.6 golang
sudo apt-get remove golang-go
#下载1.10版本golang
wget https://dl.google.com/go/go1.10.linux-amd64.tar.gz
#解压
sudo tar zxvf go1.10.linux-amd64.tar.gz -C /usr/local
#追加环境变量
vim ~/.bashrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/gocode
export PATH=$PATH:$GOPATH:/usr/local/go/bin
source ~/.bashrc
#查看go版本
go version
#新建gopath,下载pcstat
mkdir $HOME/gocode
go get github.com/golang/sys
mv $HOME/gocode/src/github.com/golang/sys $HOME/gocode/src/golang.org/x/sys
go get github.com/tobert/pcstat
#编译pcstat,生成可执行文件pcstat
cd $HOME/gocode/src/github.com/tobert/pcstat/pcstat
go build

编辑统计脚本:pcstat的路径为$HOME/gocode/src/github.com/tobert/pcstat/pcstat/pcstat,根据实际情况修改,

统计mem占用前10的process使用的文件,根据实际情况修改数量

#!/bin/bash
#you have to install pcstat
if [ ! -f /root/gocode/src/github.com/tobert/pcstat/pcstat/pcstat ]
then
    echo "You haven't installed pcstat yet"
    echo "run \"go get github.com/tobert/pcstat\" to install"
    exit
fi
#find the top 10 processs' cache file
ps -e -o pid,rss|sort -nk2 -r|head -20 |awk '{print $1}'>/tmp/cache.pids
#find all the processs' cache file
#ps -e -o pid>/tmp/cache.pids
if [ -f /tmp/cache.files ]
then
    echo "the cache.files is exist, removing now "
    rm -f /tmp/cache.files
fi
while read line
do
    lsof -p $line 2>/dev/null|awk '{print $9}' >>/tmp/cache.files
done>/tmp/cache.pcstat
    fi
done
/root/gocode/src/github.com/tobert/pcstat/pcstat/pcstat  `cat /tmp/cache.pcstat`
rm -f /tmp/cache.{pids,files,pcstat}

统计结果可以倒入excel进行计算统计

mem的详细解释可以参考文章:

https://linux.cn/article-7310-1.html

kernel 参数:

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

你可能感兴趣的:(内存buff/cache占用过大)