快捷搜索:

手工释放linux内存——/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为86MB,buffer和cached分手为10MB,94MB。

那么我们来看看,假如我履行复制文件,内存会发生什么变更.

引用

[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吃掉落了。别首要,这是为了前进文件读取效率的做法。

为了前进磁盘存取效率,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

彷佛没有任何变更。(实际环境下,内存的治理还与Swap有关)

那么我能否手动开释掉落这些内存呢?回答是可以的!

二、手动开释缓存

/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 和读写映射文件)

引用

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

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

3

将/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 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。(可惜,这样的利用平日都是运行在老的操作系统版本上,上面的操作也办理不了)。

您可能还会对下面的文章感兴趣: