应该混合使用交换和RAID-1吗?

我有一个盒子,里面有一个小的RAID-1阵列用于交换空间。我之所以这样做,是因为我在系统中为每个其他分区设置了镜像。
今天我读到了这个问题,它让我想知道:“将交换空间放在RAID-1上是否理想/可取?”
2个回答

你应该(可能)不要将交换分区从RAID 1中移除。

在RAID 1上放置交换分区有时并不是很重要,但通常是有帮助的,而且经常是必要的。如果你已经在使用RAID 1,很少有理由故意将交换分区放在其他位置。

RAID 1上的交换分区可能性能更好

预计在RAID 1上放置交换分区的性能会比单独放置在RAID之外的交换分区要好,但不如设置了相同优先级的两个交换分区。

写入RAID 1有时比写入单个磁盘慢,因为所有数据都必须同时写入两个磁盘。通常情况下,并不真正慢,减速的影响可以忽略不计。如果你在同一个IDE控制器上有两个磁盘的RAID 1,它会慢一些。但是当访问一个磁盘不会减慢对另一个磁盘的访问时,写入RAID 1的速度不会显著变慢。

从RAID 1读取数据几乎总是比从单个磁盘读取更快,因为当一个磁盘正在读取时,可以从另一个磁盘读取更多数据。从由两个驱动器组成的RAID 1中读取数据通常比从单个驱动器中读取数据快几乎两倍

我不知道有任何测试可以比较在RAID 1(或任何其他RAID)上的两个独立交换分区和一个单独的交换分区。没有理由认为一个单独的交换分区会表现得和或更好于RAID 1上的交换分区。如果你有两个分别位于不同磁盘上的交换分区,情况就更加复杂了。
如果在/etc/fstab中给予交换空间不同的优先级,将会将不同的页面交换到它们;同一个页面不会同时交换到两个位置。我预计,对于同时访问不相关的交换数据,使用两个交换空间会更快,但是对于访问单个页面来说会更慢。
如果在/etc/fstab中给予交换空间相同的优先级,即使是从单个页面提取的数据也会进行分条处理。这类似于RAID 0,并且很可能比将交换空间放在RAID 1上表现得更好。
理论上,如果你有一个硬件RAID 1,软件分条处理可能效率较低,但除非你有一些特殊的应用程序,在这些应用程序中从交换空间读取远远超过写入,否则我预计非RAID软件分条处理的交换空间性能将优于RAID 1上的交换分区。
(由于内核可以在多个交换分区之间进行分条处理交换数据,所以没有必要为了交换空间而设置软件RAID 0。)
请参阅维基百科条目“标准RAID级别”的此部分,了解关于RAID 1性能的更多信息。
感谢gertvdijk提供关键重要的关于条带交换的信息。
你真的需要在RAID 1中使用交换空间
是否需要将交换空间放在RAID 1上取决于你首先为什么需要RAID 1。交换空间中的数据通常是高度易变的,并且丢失它通常不会造成重大资产损失。然而……
RAID(除了RAID 0)的一个好处是,如果一块硬盘损坏,你的计算机仍然可以继续运行(只是速度会稍慢)。如果你正在运行的程序已经将页面交换到磁盘上(如果启用了交换分区,这几乎总是情况),那么包含交换分区的硬盘(无论是否是唯一的交换分区)损坏,并且没有冗余备份,你的系统将立即停止工作(并且可能完全无法使用,直到重新启动,这取决于交换分区的使用方式)。如果你将机器用作生产服务器或其他重要任务,将会导致停机时间
如果你可以容忍单个常见不良事件(一块硬盘故障)导致整个交换分区失效,你应该问问自己为什么要使用RAID 1。你可能有一个很好的答案...也可能没有。RAID(除了RAID 0)可以防止硬盘故障,但RAID不是备份解决方案。如果在RAID上更改或删除文件,或者恶意软件感染了RAID上的系统,这些更改将立即在所有地方生效--RAID无法帮助你从中恢复。
如果你需要的是备份而不是冗余,并且你还没有一个高度可靠、易于访问的备份,那么你应该完全将其中一块硬盘从RAID中取出,并将其用于备份。(当然,有时也需要有离线备份。)
如果你将计算机休眠(即挂起到磁盘),RAM的内容会被复制到交换分区。因此,如果在磁盘故障发生时你的机器处于休眠状态,你实际上可能会丢失数据。

很好的回答,@Eliah。我对RAID-1的动机来自过去磁盘故障的经历 - 我的备份拯救了我免于数据丢失,但我仍然需要安装新的硬盘并重新构建机器,这需要时间。通过这种方式,我可以在降级阵列中保持工作设置,并安装新的硬盘来重建阵列。 - LRE
@LRE 当数据丢失的原因是驱动器故障时,您的RAID只能起到备份的作用。这是RAID的一个完全可接受的用途,但请确保您还有单独的备份来防范其他常见的数据丢失原因。 - Eliah Kagan
“RAID 1 上的交换可能表现更好”并不完全正确。请参阅此wiki.kernel.org页面:“如果您只是在/etc/fstab文件中给它们相同的优先级,内核本身可以在多个设备上进行交换分片。”据我所知,将交换放在RAID之上纯粹是为了提高可用性。 - gertvdijk
@gertvdijk 谢谢,我已经编辑过了,将那些信息融入其中。我之所以说用RAID 1来进行交换可能性能更好,是因为它很可能比单个交换分区(非RAID)的性能更好;我已经缩小了声明的范围,并增加了详细说明。 - Eliah Kagan
@EliahKagan,是的,我明白这一点,并且我有备份(过去它们曾经救了我的命)- RAID-1 是为了补充备份而存在的。 - LRE
如果你将计算机休眠(即挂起到磁盘),RAM 的内容将被复制到交换分区中。关于这个信息你在哪里看到的? - nsn
@nsn 请参阅为什么需要交换空间?SwapFaq(以及该页面上的其他位置)。有关实际复制哪些数据和不复制哪些数据的信息,以及支持正常Linux休眠将数据从RAM存储到交换分区的另一个来源,请参阅计算机休眠时交换空间中的数据会发生什么?(以及Gilles在那里的回答)。 (顺便说一句,好问题。我也正在添加一个链接到帖子。) - Eliah Kagan

高级安装部分在Ubuntu Server文档中描述了在软件RAID 1阵列上的安装。从我所看到的,他们也在RAID上创建了一个交换分区,所以这几乎是一个“推荐”的布局。

然而,从纯理论角度来看,使用RAID 1作为交换分区可能相对于“正常”分区提供的好处较少 - 交换分区上的数据更或多或少是易失性的,因此在磁盘故障的情况下,您不太可能丢失大量数据,尽管如果交换分区突然失败,可能会导致进程崩溃或系统重新启动。

从性能角度来看,使用RAID-0或两个单独的非RAID分区可能(或可能不)更有意义,如果您关心性能,您可能需要进行一些基准测试。

此外,所有这些只有在您的系统严重受限于RAM并且交换被大量使用的情况下才会影响性能。增加更多的RAM并完全删除交换将是一种终极解决方案,无论是从性能还是可靠性的角度来看 :)


转换为RAID 1 [确实有很多意义]。 - Eliah Kagan