经常遇到一些刚接触 Linux 的新手会问内存占用怎么那么多?
在 Linux 中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是 Linux 内存管理的一个优秀特性,在这方面,区别于 Windows 的 内存管理。主要特点是,无论实体内存有多大,Linux 都将其充份利用,将一些程式呼叫过的硬碟资料读入内存,利用内存读写的高速特性来提高 Linux 系统的资料访问效能。而 Windows 是只在需要内存时, 才为应用程式分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些实体内存,Linux 都将能充分利用起来,发挥了硬体投资带来的好处,而 Windows 只将其做为摆设,即使增加 8GB 甚至更大。
Linux 的这一特性,主要是利用空闲的实体内存,划分出一部份空间,做为 cache 、 buffers ,以此提高资料访问效能。
页 WordPress 加速缓存内存 (cache) 是 Linux 核心实现的一种主要磁碟 WordPress 加速缓存。它主要用来减少对磁碟的 I/O 操作。具体地讲,是通过把磁碟中的资料 WordPress 加速缓存到实体内存中,把对磁碟的访问变为对物理 内存的访问。
磁碟 WordPress 加速缓存内存的价值在于两个方面:第一,访问磁碟的速度要远远低于访问内存的速度,因此,从内存访问资料比从磁碟访问速度更快。第二,资料一旦被访问,就很有可能在短期内再次被访问到。
下面来了解下 Linux 内存管理机制:
一、实体内存和虚拟内存
我们知道,直接从实体内存读写资料要比从硬碟读写资料要快的多,因此,我们希望所有资料的读取和写入都在内存完成,而内存是有限的,这样就引出了实体内存与虚拟内存的概念。
实体内存就是系统硬体提供的内存大小,是真正的内存,相对于实体内存,在 Linux 下还有一个虚拟内存的概念,虚拟内存就是为了满足实体内存的不足而提出的策略,它是利用磁碟空间虚拟出的一块逻辑内存,用作虚拟内存的磁碟空间被称为交换空间(Swap Space)。
作为实体内存的扩充套件,Linux 会在实体内存不足时,使用交换分割槽的虚拟内存,更详细的说,就是核心会将暂时不用的内存块资讯写到交换空间,这样以来,实体内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些资讯会被重新从交换空间读入实体内存。
Linux 的内存管理采取的是分页存取机制,为了保证实体内存能得到充分的利用,核心会在适当的时候将实体内存中不经常使用的资料块自动交换到虚拟内存中,而将经常使用的资讯保留到实体内存。
要深入了解 Linux 内存执行机制,需要知道下面提到的几个方面:

Linux 系统会不时的进行页面交换操作,以保持尽可能多的空闲实体内存,即使并没有什么事情需要内存,Linux 也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,Linux 核心根据” 最近最经常使用 “演算法,仅仅将一些不经 常使用的页面档案交换到虚拟内存,有时我们会看到这么一个现象:Linux 实体内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占 用很大内存的程序执行时,需要耗费很多内存资源,此时就会有一些不常用页面档案被交换到虚拟内存中,但后来这个占用很多内存资源的程序结束并释放了很多内 存时,刚才被交换出去的页面档案并不会自动的交换进实体内存,除非有这个必要,那么此刻系统实体内存就会空闲很多,同时交换空间也在被使用,就出现了刚才 所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。
交换空间的页面在使用时会首先被交换到实体内存,如果此时没有足够的实体内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内 存中可能没有足够空间来储存这些交换页面,最终会导致 Linux 出现假宕机、服务异常等问题,Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统 已经基本不可用了。

因此,合理规划和设计 Linux 内存的使用,是非常重要的.
二、内存的监控
作为一名 Linux 系统管理员,监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有 free 、 top 等,下面是某个系统 free 的输出:

[root@linuxeye ~]# free
             total       used       free     shared    buffers     cached
Mem:       3894036    3473544     420492          0      72972    1332348
-/+ buffers/cache:    2068224    1825812
Swap:      4095992     906036    3189956

每个选项的含义:
第一行:
total:实体内存的总大小
used:已经使用的实体内存大小
free:空闲的实体内存大小
shared:多个程序共享的内存大小
buffers/cached:磁碟 WordPress 加速缓存的大小
第二行 Mem:代表实体内存使用情况
第三行 (-/+ buffers/cached):代表磁碟 WordPress 加速缓存使用状态
第四行:Swap 表示交换空间内存使用状态
free 命令输出的内存状态,可以通过两个角度来检视:一个是从核心的角度来看,一个是从应用层的角度来看的。
从核心的角度来检视内存的状态
就是核心目前可以直接分配到,不需要额外的操作,即为上面 free 命令输出中第二行 Mem 项的值,可以看出,此系统实体内存有 3894036K,空闲的内存只有 420492K,也就是 40M 多一点,我们来做一个这样的计算:
3894036 – 3473544 = 420492
其实就是总的实体内存减去已经使用的实体内存得到的就是空闲的实体内存大小,注意这里的可用内存值 420492 并不包含处于 buffers 和 cached 状态的内存大小。
如果你认为这个系统空闲内存太小,那你就错了,实际上,核心完全控制著内存的使用情况,Linux 会在需要内存的时候,或在系统执行逐步推进时,将 buffers 和 cached 状态的内存变为 free 状态的内存,以供系统使用。
从应用层的角度来看系统内存的使用状态
也就是 Linux 上执行的应用程式可以使用的内存大小,即 free 命令第三行 -/+ buffers/cached 的输出,可以看到,此系统已经使用的内存才 2068224K,而空闲的内存达到 1825812K,继续做这样一个计算:
420492+(72972+1332348)=1825812
通过这个等式可知,应用程式可用的实体内存值是 Mem 项的 free 值加上 buffers 和 cached 值之和,也就是说,这个 free 值是包括 buffers 和 cached 项大小的,对于应用程式来说,buffers/cached 占有的内存是可用的,因为 buffers/cached 是为了提高档案读取的效能,当应用程式需要用到内存的时候,buffers/cached 会很快地被回收,以供应用程式使用。
buffers 与 cached 的异同
在 Linux 操作系统中,当应用程式需要读取档案中的资料时,操作系统先分配一些内存,将资料从磁碟读入到这些内存中,然后再将资料分发给应用程式;当需要往档案中写 资料时,操作系统先分配内存接收使用者资料,然后再将资料从内存写到磁碟上。然而,如果有大量资料需要从磁碟读取到内存或者由内存写入磁碟时,系统的读写性 能就变得非常低下,因为无论是从磁碟读资料,还是写资料到磁碟,都是一个很消耗时间和资源的过程,在这种情况下,Linux 引入了 buffers 和 cached 机制。
buffers 与 cached 都是内存操作,用来储存系统曾经开启过的档案以及档案属性资讯,这样当操作系统需要读取某些档案时,会首先在 buffers 与 cached 内存区查询,如果找到,直接读出传送给应用程式,如果没有找到需要资料,才从磁碟读取,这就是操作系统的 WordPress 加速缓存机制,通过缓 存,大大提高了操作系统的效能。但 buffers 与 cached 缓冲的内容却是不同的。
buffers 是用来缓冲块装置做的,它只记录档案系统的后设资料(metadata)以及 tracking in-flight pages,而 cached 是用来给档案做缓冲。更通俗一点说:buffers 主要用来存放目录里面有什么内容,档案的属性以及许可权等等。而 cached 直接用来记忆我们开启过的档案和程式。
为了验证我们的结论是否正确,可以通过 vi 开启一个非常大的档案,看看 cached 的变化,然后再次 vi 这个档案,感觉一下两次开启的速度有何异同,是不是第二次开启的速度明显快于第一次呢?
接著执行下面的命令:

find /* -name  *.conf

看看 buffers 的值是否变化,然后重复执行 find 命令,看看两次显示速度有何不同。
Linux 操作系统的内存执行原理,很大程度上是根据站群服务器的需求来设计的,例如系统的缓冲机制会把经常使用到的档案和资料 WordPress 加速缓存在 cached 中,linux 总是在力求 WordPress 加速缓存更多的资料和资讯,这样再次需要这些资料时可以直接从内存中取,而不需要有一个漫长的磁碟操作,这种设计思路提高了系统的整 体效能。
参考:http://ixdba.blog.51cto.com/2895551/541355