哪个对性能更好? 靠近磁盘内部的分区访问时间会更慢,我们必须等待驱动器在操作系统和交换分区之间切换。
另一方面,交换分区绕过所有文件系统,允许直接写入磁盘,这比文件更快。
性能权衡如何?
拥有固定大小的交换文件会有多大区别?
是否会出现这样的情况:更改交换分区的时间会更长,但是如果它是交换文件,则在交换分区上的性能会更好?
答案1
在硬盘上,吞吐量和寻道通常在磁盘开头处更快,因为数据存储在靠近磁盘外部区域的位置,每个磁柱上有更多的扇区。因此,在磁盘开头创建交换可能会提高性能。
对于 2.6 Linux 内核,交换分区和未碎片化交换文件。当 swapon 启用交换分区/文件时,2.6 内核查找交换文件存储在哪个磁盘块上,这样当需要交换时,它根本不必处理文件系统。
因此,如果交换文件没有碎片,则与在同一位置有一个交换分区完全相同。或者换句话说,如果您使用原始交换分区,或者使用文件系统对其进行格式化,然后创建一个填满所有空间的交换文件,您将获得相同的性能,因为无论哪种方式,该磁盘上都有一个用于交换的连续区域,内核直接使用它。
因此,如果在文件系统刚创建时创建交换文件(从而确保它没有碎片并且位于卷的开头),性能应该与在卷之前有一个交换分区相同。此外,如果在卷中间创建交换文件,文件位于两边,则可能会获得更好的性能,因为寻求交换的次数更少。
在 Linux 上,如果交换文件创建时没有碎片,并且从未扩展,则它不会产生碎片,至少对于像 ext3/4 这样的普通文件系统而言不会。它将始终使用相同的磁盘块,这些磁盘块是连续的。
我的结论是,专用交换分区的唯一好处就是当您需要扩展它时可以保证不出现碎片;如果您的交换永远不会扩展,那么在新的文件系统上创建的文件就不需要额外的分区。
答案2
其实只要你不使用,就不会有太大区别稀疏文件。
使用 dd 创建“普通”文件将在一次运行中分配文件(如果可能的话),而创建稀疏文件将告诉您有一个 10GB 的文件闲置但实际上并未用尽所有空间。我不太确定 mkswap 是否不会分配空间,但通常交换文件会随着时间而增长,因此不会分配连续的扇区(如磁盘的一部分),而是根据需要分配块,这会导致随着时间的推移出现碎片(当然取决于您对磁盘的使用情况)
在内部,Linux 内核将或多或少直接访问交换文件的底层块 - 我现在找不到链接,不知道内部发生了什么,除非有人能找到更官方的信息,否则你必须相信我。我现在能想到的只有:
这一切仅适用于 2.6 版 Linux 内核。
如果你想要最佳性能(那到底是什么?...交换速度很慢,就是这样。增加 RAM,这样你就不会交换最好的为了提高性能,您可能希望使用分区。
答案3
我认为,就目前的情况而言,除非您运行的笔记本电脑的配置是当其挂起/休眠时将数据写入交换区,否则交换区实际上应该被视为“最后的手段”。最好的办法是将足够的 RAM 放入一个盒子中,这样它就永远不会分页到磁盘。
话虽如此,从性能角度来看,分区可能是更好的方法,尽管文件更灵活。只需确保它位于 7200+ RPM 主轴上即可。
答案4
我们工作时的想法是,由于交换文件可能会变得碎片化,而碎片化会减慢交换访问速度,因此分区是一种更好的方法。当然,定义静态大小的交换文件可以做同样的事情,但这在主观上似乎更简洁。
这种方法是唯一正确的方法吗?可能不是,因为这种做法是近 10 年前建立的。这些年来,驱动器技术的唯一重大变化是我们使用的 RAID 控制器的复杂性(我们还没有足够富裕到使用 SSD)。驱动器大小的增加意味着我们创建的交换分区比 18GB 驱动器成为标准时更接近驱动器的起始位置,因此交换速度甚至比以前更快。
当然,在我们基于 ESX 的 Windows 系统上,交换文件的位置完全无关紧要。交换文件和物理磁盘盘片之间有如此多的虚拟化层,以至于它根本无关紧要。但我们将其保存在单独的分区上,因为这只是标准。