交换分区与文件以提高性能?


62

什么对性能更好?靠近磁盘内部的分区访问速度较慢,我们必须等待驱动器在操作系统分区和交换分区之间切换。

另一方面,交换分区绕过所有文件系统,允许直接写入磁盘,这可能比文件快。

性能折衷是什么?

固定大小的交换文件有多少不同?

切换到交换分区是否需要更长的时间,但是如果它位于交换分区上,则性能会更好(如果它曾经是交换文件)?


只是出于好奇。您能否提供系统详细信息,例如内核版本,RAM,分区和文件系统方案?
维吉

您正在寻找什么操作系统?
Mathieu Chateau

4
有关Linux的信息,请参见lkml.org/lkml/2005/7/7/326
Adam Monsen

问题答案有更新吗?
kokbira

Answers:


29
  1. 在硬盘上,吞吐量和查找通常在磁盘开始时会更快,因为数据存储的位置更靠近磁盘的外部区域,即每个柱面有更多扇区。因此,在磁盘的开头创建交换可能会提高性能。

  2. 对于2.6 Linux内核,交换分区和未碎片化的交换文件之间没有性能差异。当swapon启用交换分区/文件时,2.6内核会找到交换文件存储在哪个磁盘块上,因此,当需要进行交换时,它根本不必处理文件系统。

因此,如果交换文件没有碎片,就好像在同一位置有交换分区一样。或换一种说法,如果您使用原始交换分区,或使用文件系统对其进行格式化,然后创建一个交换文件以填充所有空间,则将获得相同的性能,因为无论哪种方式,该磁盘上都有一个用于交换的连续区域,内核直接使用。

因此,如果在文件系统新鲜时创建交换文件(从而确保它没有碎片并且在卷的开头),则性能应与在卷之前具有交换分区相同。此外,如果创建了交换文件的对象在卷的中间说,而在文件的两侧,则可能会获得更好的性能,因为交换的机会更少。

在Linux上,如果交换文件是无碎片地创建的,并且从未扩展,则它至少在ext3 / 4之类的普通文件系统中不会碎片化。它将始终使用连续的相同磁盘块。

我得出的结论是,专用交换分区的唯一好处是在需要扩展时可以保证不碎片。如果您的交换位置永远不会扩展,则在新文件系统上创建的文件不需要额外的分区。


5
唯一要添加的是,如果将计算机配置为“挂起到磁盘”,则实际发生的情况是将内存中的内容写入交换区。为此,交换必须位于其自己的分区上,因为交换不能在活动文件系统上进行。因此,如果您有服务器,则可能不使用此功能,并且可以愉快地使用交换文件。如果您有一台笔记本电脑,则可能需要交换分区,以便能够“挂起文件”以进行休眠。
内森·沃森

@ NathanS.Watson-Haigh已经交换的数据会发生什么?它不能被扔掉。
XTF

3
@ NathanS.Watson-Haigh您可以链接一个源吗?Ubuntu 17.04默认使用交换文件。如果它不能“暂停到磁盘”,那将是令人惊讶的。
马提亚斯·韦勒

22

实际上,只要您不使用稀疏文件,它并没有太大的区别。

使用dd创建一个“普通”文件将在一次运行中分配该文件(如果可能的话),而创建一个稀疏文件将告诉您您有一个10GB的文件,但实际上并没有用完所有空间。我不确定mkswap是否会分配空间,但是交换文件通常会随着时间增长,因此不会分配连续的扇区(作为磁盘的一部分),而是根据需要分配块,从而导致随着时间的流逝碎片化(当然取决于磁盘的使用情况)

在内部,Linux内核将或多或少地直接访问交换文件的基础块-我现在无法找到该链接的内幕,除非有人会找到更多官方的信息,否则您必须信任我。我现在能想到的是:

所有这些仅适用于2.6系列Linux内核。

如果要获得最佳性能(那是什么,真的吗?...交换速度很慢,需要一段时间。增加RAM,以便不交换以获得最佳性能),则需要使用分区。


18
现代版本的swapon将完全拒绝使用格式为swap的稀疏文件,理由是该文件有孔。
Tim Post

3

这是一个有趣的问题,并且已经阅读了很多有关该问题的文章。通常,由于基础文件系统的原因,交换分区比文件分区要好。但是,如果您始终需要增加交换大小,那么文件是一个更好的选择。在内核2.4之前,人们一直认为交换分区比文件快,但是现在随着内核2.6的改进,性能几乎相同。

我也在互联网上找到了一些东西。

http://www.go2linux.org/swap-file-vs-swap-partition

http://www.sunmanagers.org/pipermail/summaries/2005-November/006913.html


但是,这些链接都没有真正解释其决定的原因。
比尔·格雷

原因是该文件将具有其基础文件系统过载。如果创建文件,则可能会造成碎片。并且取决于交换时缓存的文件,与整个分区本身是交换文件系统相比,读取速度可能较慢。
维吉

试图进一步挖掘并在Wiki上找到相关文章。只是为了帮助您,您可以检查一些交换调优参数。另外,请查看Linux实施下的说明。可能有帮助。 en.wikipedia.org/wiki/Paging
Viky

遵循上述Wiki链接中的一篇引文,发现了关于同一问题的有趣话题。可能想检查一下。lkml.org/lkml/2005/6/28/427
Viky

我在我的问题中提到了文件系统过载,但是它与内部磁盘附近的分区相比,并不是一个性能块。该延迟将比文件系统的开销大。
比尔·格雷

2

我认为,在目前的阶段,除非您运行的笔记本电脑的配置在挂起/休眠时将数据写入交换区,否则交换区实际上应被视为“万不得已”。最好的选择是将足够的RAM放在一个盒子中,以便它永远不会分页到磁盘。

话虽这么说,但从性能角度来看,分区可能是更好的方法,尽管文件更灵活。只要确保它在7200+ RPM主轴上即可。


1
当访问时间更多地成为延迟因素时,为什么分区会在性能上更明智?
比尔·格雷

5
由于使用文件可能需要更多的头部移动,因此,当找到要读取/写入的页面时,数据可能位于文件系统上的任何位置,因此可能需要搜索fs结构,而使用交换分区时,每个页面都将位于文件系统中的已知位置。划分。这使得访问时间(与批量吞吐量有关)成为差异化因素。
David Spillett

2
有争议的观点是“除非需要休眠,否则不要配置交换”。有时,当系统的实内存不足时,交换可以使系统恢复。没有交换可能会限制您运行的程序分配大量内存,但实际上并未涉及其中的大部分内容(例如某些调试工具)。有时,占用的但空闲的内存区域最好用作磁盘缓存,只有在有可用交换时才能进行这种折衷。有关讨论,请参见unix.stackexchange.com/questions/2658/…
Anon

1
@Anon说了什么。Chrome是一个臭名昭著的内存消耗者,即使使用<100个选项卡,当内存利用率约为90%并且没有交换文件时,我的16GB笔记本电脑在几分钟内仍无响应。令人惊讶的是,Ubuntu没有内置的机制来警告用户该操作系统内存不足
Dan Dascalescu

2

我们的工作思路是,由于Swap文件可能会变得碎片化,并且碎片化会减慢交换访问,因此分区是一种更好的方法。当然,定义一个静态大小的交换文件的功能大致相同,但这在主观上看起来更加整洁。

这是一种正确的方法吗?可能不是,因为这种做法是在10年前建立的。在过去的几年中,驱动器技术的唯一重大变化是我们使用的RAID控制器的复杂性(对于SSD来说,我们还不够丰富)。驱动器大小的增加意味着,与18GB驱动器出厂时的情况相比,我们创建的交换分区更接近驱动器的起点,因此交换速度甚至比以前更快。

当然,在我们基于ESX的Windows系统上,交换文件的位置完全没有意义。交换文件和物理磁盘盘片之间有太多的虚拟化层,这无关紧要。但是我们将其保留在单独的分区上,因为这只是标准。


4
交换文件不会变得零散,因为内核使用直接的mmap方法,并且永远不会增大或缩小文件。尽管您对虚拟化发表了+1的评论:但这通常并不重要。
parasietje 2014年

0

使用交换文件可能需要一点额外的内存来进行文件到内存的转换。我们正在谈论的是每1GB交换少于1MB的内存。文件系统缓存不缓存交换的数据,仅缓存组织数据,这应该是大多数额外的内存需求。

除此之外,我怀疑您是否会失去任何合理的性能,除非可能是单次额外搜索的1000倍。

有趣的事实是,将zswap与动态扩展的交换文件一起使用可显着提高交换操作的速度,而无需使用它们的成本却非常低。


1
您可以为您的索赔提供任何理由吗?这似乎很有趣。
奥斯丁2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.