手工释放linux内存——/proc/sys/vm/drop_caches

--手工释放linux内存——/proc/sys/vm/drop_caches

总有很多朋友对于Linux的内存管理有疑问,之前一篇日志似乎也没能清除大家的疑虑。而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下。最后,还附上我对这方法的意见,欢迎各位一同讨论。
   
当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching。这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法。那么我来谈谈这个问题。

一、通常情况 先来说说free命令:
引用[[email protected] ~]# 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为86MB,buffer和cached分别为10MB,94MB。
那么我们来看看,如果我执行复制文件,内存会发生什么变化. 引用[[email protected] ~]# cp -r /etc ~/test/ [[email protected]
~]# 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吃掉了。别紧张,这是为了提高文件读取效率的做法。
为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer
Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了
I/O系统调用(比如read,write,getdents)的时间。
那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?
引用[[email protected] test]# free -m total used free shared buffers cached Mem: 249 244
5 0 8 174 -/+ buffers/cache: 61 188 Swap: 511 0 511
似乎没有任何变化。(实际情况下,内存的管理还与Swap有关)
那么我能否手动释放掉这些内存呢?回答是可以的!
二、手动释放缓存
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:
引用[[email protected] test]# cat /proc/sys/vm/drop_caches 0
首先,/proc/sys/vm/drop_caches的值,默认为0。 引用[[email protected] test]# sync
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync
命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件) 引用[[email protected] test]# echo 3
> /proc/sys/vm/drop_caches [[email protected] test]# cat /proc/sys/vm/drop_caches 3
将/proc/sys/vm/drop_caches值设为3 引用[[email protected] test]# free -m total used free
shared buffers cached Mem: 249 66 182 0 0 11 -/+ buffers/cache: 55 194 Swap: 511
0 511
再来运行free命令,会发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB。那么有效的释放了buffer和cache。
◎ 有关/proc/sys/vm/drop_caches的用法在下面进行了说明
引用/proc/sys/vm/drop_caches (since Linux 2.6.16) Writing to this file causes the
kernel to drop clean caches, dentries and inodes from memory, causing that
memory to become free.
To free
pagecache, use echo 1 > /proc/sys/vm/drop_caches; to free dentries and
inodes, use echo 2 > /proc/sys/vm/drop_caches; to free pagecache, dentries
and inodes, use echo 3 > /proc/sys/vm/drop_caches.
Because
this is a non-destructive operation and dirty objects are not freeable, the user
should run sync first. 三、我的意见
上述文章就长期以来很多用户对Linux内存管理方面的疑问,给出了一个比较“直观”的回复,我更觉得有点像是核心开发小组的妥协。
对于是否需要使用这个值,或向用户提及这个值,我是有保留意见的:
引用1、从man可以看到,这值从2.6.16以后的核心版本才提供,也就是老版的操作系统,如红旗DC 5.0、RHEL 4.x之前的版本都没有;
2、若对于系统内存是否够用的观察,我还是原意去看swap的使用率和si/so两个值的大小; 用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值: 引用-/+
buffers/cache: 58 191 这才是系统可用的内存大小。
实际项目中告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断的,但free上面反而比较难查看。
相反,如果在这个时候,我们告诉用户,修改系统的一个值,“可以”释放内存,free就大了。用户会怎么想?不会觉得操作系统“有问题”吗?
所以说,我觉得既然核心是可以快速清空buffer或cache,也不难做到(这从上面的操作中可以明显看到),但核心并没有这样做(默认值是0),我们就不应该随便去改变它。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。
当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
   
我觉得,排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。(可惜,这样的应用通常都是运行在老的操作系统版本上,上面的操作也解决不了)。O(∩_∩)O哈哈~

转自于

我自己的测试

[[email protected] ~]# uname -a Linux testserver
2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]# free -m
             
total       
used       
free      shared    
buffers      cached
Mem:          
2013       
1661        
352          
0        
223        1206 -/+
buffers/cache:        
231        1782
Swap:         
2047          
0        2047 [[email protected] ~]# sync
[[email protected] ~]# sync [[email protected] ~]# cat /proc/sys/vm/drop_caches 0
[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches [[email protected] ~]#
cat /proc/sys/vm/drop_caches      3 [[email protected]
~]# free -m
             
total       
used       
free      shared    
buffers      cached
Mem:          
2013        
100       
1913          
0          
0          14 -/+
buffers/cache:         
85        1927
Swap:         
2047          
0        2047 [[email protected] ~]#
测试成功

时间: 2024-11-06 16:17:33

手工释放linux内存——/proc/sys/vm/drop_caches的相关文章

[转]手工释放linux内存——/proc/sys/vm/drop_caches

另一篇:http://www.linuxfly.org/post/320/ ? 1.清理前内存使用情况?free -m 2.开始清理??echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况?free -m 4.完成! 查看内存条数命令: dmidecode?|?grep?-A16?"Memory?Device$" ? ? ? ? ? +++++++++++++++++++++++++++++++++++++++++++++++++++++++

手工释放linux内存

当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.一.通常情况先来说说free命令:引用[[email protected] ~]# free -m         total used free shared buffers cachedMem: 249 163     86      0        10           94-/+ b

/proc/sys/vm/drop_caches 清理缓存

1. 使用方法 /proc/sys/vm/drop_caches默认是0 # echo 1 > /proc/sys/vm/drop_caches; free pagecache, use# echo 2 > /proc/sys/vm/drop_caches; free dentries and inodes# echo 3 > /proc/sys/vm/drop_caches; free pagecache, dentries and inodes 注意:使用之前需要先sync,将缓存刷

手动释放linux内存cache

转载于:http://linux.cn/article-211-1.html 总有很多朋友对于Linux的内存管理有疑问,之前一篇linux下的内存管理方式似乎也没能清除大家的疑虑. 而在新版核心中,似乎对这个问题提供了新的解决方法,特转出来给大家参考一下.最后,还附上我对 这方法的意见,欢迎各位一同讨论. 当在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放, 而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法. 那么我

如何手动释放linux内存?

在生产过程中,一些java模块会比较残忍的吃系统内存,然后如果这个模块写的比较挫,产生的垃圾就会比较多,如果linux系统的内存释放也不会及时,然后恶性循环,最后就把进程卡死,但是服务器是不可以down机的,所以这个时候就需要我们运维出来,手动的释放内存. 首先,我们登陆一台服务器,#free -m看一下目前的情况: 然后#cat /proc/sys/vm/drop_caches,会看到里面的值是0,0是不释放的意思. #sync,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node.已延

手动释放linux内存和缓存

/proc/sys/vm/drop_caches (since Linux 2.6.16)Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; tofree dentries and

linux /proc/sys/vm/中各个文件含义

1)      /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作. 缺省设置:0,禁用Block Debug模式2)      /proc/sys/vm/dirty_background_ratio该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘. 缺省设置:103)      /proc/sys/vm/dirty_expire_centisecs该文件表示如果脏数据

/proc/sys/vm/参数

1) /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作. 缺省设置:0,禁用Block Debug模式2) /proc/sys/vm/dirty_background_ratio该文件表示脏数据到达系统整体内存的百分比,此时触发pdflush进程把脏数据写回磁盘. 缺省设置:103) /proc/sys/vm/dirty_expire_centisecs该文件表示如果脏数据在内存中驻留时间超过该值,pd

Linux内存机制以及手动释放swap和内存

哇,感觉好久没更新了,今天我们来谈谈Linux的内存机制. 首先我们理一下概念 一.什么是linux的内存机制? 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换