交换空间是虚拟内存的关键。
当系统的RAM不足时,它可以将磁盘空间用作临时内存。
磁盘至少比物理内存慢一个数量级,但可以帮助弥补暂时的短缺。
一个古老的经验法则认为,平均程序80%的时间花在20%的代码上,剩余的代码包含错误处理、启动和关闭过程等。
至少有和RAM一样多的交换空间。
如果需要大量交换空间,且有多个磁盘,建议在各磁盘上平均分配交换空间。
FreeBSD系统最好是在四个不同的磁盘上有四个交换分区。
添加更多的内存,就不要那么多交换空间了。
在许多系统中,大量的交换空间对系统性能没有帮助。
如果系统因内存耗尽而发生故障,大量的交换空间可能会使机器的故障时间更长。取代快速崩溃和快速重启的是,你的系统缓慢而持久的死亡,伴随着大量的不适和糟糕的性能,然后是同样的崩溃和重启。
交换空间是虚拟内存的关键。当您的系统RAM不足时,它可以将磁盘空间用作临时内存。切换到磁盘至少比物理内存慢一个数量级,但它可以帮助弥补暂时的短缺。一个古老的经验法则认为,平均程序80%的时间花在20%的代码上。剩下的代码包含错误处理、启动和关闭过程等。如果FreeBSD将web服务器进程的这些部分转移到基于磁盘的虚拟内存中,你的用户甚至不会注意到。
一个系统应该有多少交换?足以履行其职责,如果系统死机,也足以执行内核转储。这对大多数人来说不是一个有用的答案,因为你可能不知道你需要多少。人们仍然建议交换的内存是RAM的两倍。我自己也提出过这个建议,但这是一个相当任意的数字。许多系统都有足够的内存,无需任何交换即可正常运行。微型嵌入式系统通常无需交换即可运行。我喜欢至少有和RAM一样多的交换空间,这样即使转储压缩失败,一个惊慌失措的系统也可以随时进行内核转储。
如果您需要大量交换并且有多个磁盘,请在它们之间平均分配交换空间。FreeBSD系统最好在四个不同的磁盘上有四个交换分区。更好的是,添加更多内存,这样你就不需要那么多交换了!
在许多系统中,大量的交换空间对系统性能没有帮助。如果系统因内存耗尽而发生故障,大量的交换可能会使机器的故障时间更长。取代快速崩溃和快速重启的是,你的系统缓慢而持久的死亡,伴随着大量的不适和糟糕的性能,然后是同样的崩溃和重启。
在您正在安装的系统上配置swap很容易。如果你正在检查一个不熟悉的系统,或者必须进行更改怎么办?FreeBSD包括几个工具,可以让你检查和管理你的交换分区。
使用 swapinfo(8) 命令查看当前系统有多少交换空间:
xxxxxxxxxx# swapinfoDevice 1K-blocks Used Avail Capacity/dev/gpt/swap1 8388608 0 8388608 0%/dev/gpt/swap0 8388608 0 8388608 0%Total 16777216 0 16777216 0%此系统有两个交换分区,/dev/gpt/swap0 和 /dev/gpt/swap1 。使用 glabel list 命令可以查看到这些分区位于ada0和ada1磁盘上。最后一行现实这台机器的交换空间未被使用。显然,服务器负担很轻。
如果你不喜欢做数学运算,将千字节转换为更方便的测量值,请添加 -h 标志。这表明每个交换分区是8GB,而这个系统总共有16GB的交换空间。
许多服务器级系统有可以热插拔的硬盘驱动器。如果驱动器遇到错误,需要在错误变得更严重之前更换它。卸载分区很容易,但如何停用交换空间呢?
这就是 swapon(8) 和 swapoff(8) 实用程序派上用场的地方。要关闭交换分区,请将要停用的分区的设备节点提供给 swapoff 。
xxxxxxxxxx# swapoff /dev/gpt/swap0您必须等待内核将所有占用的交换从该驱动器移动到剩余的交换分区上。如果系统没有足够的交换空间来处理所有占用的交换,它将拒绝释放交换分区。如果一个有两个8GB交换分区的系统使用了超过8GB的交换,FreeBSD不会分离任何一个交换分区。您必须先添加交换空间,然后才能删除其中一个正在使用的分区。
要添加交换分区,请使用 swapon(8) 和新分区的设备节点。
xxxxxxxxxx# swapon /dev/gpt/swap0这使您可以在不关闭系统的情况下更换发生故障的驱动器——前提是您有足够的备用交换空间来处理临时短缺。
如果需要更多的交换空间,但又没有备用分区,可以使用一个文件作为交换空间。使用文件作为交换空间并不理想,因为虚拟内存系统会受到文件系统带来的额外开销的影响。仅建议在弥补临时短缺时使用文件作为交换空间,例如更换故障驱动器时。
首先创建一个交换文件。此文件不需要任何内容,但确实需要正确的大小。以下示例创建一个包含一大堆零的文件。有人建议使用稀疏文件(使用 seek 选项,而不是 count 选项),但FFS会像龙卷风中的五彩纸屑一样碎片化稀疏文件。
xxxxxxxxxx# dd if=/dev/zero of=/tmp/tempswap.swp bs=1 count=8g以上操作告诉 dd 命令将 /dev/zero 设备复制到 /tmp/tempswap.swp 文件。块大小(bs,block size)为 1 ,因此 dd 以1个扇区为单位写入。然而,我并没有写具体数量的块;我只是在输出零,直到文件达到8GB。
现在将交换文件附加到内存设备。我在《FreeBSD Mastery:Specialty Filesystems》中详细介绍了内存设备,但这里是将此文件附加到内存设备的命令。
xxxxxxxxxx# mdconfig -a -t vnode -f tempswap.swpmd0tempswap.swp 文件将被附加到设备 md0 。使用 swapon(8) 命令激活此交换空间:
xxxxxxxxxx# swapon /dev/md0现在有了更多的交换空间。更换驱动器。当你这样做的时候,建议添加更多内存。
在系统启动时自动启动交换文件在FreeBSD 10和FreeBSD 9之间有所不同。对于FreeBSD9或更早的系统,需要在 /etc/rc.conf 中指定 swapfile 值:
xxxxxxxxxxswapfile=”/tmp/tempswap.swp”对于FreeBSD10或更新的系统,需要编辑 /etc/fstab 文件,加入以下行,用 file 挂载指定路径中的交换文件:
xxxxxxxxxxmd0 none swap sw,file=/tmp/tempswap.swp 0 0您不需要使用内存设备0。使用你喜欢的任何数字。
内存可以包含敏感信息,如密码、短语、信用卡号码和各种好东西。如果这些信息被写入磁盘,恶意用户可能会读取它。交换中的信息甚至在系统重新启动后仍然存在,直到被覆盖。加密交换空间是一种明智而明显的预防措施。
您可以使用第7章和第8章中讨论的GBDE或GELI方法加密交换空间。如果要使用GELI,请在交换设备的名称中添加 .eli 。如果您更喜欢GBDE,请添加 .bde 。下面示例中,我使用GELI对 /etc/fstab 中的交换空间进行了加密。(我在第一章讨论了 /etc/fstab )
xxxxxxxxxx/dev/gpt/swap0.eli none swap sw 0 0/dev/gpt/swap1.eli none swap sw 0 0swapon(8) 程序识别这些标记,并自动用一次性密钥对其进行加密。虽然写入磁盘的数据可能会在重新启动后幸存下来,但一次性密钥肯定不会。即使是系统管理员也无法在重新启动后从用一次性密钥加密的交换中恢复数据。
既然你知道如何让数据消失,让我们讨论一下如何让它保留一段时间。