关于虚拟内存与Linux内存管理不得不知道的

先摘抄维基百科的一段关于虚拟内存的解释算法

虚拟内存是计算机系统内存管理的一种技术它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它一般是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在须要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。shell

注意:虚拟内存不仅是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的做用也能够经过覆盖或者把处于不活动状态的程序以及它们的数据所有交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们觉得本身正在使用一大块的“连续”地址。缓存


接下来说讲Linux是如何管理内存的app

在Linux里(别的系统也差很少),内存有物理内存和虚拟内存之说,物理内存是什么天然无需解释,虚拟内存实际是物理内存的抽象,多数状况下,出于方便性的考虑,程序访问的都是虚拟内存地址,而后操做系统会经过Page Table机制把它翻译成物理内存地址,详细说明能够参考Understanding Memory和Understanding Virtual Memory,至于程序是如何使用虚拟内存的,能够参考Playing with Virtual Memory,这里就很少费口舌了。ide

不少人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引伸出的一种技术而已:操做系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,须要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种状况,先要明确是什么缘由形成的,若是是内存不足就好办了,加内存就能够解决,不过有的时候即便内存充足也可能会出现这种问题,好比MySQL就有可能出现这样的状况,一个可选的解决方法是限制使用Swap:性能

shell> sysctl vm.swappiness=0操作系统

查看内存状况最经常使用的是free命令:翻译

shell> free -m
             total       used       free     shared    buffers     cached
Mem:         32101      29377       2723          0        239      25880
-/+ buffers/cache:       3258      28842
Swap:         2047          0       2047

新手看到used一栏数值偏大,free一栏数值偏小,每每会认为内存要用光了。其实并不是如此,之因此这样是由于每当咱们操做文件的时候,Linux都会尽量的把文件缓存到内存里,这样下次访问的时候,就能够直接从内存中取结果,因此cached一栏的数值很是的大,不过不用担忧,这部份内存是可回收的,操做系统的虚拟内存管理器会按照LRU算法淘汰冷数据。还有一个buffers,也是可回收的,不过它是保留给块设备使用的。内存

知道了原理,咱们就能够推算出系统可用的内存是free + buffers + cached:it

shell> echo $((2723 + 239 + 25880))
28842

至于系统实际使用的内存是used – buffers – cached:

shell> echo $((29377 - 239 - 25880))
3258

除了free命令,还可使用sar命令:

shell> sar -r
kbmemfree kbmemused  %memused kbbuffers  kbcached
  3224392  29647732     90.19    246116  26070160

shell> sar -W
pswpin/s pswpout/s
    0.00      0.00

但愿你没有被%memused吓到,若是不幸言中,重读本文。

相关文章
相关标签/搜索