Linux手动释放缓存的方法

Linux释放内存的命令:
sync
echo 1 > /proc/sys/vm/drop_caches

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

释放完内存后改回去让系统重新自动分配内存。
echo 0 >/proc/sys/vm/drop_caches

free -m #看内存是否已经释放掉了。

如果我们需要释放所有缓存,就输入下面的命令:
echo 3 > /proc/sys/vm/drop_caches

######### Linux释放内存的相关知识 ###############

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空 间影响性能,例如当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。,此时就需 要执行释放内存(清理缓存)的操作了。

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分 缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉吗?所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是 释放缓存的操作了。/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改 /proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。要达到释 放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就 是不释放缓存。

一般复制了文件后,可用内存会变少,都被cached占用了,这是linux为了提高文件读取效率的做法:为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。"

释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

[root@fcbu.com ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7979       7897         82          0         30       3918
-/ buffers/cache:       3948       4031
Swap:         4996        438       4558

第一行用全局角度描述系统使用的内存状况:
total 内存总数
used 已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存
free 空闲的内存数
shared 多个进程共享的内存总额
buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached 缓存,用于已打开的文件

第二行描述应用程序的内存使用:
-buffers/cache 的内存数:used - buffers - cached
buffers/cache 的内存数:free buffers cached
前个值表示-buffers/cache 应用程序使用的内存大小,used减去缓存值
后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值

第三行表示swap的使用:
used 已使用
free 未使用

可用的内存=free memory buffers cached。

为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/ buffers/cache:       3948       4031 ,这才是系统可用的内存大小。

实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、应用获取不到可用内存、OOM错 误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可 能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存。

1、cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 .

Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。

Linux 内存管理做了很多精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache,目的就是为了提升磁盘IO的性能。从低速的块设备上读取数据会暂时保存在内存中,即使数据在当时已经不再需要了,但在应用程序下一次访问该数据时,它可以从内存中直接读取,从而绕开低速的块设备,从而提高系统的整体性能。而Linux会充分利用这些空闲的内存,设计思想是内存空闲还不如拿来多缓存一些数据,等下次程序再次访问这些数据速度就快了,而如果程序要使用内存而系统中内存又不足时,这时不是使用交换分区,而是快速回收部分缓存,将它们留给用户程序使用。

因此,可以看出,buffers/cached真是百益而无一害,真正的坏处可能让用户产生一种错觉——Linux耗内存!其实不然,Linux并没有吃掉你的内存,只要还未使用到交换分区,你的内存所剩无几时,你应该感到庆幸,因为Linux 缓存了大量的数据,也许下一次你就从中受益!

2、手动释放cached

To free pagecache:  echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:  echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:  echo 3 > /proc/sys/vm/drop_caches

当你在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.

先来说说free命令

[root@server ~]# free -m  
total used free shared buffers cached  
Mem: 249 163 86 0 10 94  
-/+ buffers/cache: 58 191  
Swap: 511 0 511

其中:

total 内存总数

used 已经使用的内存数

free 空闲的内存数

shared 多个进程共享的内存总额

buffers Buffer Cache和cached Page Cache 磁盘缓存的大小

-buffers/cache 的内存数:used - buffers - cached

+buffers/cache 的内存数:free + buffers + cached

可用的memory=free memory+buffers+cached

有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94

那么我们来看看,如果我执行复制文件,内存会发生什么变化.

[root@server ~]# cp -r /etc ~/test/  
[root@server ~]# free -m  
total used free shared buffers cached  
Mem: 249 244 4 0 8 174  
-/+ buffers/cache: 62 187  
Swap: 511 0 511

在命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法.

引用http://www.wujianrong.com/archives/2007/09/linux_free.html“为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。”

那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>?

[root@server test]# free -m  
total used free shared buffers cached  
Mem: 249 244 5 0 8 174  
-/+ buffers/cache: 61 188  
Swap: 511 0 511

MS没有任何变化,那么我能否手动释放掉这些内存呢?回答是可以的!

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下:

[root@server test]# cat /proc/sys/vm/drop_caches  
0  
首先,/proc/sys/vm/drop_caches的值,默认为0

[root@server test]# sync

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

  1. [root@server test]# echo 3 > /proc/sys/vm/drop_caches

  2. [root@server test]# cat /proc/sys/vm/drop_caches

  3. 3

  • 1
  • 2
  • 3

将/proc/sys/vm/drop_caches值设为3

  1. [root@server test]# free -m

  2. total used free shared buffers cached

  3. Mem: 249 66 182 0 0 11

  4. -/+ buffers/cache: 55 194

  5. Swap: 511 0 511

  • 1
  • 2
  • 3
  • 4
  • 5

再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了buffer和cache.

有关/proc/sys/vm/drop_caches的用法在下面进行了说明

  1. /proc/sys/vm/drop_caches (since Linux 2.6.16)

  2. Writing to this file causes the kernel to drop clean caches,

  3. dentries and inodes from memory, causing that memory to become

  4. free.

  5. To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to

  6. free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;

  7. to free pagecache, dentries and inodes, use echo 3 >

  8. /proc/sys/vm/drop_caches.

  9. Because this is a non-destructive operation and dirty objects

  10. are not freeable, the user should run sync(8) first

来源:https://blog.csdn.net/hellojoy/article/details/80760010

Linux cached过高问题相关推荐

  1. cached过高导致内存溢出 java head space

    最近公司线上遇到老是内存溢出检查后发现cached过高 命令:free -m 命令:sync    //将缓存写入硬盘 cat /etc/redhat-release 这个是查看系统版本的命令cent ...

  2. Linux 上的高可用中间件

    原文地址:http://www.ibm.com/developerworks/cn/linux/l-halinux/ Linux 上的高可用中间件,第 1 部分: heartbeat 与 Apache ...

  3. 专业的LaTeX: 在Linux下编写高质量的文档

    专业的LaTeX: 在Linux下编写高质量的文档 Linux下的OpenOffice.KWord等字处理软件虽然在功能上与Microsoft Word类似,但目前在易用性和可用性方面仍然存在许多不足 ...

  4. linux集群管理平台,基于Linux平台的高可用集群管理系统的研究与实现

    摘要: 集群管理系统的高可用性是指其能够连续地对外提供服务,本文针对集群系统的高可用性,以开源的集群搭建和管理软件KUSU为基础,以集群管理节点的双机热备份技术理论为支撑,以实现集群系统的帮障检测与业 ...

  5. linux测试dvi接口,支持Linux系统的高清DVI采集卡推荐

    支持Linux系统的高清DVI采集卡推荐 作者:同三维视频网 发表时间: 2019-05-17阅读:次 虽然现在的电脑系统大多已经是windows系统了,但不乏有一些Linux系统的电脑也需要采集它的 ...

  6. linux CPU 负载高问题分析方法

    linux CPU 负载高问题分析方法 文章目录 linux CPU 负载高问题分析方法 CPU 平均负载 平均负载含义 平均负载多少合理 平均负载与CPU使用率 如何分析平均负载过高问题 CPU 平 ...

  7. Linux:Nginx高并发之服务器最大TCP连接数及调优汇总(转载)

    Linux TCP连接数优化及调优 启动线程数: 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比.如果任务都是C ...

  8. 9基于linux百万级高并发框架Skynet-王桂林-专题视频课程

    <9>基于linux百万级高并发框架Skynet-830人已学习 课程介绍         全面介绍一款专门为游戏服务所打造的后台框架skynet,Actor模型的剖析与搭建,通用服务模块 ...

  9. linux服务器硬件如何选,linux服务器硬件要求高吗

    想知道服务器的配置需求是多少吗,高不高吗?下面是学习啦小编带来的关于linux服务器硬件要求高吗的内容,欢迎阅读! linux服务器硬件要求高吗? 不高 第一:安装lnmp(linux+nginx+m ...

最新文章

  1. 原创 | 初学者友好!最全算法学习资源汇总(附链接)
  2. C#语言实现的向导页设计
  3. 【Android 逆向】frida 框架安装 ( 设置 Python 3.7 版本 | 安装 frida 12.7.5 版本 | 安装 frida-tools 5.1.0 版本 )
  4. 树莓派ssh连接问题
  5. linux下启动solr命令,如何自动启动Solr?
  6. 如何通过控制台访问openstack实例_如何通过seo提高网站设计的访问量
  7. Machine Learning - week 4 - Non-linear Hypotheses
  8. 用几何画板求曲线弧长的方法
  9. 金融+大数据解决方案:银行业
  10. 接口测试神奇APIPOST
  11. 苹果电脑如何设置自定义模糊拼音操作?
  12. 云授权系统服务器系统连接失败,金蝶云授权码连接不到服务器
  13. XMind:超越FreeMind的思维导图软件
  14. 推流(RTSP/RTMP)
  15. java 统计文本中出现概率最高的10个字符串!!
  16. 图表背后的秘密 | 技术指标讲解:ATR指标
  17. 安装activemq或者tomcat等启动时报错
  18. 哈希函数——SHA1
  19. 读书笔记-干法-为目标全力以赴
  20. 用户之声 | GBASE南大通用实训有感

热门文章

  1. 经典C语言程序100例之九六
  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)
  3. 1QPushButton的使用,QLineEdit的使用,设置组件位置,布局(QHBoxLayout,QGridLayout)
  4. Samba的简介和配置
  5. Java.util.Date类型的转化成为数据库中的Date类型。
  6. rabittmq java spring_消息队列 RabbitMQ 与 Spring 整合使用的实例代码
  7. 牛客网数组排序NC140
  8. 链表中位数(Middle of the Linked List)
  9. 20155222卢梓杰 实验四 恶意代码分析
  10. FFmpeg AVCodecContext结构体debug变量剖析