浅谈Linux的内存管理机制

一 物理内存和虚拟内存linux

         咱们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,所以,咱们但愿全部数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了知足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用做虚拟内存的磁盘空间被称为交换空间(Swap Space)
         做为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存获得了释放,这块内存就能够用于其它目的,当须要用到原始的内容时,这些信息会被从新从交换空间读入物理内存。
         linux的内存管理采起的是分页存取机制,为了保证物理内存能获得充分的利用,内核会在适当的时候将物理内存中不常用的数据块自动交换到虚拟内存中,而将常用的信息保留到物理内存。
         要深刻了解linux内存运行机制,须要知道下面提到的几个方面:
         首先,Linux系统会不时的进行页面交换操做,以保持尽量多的空闲物理内存,即便并无什么事情须要内存,Linux也会交换出暂时不用的内存页面。这能够避免等待交换所需的时间。
         其次,linux进行页面交换是有条件的,不是全部页面在不用时都交换到虚拟内存,linux内核根据”最近最常用“算法,仅仅将一些不常用的页面文件交换到虚拟内存,有时咱们会看到这么一个现象:linux物理内存还有不少,可是交换空间也使用了不少。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,须要耗费不少内存资源,此时就会有一些不经常使用页面文件被交换到虚拟内存中,但后来这个占用不少内存资源的进程结束并释放了不少内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲不少,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担忧什么,只要知道是怎么一回事就能够了。
         最后,交换空间的页面在使用时会首先被交换到物理内存,若是此时没有足够的物理内存来容纳这些页面,它们又会被立刻交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会致使linux出现假死机、服务异常等问题,linux虽然能够在一段时间内自行恢复,可是恢复后的系统已经基本不可用了。
所以,合理规划和设计linux内存的使用,是很是重要的.
算法

二 内存的监控
         做为一名linux系统管理员,监控内存的使用状态是很是重要的,经过监控有助于了解内存的使用状态,好比内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free、top等,下面是某个系统free的输出:
[haixigov@WEBServer ~]$ free
             total        used         free      shared   buffers   cached
Mem:         16402432    16360492      41940        0     465404   12714880
-/+ buffers/cache:        3180208   13222224
Swap:        8193108        264      8192844
咱们解释下输出结果中每一个选项的含义:
首先是第一行:
 total:物理内存的总大小。 
 used:已经使用的物理内存多小。 
 free:空闲的物理内存值。 
 shared:多个进程共享的内存值。
 buffers/cached:磁盘缓存的大小。 
第二行Mem:表明物理内存使用状况。
第三行(-/+ buffers/cached):表明磁盘缓存使用状态。
第四行:Swap表示交换空间内存使用状态。
free命令输出的内存状态,能够经过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。 
 
缓存

1.从内核的角度来查看内存的状态
就是内核目前能够直接分配到,不须要额外的操做,即为上面free命令输出中第二行Mem项的值,能够看出,此系统物理内存有16G,空闲的内存只有41940K,也就是40M多一点,咱们来作一个这样的计算:
16402432-16360492=41940  
其实就是总的物理内存减去已经使用的物理内存获得的就是空闲的物理内存大小,注意这里的可用内存值41940并不包含处于buffers和cached状态的内存大小。
若是你认为这个系统空闲内存过小,那你就错了,实际上,内核彻底控制着内存的使用状况,linux会在须要内存的时候,或在系统运行逐步推动时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。 
 
服务器

2.从应用层的角度来看系统内存的使用状态
也就是linux上运行的应用程序可使用的内存大小,即free命令第三行“(-/+ buffers/cached)”的输出,能够看到,此系统已经使用的内存才3180208K,而空闲的内存达到13222224K,继续作这样一个计算:
41940+(465404+12714880)=13222224
经过这个等式可知,应用程序可用的物理内存值是Mem项的free值加上buffers和cached值之和,也就是说,这个free值是包括buffers和cached项大小的,
对于应用程序来讲,buffers/cached占有的内存是可用的,由于buffers/cached是为了提升文件读取的性能,当应用程序须要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。
 
网络

3.buffers与cached的异同
 在 Linux 操做系统中,当应用程序须要读取文件中的数据时,操做系统先分配一些内存,将数据从磁盘读入到这些内存中,而后再将数据分发给应用程序;当须要往文件中写数据时,操做系统先分配内存接收用户数据,而后再将数据从内存写到磁盘上。然而,若是有大量数据须要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性能就变得很是低下,由于不管是从磁盘读数据,仍是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种状况下,linux引入了buffers和cached机制。
buffers与cached都是内存操做,用来保存系统曾经打开过的文件以及文件属性信息,这样当操做系统须要读取某些文件时,会首先在buffers与cached内存区查找,若是找到,直接读出传送给应用程序,若是没有找到须要数据,才从磁盘读取,这就是操做系统的缓存机制,经过缓存,大大提升了操做系统的性能。但buffers与cached缓冲的内容倒是不一样的。
buffers是用来缓冲块设备作的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件作缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆咱们打开过的文件和程序。
为了验证咱们的结论是否正确,能够经过vi打开一个很是大的文件,看看cached的变化,而后再次vi这个文件,感受一下两次打开的速度有何异同,是否是第二次打开的速度明显快于第一次呢?
接着执行下面的命令:
 find /* -name  *.conf
         看看buffers的值是否变化,而后重复执行find命令,看看两次显示速度有何不一样。
         Linux操做系统的内存运行原理,很大程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把常用到的文件和数据缓存在cached中,linux老是在力求缓存更多的数据和信息,这样再次须要这些数据时能够直接从内存中取,而不须要有一个漫长的磁盘操做,这种设计思路提升了系统的总体性能。
性能

三 交换空间swap的使用
        虽然如今的内存已经变得很是廉价,可是swap仍然有很大的使用价值,合理的规划和使用swap分区,对系统稳定运行相当重要。Linux下可使用文件系统中的一个常规文件或者一个独立分区做为交换空间使用。同时linux容许使用多个交换分区或者交换文件。
 
spa

1.建立swap交换空间
         建立交换空间所需的交换文件是一个普通的文件,可是,建立交换文件与建立普通文件不一样,必须经过dd命令来完成,同时这个文件必须位于本地硬盘上,不能在网络文件系统(NFS)上建立swap交换文件。例如:
[root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536
65536+0 records in
65536+0 records out
这样就建立一个有连续空间的交换文件,大小为60M左右,关于dd命令作简单的讲述:
if=输入文件,或者设备名称。
of=输出文件或者设备名称。
ibs=bytes 表示一次读入bytes 个字节(即一个块大小为 bytes 个字节)。
obs=bytes 表示一次写bytes 个字节(即一个块大小为 bytes 个字节)。
bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可代替 ibs 和 obs。
count=blocks 仅拷贝blocks个块。
skip=blocks 表示从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks表示从输出文件开头跳过 blocks 个块后再开始复制。(一般只有当输出文件是磁盘或磁带时才有效)
这里的输入设备/dev/zero表明一个输出永远为0的设备文件,使用它做输入能够获得全为空的文件。
 
操作系统

2.激活和使用swap
首先经过mkswap命令指定做为交换空间的设备或者文件:
[root@localhost ~]#mkswap  /data/swapfile
Setting up swapspace version 1, size = 67104 kB
[root@localhost backup]# free
             total       used       free     shared    buffers     cached
Mem:       2066632    1998188      68444          0      26160    1588044
-/+ buffers/cache:     383984    1682648
Swap:      4088500     101036    3987464
从上面输出可知,咱们指定了一个67104 kB的交换空间,而此时新建的交换空间还未被使用,下面简单介绍下mkswap命令,mkswap的通常使用格式为:
mkswap [参数] [设备名称或文件][交换区大小]
参数:
-c:创建交换区前,先检查是否有损坏的区块。
-v0:创建旧式交换区,此为预设值。
-v1:创建新式交换区。
交换区大小:指定交换区的大小,单位为1024字节。
设置交换分区后,接着经过swapon命令激活swap:
[root@localhost ~]#/usr/sbin/swapon /data/swapfile
[root@localhost backup]# free
             total       used       free     shared    buffers     cached
Mem:       2066632    1997668      68964          0      27404    1588880
-/+ buffers/cache:     381384    1685248
Swap:      4154028     100976    4053052
         经过free命令能够看出,swap大小已经由4088500k变为4154028k,相差的值是60M左右,恰好等于咱们增长的一个交换文件大小,这说明新增的交换分区已经可使用了,可是若是linux重启,那么新增的swap空间将变得不可用,所以须要在/etc/fstab中添加自动加载设置:
 /data/swapfile  none  swap  sw 0 0
如此以来,linux在重启后就能够实现自动加载swap分区了。其实linux在启动过程当中会执行“swapon -a”命令,此命令会加载列在/etc/fstab中的全部交换空间。
 
设计

3.移除swap
经过swapoff便可移除一个交换空间
[root@localhost ~]#/usr/sbin/swapoff /data/swapfile
其实也能够经过“swapoff -a”移除在/etc/fstab中定义的全部交换空间,这里的“swapoff -a”与上面提到的“swapon -a”对应。执行“swapoff -a”后,free命令输出以下:
[root@localhost backup]# free
             total       used       free     shared    buffers     cached
Mem:       2066632    2048724      17908          0      30352    1642748
-/+ buffers/cache:     375624    1691008
Swap:            0          0          0
进程

相关文章
相关标签/搜索