Linux的内存使用以及优化是一个很有意思很深度的问题,在此写一篇文章来回顾和记录。
内存活动基本上可以用3个数字来量化,活动虚拟内存总量,交换(swapping)率和调页(paging)率。其中第一个数字表明内存的总需求量,后两个数字表示那些内存中有多少比例正处在使用之中.目标是减少内存活动或增加内存量,直到调页率保持在一个可以接受的水平上为止。
活动虚拟内存的总量(VM)=实际内存大小(size of real memory)(物理内存)+使用的交换空间大小(amount of swap space used),当程序运行需要的内存大于物理内存时,UNIX系统采用了调页机制,即系统copy一些内存中的页面到磁盘上,腾出来空间供进程使用,在日常的Linux系统中,偶尔的调页,系统是可以忍受的,但是如果频繁的调页,则表明物理和虚拟内存不够用,需要调出空间供其他的程序来使用,此时,应该考虑增加物理内存。
在Unix(Linux)中内存的管理,主要使用以下两种方法:调页算法,交换技术
调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发生一些交换过程。当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。
Unix(Linux)的虚拟内存:
Unix的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,并能够分配比系统现有物理内存更多的内存,某些操作系统的虚存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的UNIX的虚存的实现方式区别很大,但都离不开下面的4个概念。
1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。
2:交换空间
交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。
3:页面调度
页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。
4:交换
页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。
查看内存的使用,通常使用vmstat和free 下面我们来分析一下系统的案例:
其中Swpd:表明占用了交换分区也就是swap分区,此时如果si,so的值为0,表明只是在交换分区中缓存了一部分文件,而并没有存在大量的页面调度和交换,此时不要担心OS的内存使用,
以上 free 指的是空闲的物理内存,
buff:作为buffer cache的内存,对块设备的读写进行缓冲
cache:作为page cache的内存,文件系统的cache
当看到cache很大的时候,其实我们不需要担心,因为这是Linux的另外一个特性,大量占用内存进行缓存,减少磁盘的IO,同时能够较小CPU I/O的等待,而此时的cache 是可以被OS从新分配使用的。
SWAP
-si:交换内存使用,由磁盘调入内存
-so:交换内存使用,由内存调入磁盘
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
我发现有些朋友看到空闲内存(FREE)很少的或接近于0时,就认为内存不够用了,实际上不能光看这一点,Linux是抢占内存式的OS,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响。
符:vmstat虚拟内存统计信息说明
Linux实际内存使用情况计算:http://www.linuxdiyf.com/linux/14036.html
【香蕉派Fedora系统设置】九、Linux内存扩展:http://www.linuxdiyf.com/linux/13301.html
在Ubuntu下一条命令让你的1G内存变成2G:http://www.linuxdiyf.com/linux/10105.html
Linux虚拟内存和物理内存的理解:http://www.linuxdiyf.com/linux/8796.html
关于Linux下两种内存引导模式的区别:http://www.linuxdiyf.com/linux/8697.html