本章说明Linux的内存管理特征,即虚拟内存和磁盘缓存。描述系统管理员应该考虑的东西、工做和目的。 什么是虚拟内存? Linux支持虚拟内存, 就是使用磁盘做为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其余目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。固然,读写硬盘比真的内存慢(慢千倍),因此程序运行较慢。用作虚拟内存的这部分硬盘叫 对换空间。 Linux可使用文件系统中的普通文件或单独的分区做为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。若是知道要多少对换空间,应该用对换分区;若是不能确认,能够先用对换文件,用一段时间后再根据所需空间创建对换分区。 Linux容许同时使用多个对换分区和/或对换文件。即若是偶尔须要更多的对换空间,能够随时创建一个额外的对换文件。 产生对换空间 对换文件是普通文件,对核心没有什么特别的。惟一不一样是它没有孔,用 mkswap 准备。必须在本地盘上,不能在经过NFS mount的文件系统中。 关于孔,是重要的。对换文件保留了磁盘空间,使核心能快速对换出一页,而没必要通过如文件的定位磁盘扇区的所有事情。核心只用分配给这个文件的全部扇区。因为文件中的孔意味着没有为文件中这个位置分配磁盘扇区,这对核心使用不利。 产生没有孔的对换文件的一个好办法是经过以下命令: $ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 1024+0 records in 1024+0 records out $ /extra-swap 是对换文件名,大小由count=给出. 大小最好是4的倍数,由于核心写出的内存页是4KB。若是不是4的倍数,最后那几KB将不可用。 对换分区也没什么特别。就象产生其余分区同样产生;惟一的不一样是它做为原始分区使用,即没有任何文件系统,最好将对换分区标记为类型82(Linux swap),虽然这对核心没有影响,但这使分区列表更清晰。 产生对换文件或对换分区后,须要写个标记起用它,这包括核心要用的一些管理信息。命令是 mkswap , 用法以下: $ mkswap /extra-swap 1024 Setting up swapspace, size = 1044480 bytes $ 注意对换空间如今还没用,它存在,但核心还没用它提供虚拟内存。 请必定当心使用mkswap , 由于它不检查文件或分区是否被其余东西使用。 你可能用mkswap 很容易地覆盖了重要文件和分区! 幸亏,你只需在你安装系统时使用mkswap 。 Linux内存管理限制了每一个对换空间约为127MB(因为技术缘由,实际限制是127.6875MB)。 能够同时使用最多16个对换空间,总计差很少2GB。 使用对换空间 用swapon 将一个初始化的对换空间可用。此命令告诉核心对换空间能够用了,对换空间的路径做为参数,启动一个临时对换文件能够用以下命令: $ swapon /extra-swap $ 对换空间若是列入/etc/fstab ,就可自动使用。 /dev/hda8 none swap sw 0 0 /swapfile none swap sw 0 0 启动手稿运行命令swapon -a, 它将启动/etc/fstab 中所列的全部对换空间。所以swapon 命令只有在启动额外的对换空间时才使用。 能够用free 监视对换空间的使用,它将给出全部使用的对换空间。 $ free total used free shared buffers Mem: 15152 14896 256 12404 2528 -/+ buffers: 12368 2784 Swap: 32452 6684 25768 $ 前一行输出(Mem:)显示物理内存。 Total列不显示核心使用的物理内存(一般大约1MB)。Used列显示被使用的内存总额(第二行不计缓冲)。 Free列显示所有没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。 后一行(Swap:)对对换空间,显示的信息相似上面。若是这行为全0,那么没使用对换空间。 经过top ,或使用proc文件系统的/proc/meminfo 文件能够获得相同的信息。获得某个对换空间的使用信息目前还比较困难。 可用swapoff 取消对换空间,通常没必要这样,除非是临时对换空间。对换空间中的要用的页被换入(swap->RAM),若是没有足够的物理内存,就被换出(RAM->swap,到其余对换空间)。若是没有足够的虚拟内存放进全部页面,Linux将开始震荡(thrash); 很长时间之后应该能恢复,但此时系统不可用。取消一个对换空间前,应该检查(例如用free )是否有足够的物理内存。 用swapon -a自动使用的全部对换空间能够用swapoff -a取消。它查看文件/etc/fstab 得知要取消什么。任何手工起用的对换空间将依然使用着。 即便有许多空闲的物理内存,有时许多对换空间也被使用着。这种状况是因为在某个时间须要对换,但后来一个占用大量物理内存的大进程终止并释放了内存。直到被换出的数据要被使用以前它们并不自动换入。没必要顾虑这种状况,但知道为何会发生这种状况会更安心。 与其余操做系统共享对换空间 许多操做系统内置虚拟内存。因为他们只需在运行时使用,即,不会同时,那么除了当前运行的,其余全部对换空间都浪费着。若是他们共享同一个对换空间将更有效。这是可能的但须要一些Hacking工做。 Tips-HOWTO包含了一些如何完成这项任务的忠告。 分配对换空间 也许有人告诉你,应该分配2倍于物理内存的对换空间,但这是个虚假的规律。下面说明如何正确: 估计你的所有内存需求。这是你可能须要的最大量,即你要同时运行的全部程序所需的内存要求的总和。你能够同时运行你可能同时运行的全部程序试试。 例如,若是你想运行X,你得分配8MB给他,gcc要求数MB(有些文件偶尔可能须要很大量,数十MB,但通常4MB差很少),等等。核心本身使用1MB,Shell和一些小工具可能须要几百KB(或说,总共1MB)。没必要太精确,粗略估计就行,但能够较悲观地考虑。 记得若是将有多人同时使用系统,他们将都消耗内存。若是2我的同时运行相同的程序,总内存消耗通常并不是加倍,由于代码页和共享库是单一的。 free 和ps 命令对估计内存需求颇有用。 第一步的估计加上一些安全量。由于对程序大小的估计极可能是错误的,由于你可能忘了一些要运行的程序,并肯定你有一些额外空间。应该有数MB。(分配太多对换空间比分配太少好,但没必要过度,由于不使用的对换空间是浪费;见后文:关于增长对换空间。) Also,since it is nicer to deal with even numbers, you can round the value up to the next full megabyte. 基于以上计算,你知道了你总共须要多少内存。减去你的实际物理内存,就是对换空间。 (有些版本的UNIX中,你还须要分配物理内存的映象空间,因此第二布中计算的你所需的空间就不能减) 若是你计算的对换空间比你的实际物理内存大得多(大于好几倍以上),那么你也许须要更多的物理内存,不然系统性能将过低。 即便计算显示你无须对换空间,最好仍是至少有一些。Linux有些侵略性地使用对换空间,这样保持必定的空闲物理内存。即便内存还不为何程序所需,Linux也会换出一些不用的内存页,这样在须要的时候就能够避免因对换的等待--即对换能够在硬盘空闲的时候提前完成。 对换空间能够分在几个硬盘中,这有时能够提升性能,依赖于这些盘的相对速度和存取模式。你能够尝试几中方案,但要知道正确地尝试是很困难的。不要相信某种方案比其余方案好的判定,由于它不会老是对的。 高速缓存 与存取(真正的)内存相比,从磁盘读是很慢的 另外,在相对短的一端时间里,屡次读硬盘相同的部分是很常见的。例如,你可能先读了一封电子邮件,而后回复时又将它读入编辑器,而后复制它到一个文件夹时又用邮件程序读它。或者,考虑命令ls 可能被系统上的不少用户多么频繁地使用。只从磁盘读一次信息,并保持在硬盘中,知道再也不须要,除了第一次读,其余都会较快。这就叫磁盘缓存disk buffering,用于此目的的内存叫buffer cache。 不幸的是,因为内存是有限且缺少的资源,buffer cache通常不会足够大(大到可以装下全部人可能用到的数据)。当cache满时,最长时间不用的数据将被丢弃,内存释放给最新的数据。 磁盘缓冲也用于写操做。要写的数据常常立刻又被读(例如一个源代码文件保存到文件中后又被编译器读出),因此将要写的数据放在缓冲里是个好主意。另外,只将数据放如cache而不立刻写到磁盘,写操做的程序执行速度更快。写操做而后能够在后台完成,而不下降其余程序的速度。 许多操做系统有buffer caches (即便名称不一样),但并不是都根据上述原理。有些是透写write-through: 数据立刻写到磁盘(固然也同时写到cache) 不立刻写的cache叫回写write-back。回写比透写更有效,但也更容易出错:若是系统崩溃,或电源忽然掉电,或软盘在cache回写前被取出,那么cache中改变的数据将丢失。这可能意味着文件系统is not in full working order, 可能因为未写数据包含了系统记录信息的重要的变化。 所以,千万不要不通过正常的关闭过程直接关闭电源(见6章), 或没有unmount就取出软盘(若是是mount的),或什么程序还在用着软盘,或软盘灯还在闪。 sync 命令刷新缓冲,即强制将全部未写数据写回磁盘,若是要确保全部数据安全回写,能够用它。传统的UNIX系统中,有个update 程序在后台运行,它每30秒运行一次 sync ,因此一般无须使用sync 。 Linux有一个另外的守侯程序bdflush ,它克服了sync 有时因磁盘I/O负荷过重(由于频繁的操做)而致使有时系统忽然呆住的问题。 Linux下,bdflush 由update 启动。通常无须考虑它,但若是bdflush 偶尔由于什么缘由死了,核心会给出警告,此时应该手工启动它(/sbin/update )。 cache并不真正缓冲文件,而是块,就是磁盘I/O的最小单元(Linux下,通常是1kB)。这样,全部的目录、超级块、其余文件系统记录数据和无文件系统磁盘均可以被缓冲。 cache的效果决定于其大小。过小的cache几乎无用;它只能cache不多的数据,而可能在被重用前就被清除了。大小有赖于有多少数据被读写,相同的数据的存取频度。惟一的方法是实验。 若是cache是固定大小,那么不该该太大,不然,会因为空闲内存空间过小而使用swap(也很慢)。为了最有效地使用真实内存,Linux自动使用全部空闲内存做为buffer cache,当程序须要更多内存时,自动减小cache。 Linux下,对cache使用无须作任何工做,它彻底是自动的。除了要正常关闭系统和取出软盘,无须关心cache。