最近看到有朋友在我的Blog中问关于Linux环境下swap分区设置的问题,问题如下:“需要设置一个10G的swap分区,是设置成单个10G的好呢,还是5个2G的,还是其他的方案,比如2个5G的分区?”

        看来有必要再写一篇Blog来阐述一下这个问题。
 
        在网络上我经常看到这样的经典问答:
                问:我的内存大小是xxx,那么我建立的swap多少才合适? 
                答:大概物理内存的1倍即可。
        我认为这种回答是很不负责任的,所谓1倍内存大小或2倍内存大小的swap分区设置,是给那些对Linux系统不是很熟悉的用户的简单建议,这种设置在桌面Linux下是没有什么问题的,最多是占用一些硬盘空间而已。但是在真正的生产环境下,这种设置是很不合理的一种设置。
        对swap的简单介绍在我以前的《如何合理设置Linux的swap分区》这篇文章中介绍过,我在这里就不再介绍了,有兴趣的朋友可以去看一看。
一、swap分区大小是怎么确定的?
        其实swap分区的大小设置是很考验Linux系统管理员水平的一件事情,swap的大小是这样决定的:
         ( 内存大小 + Swap分区大小 ) * 80%或70% >= 程序需要占用总内存数
        如果系统内存大小已经大于系统中所有任务最大内存使用大小,那么就根本没有必要设置swap分区了,如果这个时候设置上,那么就是白白占用了那些硬盘空间(当然,如果硬盘足够富裕,可以忽略这些占用了)。
        那么有的管理员就会说了:我不知道我系统中所有任务最大内存使用大小是多少啊!
        我在这里给你一个方法,可以找到这个大小是多少,下面跟着我一步一步来:
1、用swapoff 关掉所有swap 然后正常运行任务,如果出现内存不足的提示,就需要逐步增加swap
2、一般来讲,物理内存达到256m,在安装时即可不用划分交换分区.。
3、可以在安装后建立交换分区,或者建立交换文件。
        BTW:swap还有一个用处,就是在机器lock,出现问题的时候内存的内容会自动copy到swap上面,这样可以有效防止机器故障带来内存中的内容忽然丢失的情况。
二、为什么swap分区不宜过大?
        为什么 swap 分区不宜过大,这是由于 Linux 内存分配的特点——它会尽可能多地使用内存(包括swap 分区)。尽量使用内存的目的是加快 IO 处理的速度,比如关掉一个程序,原先占有的内存空间并不立即清空,下一次打开时就不用去硬盘找数据,而直接从内存中读取。但是如果虚拟内存过大,那么保留在内存缓冲区中的数据实际上还是在硬盘中,那对于加快速度就没有多大的作用了。 
        swap 分区对于物理内存小的机器是必不可少的,假设物理内存只有64M,而某个程序启动最少要256M,如果没有足够的虚拟内存,这个程序是根本打不开的(系统会报内存不足错误,甚至崩溃)。对于程序而言,物理内存和虚拟内存是没有任何区别的,它们只关心空间是否够大。在物理内存够用的情况下可以适当分配一些空间给 swap ,这仅仅是为了偶尔同时开很多大家伙时,防止出现内存不足错误。
三、swap是一个大分区还是多个小分区?
        我记得有人说过在fedora和debian的文档中看到过说明,建议swap分区大小不要超过2G。
        为什么是2G呢?我觉得首先是由于32位机的文件偏移指针是个无符号整型,所以单个文件偏移最大到2的31次方,也就是2G。其次,旧的文件系统对大文件的支持并不是很好(有点类似Windows环境下FAT文件格式不能有文件大小限制),所以在文档中建议swap分区大小不超过2G(要知道swap是可以在运行过程中动态加载swap文件的)。
        如果各位使用的是2.4+内核或者64位的系统,那么可以放心地把swap分区设置的足够大,IBM在针对其Linux 2.4 kernel的文档中明确表明,2.4.10及以后的linux kernel,支持的每块swap最大不超过24GB。
        下面再说说设置多个swap的好处,那就是可以把多个swap分担到多块硬盘上,如果你有多个物理磁盘,建议在把swap分布到每块磁盘上,这时确实可以提高运行速度。
 
        当然,文章中的不足,欢迎各位朋友指出,大家一起学习进步。

本文出自 “玄武·巴依” 博客,请务必保留此出处http://commandos.blog.51cto.com/154976/258608