linux使用top查看buff/cache过高

查看

top
效果如下:
KiB Mem :  16000000 total,   4000000 free,  4000000 used,   8000000 buff/cache

发现,使用不高,但是可用很低,是因为 buff/cache 占用了很多。

原因

linux存取文件会导致内存被用光,即便是程序结束后也不会被正常释放,这就会导致buffers和cached占用过高。

total:是指计算机总物理内存
used:已用的内存
free:空余的内存
total = used + free总内存
shared:被多个进程共享的内存
buffers:用于存放要输出到disk(块存储)的数据,在这里buff是指被OS buffer住的内存
cached:存放从disk上读出的数据;buffer和cache是为了提高IO性能并由OS管理

解决方法

linux有先进的缓存机制,会针对dentry、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作用来提高读写效率。但是在进行了大量文件操作之后,缓存会把内存资源基本用光,虽然文件读取效率提高了,但是物理内存会逐渐被吃光。
服务进行了频繁的文件读写操作,但是为什么操作系统不会主动回收呢,是因为drop_caches的默认参数设置的就是不释放的。

drop_caches的值可以是0-3之间的数字,代表不同的含义:
0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

启动定时任务

crontab -e

如下定时任务:

0 3 * * * /usr/bin/sh /app/free_mem.sh

SH 文件

#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /app/logs/mem.log
date >> /app/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/logs/mem.log
if [ $free -le 6000 ] ; then
        sync && echo 1 > /proc/sys/vm/drop_caches
        sync && echo 2 > /proc/sys/vm/drop_caches
        sync && echo 3 > /proc/sys/vm/drop_caches
        used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
        free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
        echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/logs/mem.log
        echo "OK" >> /app/logs/mem.log
else
        echo "Not required" >> /app/logs/mem.log
fi
exit 1
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值