free命令解析

以下是笔者在虚拟机上运行的debian系统的free情况。该虚拟机内存只有128M,同时分配了256M的SWAP交换区。

           total   used  free shared buffers cached
Mem:       124788 113432 11356  0     15308   75568
-/+ buffers/cache: 22556 102232
Swap: 245752 20 245732

第一行 (可以理解为从操作系统的角度来看内存分配)

total 总物理内存大小。
used 已分配的大小,注意,对操作系统来说任何被使用的内存都是used
free 未被分配的物理内存大小。
shared 共享内存大小,主要用于进程间通信,例如Oracle会使用上GB的共享内存。
buffers 主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息)
cached 主要用于文件内容缓冲

# 文件系统实际上可以粗略的划分为两个部分:

# (1)metadata:即通常说的元数据,包括目录结构、文件的名字、大小、修改时间、权限等等信息。

# (2)filedata:即文件中真正存储的内容

# "缓存"实际上就是在内存中划分一块区域作为硬盘和进程之间的缓冲区域,写进程把数据写到这里然后就干其他事情去了,读进程需要时先在这里找,找不到再去找硬盘,这样就大大提高了读写效率,同时缩短了IO等待时间,否则你在linux上运行man iptables 这样的命令的时候每次都会等N久。。


第二行 (可以理解为从应用程序的角度来看内存分配)

           total   used  free shared buffers cached
Mem:       124788 113432 11356  0     15308   75568
-/+ buffers/cache: 22556 102232
Swap: 245752 20 245732

- buffers/cached = used(第一行) - buffers - cached 实际上是程序当前"真实使用"的"物理内存"的大小。
+buffers/cached = buffers + cached 两个加起来可以理解为"暂时借给"系统作为"缓冲区"使用的内存大小。

从应用多角度来说,实际上系统还可以分配给他的内存有这么多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)

而系统所拥有的总的物理内存大小 113432 = 22556( - buffers/cached) + 102232 (+ buffers/cached)

那什么时候系统会开始回收buffers和cached部分的内存呢?

这里要看一下数据:

root@debian01:~# cat /proc/meminfo
MemTotal: 124788 kB
MemFree: 11596 kB
Buffers: 15332 kB
Cached: 75568 kB
SwapCached: 20 kB
Active: 54884 kB
Inactive: 45564 kB
Active(anon): 2124 kB
Inactive(anon): 7560 kB
Active(file): 52760 kB
Inactive(file): 38004 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 124788 kB
LowFree: 11596 kB
SwapTotal: 245752 kB
SwapFree: 245732 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 9544 kB
Mapped: 5884 kB
Shmem: 136 kB
Slab: 8784 kB
SReclaimable: 4940 kB
SUnreclaim: 3844 kB
KernelStack: 528 kB
PageTables: 456 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 308144 kB
Committed_AS: 43272 kB
VmallocTotal: 897016 kB
VmallocUsed: 6344 kB
VmallocChunk: 879908 kB
HardwareCorrupted: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
DirectMap4k: 16384 kB
DirectMap4M: 114688 kB

meminfo的数据比较多,这里就不细讲了,我们只关注一个数据。

LowFree: 11596 kB

实际上当free部分的内存小于这个值的时候,系统就会考虑是否需要回收"缓存"部分的物理内存,当然这不是绝对的,这可以作为一个参考阀值。


说了这么多,那么到底有没有办法强制释放呢??


话说办法其实很简单,在控制台执行以下命令即可:

echo 3 > /proc/sys/vm/drop_caches

这里的"3"表示释放所有buffers和cached中能释放的部分。

root@debian01:~# echo 3 > /proc/sys/vm/drop_caches
root@debian01:~# free
          total used free shared buffers cached
Mem: 124788 26764 98024 0 148 6144
-/+ buffers/cache: 20472 104316
Swap: 245752 20 245732

手工释放以后大家可以测试一下,运行几次类似以下这些命令,会明显发现又涨上去了。。。

ls -la /dev/
find / -name *.sh
man iptables
   
root@debian01:~# free
             total used free shared buffers cached
Mem: 124788 87368 37420 0 30692 25512
-/+ buffers/cache: 31164 93624
Swap: 245752 20 245732


你可能感兴趣的:(free)