linux buff/cache过大,清理脚本

2018年06月20日 13:44:53 taozhe666 阅读数:6500

三条指令:

sync

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

执行完这三条指令后通过free -m命令查看,free可用内存马上增多,buff/cache列值变小,说明内存被释放了,但是不能总是手动的执行这三条指令,所以最后写了一个shell脚本,开启Linux定时任务crond,每天早上检查一次free内存,当小于4G时执行这三条命令(注:系统内容20G)。

注意:在执行这三条命令之前一定要先执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件)

解决方案(手动)

1. 修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档):

[plain] view plain copy
  1. Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
  2. To free pagecache:
  3. * echo 1 > /proc/sys/vm/drop_caches
  4. To free dentries and inodes:
  5. * echo 2 > /proc/sys/vm/drop_caches
  6. To free pagecache, dentries and inodes:
  7. * echo 3 > /proc/sys/vm/drop_caches
  8. As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.
  9. This tunable was added in 2.6.16.

注意:在执行这三条命令前先执行sync命令

解决方案(自动)

1、编写shell定时任务脚本freemem.sh

[plain] view plain copy
  1. #! /bin/sh
  2. used=`free -m | awk 'NR==2' | awk '{print $3}'`
  3. free=`free -m | awk 'NR==2' | awk '{print $4}'`
  4. echo "===========================" >> /app/memory/logs/mem.log
  5. date >> /app/memory/logs/mem.log
  6. echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log
  7. if [ $free -le 4000 ] ; then
  8. sync && echo 1 > /proc/sys/vm/drop_caches
  9. sync && echo 2 > /proc/sys/vm/drop_caches
  10. sync && echo 3 > /proc/sys/vm/drop_caches
  11. used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
  12. free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
  13. echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log
  14. echo "OK" >> /app/memory/logs/mem.log
  15. else
  16. echo "Not required" >> /app/memory/logs/mem.log
  17. fi
  18. exit 1

2、使用crontab -e命令编辑当前用户的crontab

[plain] view plain copy
  1. 0 6 * * * /usr/local/tomcat/sztFileFront/bin/freemem.sh

定时任务编写参考:http://www.jb51.net/article/15008.htm

3、重启crond服务

[plain] view plain copy
  1. /sbin/service crond restart

4、查看crond服务是否重启成功

[plain] view plain copy
  1. /sbin/service crond status

最后,问题解决。我设定的定时任务是每天早上6点执行一次freemem.sh脚本。

Linux中Cache内存占用过高解决办法

在Linux系统中,我们经常用free命令来查看系统内存的使用状态。在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态:

这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大。这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次:

  1. 不了解。这样的人的第一反应是:天啊,内存用了好多,70个多G,可是我几乎没有运行什么大程序啊?为什么会这样?Linux好占内存!

  2. 自以为很了解。这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了17G左右,还有很多剩余内存可用。buffers/cache占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。

  3. 真的很了解。这种人的反应反而让人感觉最不懂Linux,他们的反应是:free显示的是这样,好吧我知道了。神马?你问我这些内存够不够,我当然不知道啦!我特么怎么知道你程序怎么写的?

根据目前网络上技术文档的内容,我相信绝大多数了解一点Linux的人应该处在第二种层次。大家普遍认为,buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?在论证这个题目之前,我们先简要介绍一下buffers和cached是什么意思:

什么是buffer/cache?

buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

什么是page cache?

Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

什么是buffer cache

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

如何回收cache?

Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

优化后截图如下:

学好计算机,走遍天下都不怕

转载于:https://www.cnblogs.com/vana/p/10981366.html

linux 系统的 cache 过大,解决方案相关推荐

  1. 使用虚拟机安装Linux系统常见的错误以及解决方案

    使用虚拟机安装Linux系统常见的错误以及解决方案 参考文章: (1)使用虚拟机安装Linux系统常见的错误以及解决方案 (2)https://www.cnblogs.com/yanjiexiansh ...

  2. linux如何找大文件夹,Linux系统中如何查找大文件或目录文件夹的方法

    Linux系统中如何查找大文件或文件夹的方法 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整 ...

  3. Linux系统中如何查找大文件或目录文件夹的方法

    Linux系统中如何查找大文件或文件夹的方法 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整 ...

  4. Linux系统运维九大技能及知识总结,90%日常运维

    Linux 系统运维九大技能及知识总结,搞定 90% 日常运维 | 周末送资料 以下内容包括RedHat和CentOS运维工作中常用的几大技能,并总结了系统运维中网络方面的规划.操作及故障处理等知识. ...

  5. linux系统最大支持多大硬盘容量,LINUX操作系统对硬件支持有上限么?最大多少内存?多大硬盘容量?...

    32位的Linux的内存最大支持到4GB,64位的Linux的最大支持内存在TB级别上. (实际上最大支持多大的内容跟操作系统的种类无关,而是跟操作系统是几位的.还有CPU是几位的有关.) DOS是1 ...

  6. linux系统中cache清理/释放命令

    本文参考博客:<(Linux)释放系统缓存操作> 目录 前言 1.清缓存前同步 2.Linux释放内存 3.查看内存 前言 在Linux系统中有先进的缓存机制,会针对dentry(用于VF ...

  7. 关于Linux系统重启过慢问题解决方案

    文章目录 1.关于网络时钟同步 2.关于rng-tools 3.如何关闭两项服务 3.1.关闭网络时钟同步服务 3.2.关闭rng-tools 1.关于网络时钟同步 systemd 提供了 syste ...

  8. U盘显示打开设备和打印机--Linux系统(Ubuntu18.04)解决方案

    1.插入U盘 2.使用 fdsik -l 查看U盘挂在的区域(eg:/dev/sda),或者使用lsblk命令使用fsck移除U盘中的坏块确定好 U 盘,该命令可以列出当前 Linux 系统上连接的所 ...

  9. 用linux系统做数字钟,大强学易之易语言实例:简单的易语言桌面电子时钟

    本期要点 学习时钟周期事件的使用,熟悉窗口.标签的属性,了解时间与文本的相关操作.(微信搜索"大强小屋",ID:daqiangstudio,感谢关注支持) 请关注微信公众号[大强小 ...

最新文章

  1. linux基础命令介绍十四:定时任务
  2. java dbcp_Java dbcp连接池基本使用方法详解
  3. 5.1.4 IO软件层次结构
  4. java导出excel 科学计数法_基于Java将Excel科学计数法解析成数字
  5. Android SDCard UnMounted 流程分析(三)
  6. 代码规范七大原则_设计模式的七大原则详解||上篇
  7. ESL系统的Docker化部署
  8. 图像识别---opencv安装
  9. 大屏导航Linux系统下载,掌讯方案MTK3561大屏导航ROOT固件
  10. 中兴通讯携MF30打造高速无线网络
  11. linux root邮箱地址,Linux中自动送给root的mail可以发给互联网上的emai? 爱问知识人...
  12. 【论文精读】:Global Matching with Overlapping Attention for Optical Flow Estimation
  13. 百度账号更换绑定的手机号
  14. 无中介租房搜房工具 V1.0
  15. ccf b类论文相当于sci几区_你写SCI论文是否也经历了这三个阶段?
  16. mac 请尝试使用字符较少,或不含标点符号的名称
  17. char *str1 和 char str2[]的详解
  18. simc模拟器找不到服务器,魔兽世界simc模拟器怎么用?Simc模拟器使用方法及代码介绍...
  19. Mac.zsh- no matches found- httpx[http2]
  20. 安装gitlab的rpm包时提示错误:依赖检测失败

热门文章

  1. 如何从github上下载完成代码到pycharm中
  2. 信息追溯系统为气瓶上“身份码”,守护居民的用气安全
  3. AERONET_AOD2.0级数据站点中国分布
  4. VMware 安装 银河麒麟高级服务器操作系统 V10 + QT 开发环境搭建
  5. 字节跳动抖音研发---测试开发三面---面经(附答案)【接口/自动化/web】测试面试题
  6. 服务器证书签发工具程序
  7. Android 12.0 Settings 去掉打开开发者模式和USB调试模式的广播
  8. kafka的工作流程
  9. 千峰JavaDay32课后作业
  10. 网页浏览加速器 v2008.00 bt