linux频繁存取文件内存不释放问题

文章转载自:http://loofeer.blog.51cto.com/707932/980864

当你在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 

首先,/proc/sys/vm/drop_caches的值,默认为0 

[root@server test]# sync 

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

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


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

[root@server 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(8) first.
 

总结:实际项目中,如果应用有内存泄露、溢出等问题,从swap可以快速判断,但free上面反而比较难看出问题。

windows操作系统:无论物理内存有多少,都要拿硬盘交换文件来读,这也是windows为什么常常提示虚拟空间不足的原因。

linux操作系统:只要不用swap的交换空间,就不用担心内存太少,如果常常swap用很多,就要考虑加物理内存了,这是linux看内存是否够用的标准。

名词解释:

Buffer和Cache

简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的

1、buffer是由各种进程分配的,由进程和系统一起管理.被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。

2、cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。

3、Buffer cache(Buffer)是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。

4、Page cache(Cache)实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

总之,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

Windows虚拟内存(Virtual Memory)

1、所谓虚拟内存就是在你的物理内存不够用时,把一部分硬盘空间做为内存来使用,不过由于硬盘传输的速度要比内存传输速度慢的多,2GB物理内存在一般情况下已足够用,可以不用再设虚拟内存,但有时玩大型游戏,又同时打开多个程序,因内存紧张也会造成运行迟缓,或死机,如果是这样,那就还是设置上虚拟内存为好。

2、一般情况下,可让Windows来自动分配管理虚拟内存,它能根据实际内存的使用情况,动态调整虚拟内存的大小。

3、自定义虚拟内存,可设置小一点,初始值可设为512MB,最大值设为1024MB,如果在使用中发现不够用时,可再往大了设,比如说512/2048MB。

4、虚拟内存最好不要与系统设在同一分区内,内存是随着使用而动态地变化,C盘就容易产生磁盘碎片,影响系统运行速度,所以,最好将虚拟内存设置在其它分区中磁盘剩余空间较大而又不常用的盘中,如D、F,这样可以避免系统在此分区内进行频繁的读写操作而影响系统速度。在一台电脑中,虚拟内存在一个分区中设置就够用了,不必在各个分区中设置虚拟内存。

5、设置虚拟内存的方法是:我的电脑—属性—高级—性能设置—高级—虚拟内存更改—点选C盘—单选“无分页文件(N)”—“设置”,此时C盘中的虚拟内存就消失了;然后选中D盘,单击“自定义大小”—在下面的“初始大小”和“最大值”两个文本框中输入数值—“设置”—确定—重启,便完成了设置。

Linux的虚拟内存

linux的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,能够分配比物理内存更多的内存,某些操作系统的虚拟内存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的linux的虚存的实现方式区别很大,主要包括以下四个概念:

1:实际内存

实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。

2:交换空间

交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。

3:页面调度(Paging)

页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为linux内存被平均划分成大小相等的页面;通常页面大小为 4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。

4:交换(Swap)

页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足

vmstat监视内存性能:该命令用来检查虚拟内存的统计信息,并可显示有关进程状态、空闲和交换空间、调页、磁盘空间、CPU负载和交换,cache刷新以及中断等方面的信息。


猜你喜欢

转载自blog.csdn.net/xinghuah/article/details/77600616
今日推荐