【linux】手动释放内存cache

需求场景:

有个市场的模拟服务器,因为oracle配置的sga比较大,导致内存缓存较高,当运行所有业务的服务时,服务器的内存已经告竭,客户看到后就一直咨询,是不是内存不够使用,还是程序造成了内存溢出。

事实上,这里有个误解,就是可用内存是否真的已经告捷呢?我们先看一下内存使用情况:

[root@Moni ~]# free -g
              total used free shared buffers cached
Mem:            7     6    0    0      0       6
-/+ buffers/cache:    0    7
Swap:           3     0    3

 我们先来了解下每列的意思,其中total表示内存总数、used表示已经使用的内存叔、free表示空闲的内存书、shared表示多个进程共享的内存总额、buffers表示buffer cache即针对硬盘数据块的读写缓存、cached表示page cache即针对文件inode的读写缓存、-/+buffers/cache两个值依次表示cache中真实已用的内存数和可用的内存数;

可以看到buffers和cached都是内存缓存,而事实上物理内存的真实可用的大小等于:+buffers/cache + free (mem)

所以从上面看,虽然free是0了,但是缓存中可用的内存是7,缓存中可用内存即当运行内存需要时,系统会自动释放缓存给进程使用,

而这里真实被占用的内存不到一个G,如果你用free -m命令或许看的更清楚些。

这就设计到linux对提高磁盘存取效率的高明了,windows中,我们知道,针对文件的缓存一般保存在虚拟内存中,物理内存一般都是程序运行占用的,但是linux中,无论是对文件的缓存还是运行占用的内存都是优先放在屋里内存中,所以才会有明明没有多少业务量,内存却显示告竭的现象。

事实上内存告竭不排除真的是程序引起的内存溢出,或是真的内存不够用,我们判断时不妨观察一下swap的使用量,一般情况下linux的swap在物理内存尚有富余时是不会被使用的。

而linux终的cache也随着系统运行的时间读写文件数量的增多,cache会不断增大的,直到上面看到的样子,内存显示空闲为0。

那么linux会不会过段时间自动释放这些内存缓存呢,显然并不会轻易主动释放的。事实上并不影响系统性能,但是有时候我们的客户或老板是不了解这些的,一旦业务上有点波动,留下这个梗他们就会认为是我们系统或硬件出现的问题。所以有时候我们有必要了解如何手动释放cache,有必要的话要做定时释放。

♥手动释放linux内存缓存cache

释放cache事实上很简单,通过配置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

意思就是写入此文件会导致内核从内存中删除清空缓存,其中数字1针对针对内存的pagecache、2针对内存的dentries和indodes、3针对所有的缓存。

注意如果要清空所有的缓存,有必要执行下sync命令同步下缓存使其完成读写。而数字0表示不清空内存缓存

这里/proc下面是一个虚拟文件系统,所以我们才能通过修改其中的文件来对当前的kernel的行为做出调整。

[root@Moni ~]# cat /proc/sys/vm/drop_caches 
0
[root@Moni ~]# sync
[root@Moni ~]# echo 3 > /proc/sys/vm/drop_caches
[root@Moni ~]# free -g
              total used free shared buffers cached
Mem:            7     0   7     0      0       0
-/+ buffers/cache:    0   7
Swap:           3     0   3

当然如果在接下来不影响系统的读写性能,可以恢复到0级别;

[root@Moni ~]# echo 0 > /proc/sys/vm/drop_caches
思考·总结

在这个地方,我们要考虑客户的忧虑,实际工作中,需要修改,需不需要给客户讲明,还需要斟酌对待,有的客户是完全不了解的,所以限制了判断,如果你说不清楚或是直接上来就给操作,一次两次后,客户会认为我们的系统或我们的维护工作有问题,所以不到很需要的情况下,不用如此操作。且如果我们一直配置成3,系统性能一定会不升反降的。


(好的今天就分享到这里,如果你有高见或好的分享,记得留言哦!)


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux】手动释放内存cache

3
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:3059 D
    博文:215 P
    评论:452 S