需求场景:
有个市场的模拟服务器,因为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
(好的今天就分享到这里,如果你有高见或好的分享,记得留言哦!)