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

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

性能的折衷是什么?

具有固定大小的交换文件可以使磁盘多少钱?

是否可以将交换分区更改为更长的时间,但是在交换分区上,如果它曾经是交换文件,则性能会更好?

评论

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

您要在什么操作系统上寻找?

有关Linux信息,请参阅lkml.org/lkml/2005/7/7/326

问题答案是否有任何更新?

#1 楼


在硬盘上,吞吐量和查找通常在磁盘开始时会更快,因为数据存储的位置更靠近磁盘的外部区域,即每个柱面有更多扇区。因此,在磁盘的开头创建交换可能会提高性能。
对于2.6 Linux内核,交换分区和无碎片的交换文件之间没有性能差异。当swapon启用交换分区/文件时,2.6内核会找到交换文件存储在哪个磁盘块上,因此,在进行交换时,它根本不必处理文件系统。

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

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

在Linux上,如果创建了交换文件不会碎片化,而且永远不会扩展,至少在像ext3 / 4这样的普通文件系统中,它不会碎片化。我将得出结论,专用交换分区的唯一好处是,当您需要扩展专用分区时,可以保证不碎片。如果交换不会扩展,则在新文件系统上创建的文件不需要额外的分区。

评论


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

–内森·沃森(Nathan S. Watson-Haigh)
16年2月17日在2:36

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

– XTF
17年5月4日在9:57



@ NathanS.Watson-Haigh可以链接源吗? Ubuntu 17.04默认使用交换文件。如果它不能“挂起到磁盘”,那将是令人惊讶的。

–马特西亚斯·韦勒(Matthias Weiler)
17年5月18日在15:17

@MatthiasWeiler值得一试的是,我在Debian 10(Linux 4.19)上对其进行了测试,但是它没有用; boot.log包含简历:无效的恢复设备:/ swap。它可能是一个initrd限制,而不是内核限制,但我没有进一步探讨。

– marcelm
20-11-20在20:01

#2 楼

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

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

内部,Linux内核将或多或少地直接访问交换文件的基础块-我现在找不到链接发生在幕后,除非有人会找到更正式的东西,否则您必须信任我。我现在能想到的是:


关于slashdot的讨论
维基百科的分页文章
关于ubuntu的一些常见问题解答

这一切仅适用于2.6系列Linux内核。

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

评论


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

– Tim Post
2011年4月26日下午2:30

#3 楼

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

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

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



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

评论


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

–比尔·格雷
09年6月15日在3:47

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

– Viky
09年6月15日在4:04

试图进一步挖掘并在Wiki上找到相关文章。只是为了帮助您,您可以检查一些交换调整参数。还要检查linux下的实现说明。可能有帮助。 en.wikipedia.org/wiki/分页

– Viky
09年6月15日在4:08

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

– Viky
09年6月15日在4:29

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

–比尔·格雷
09年6月15日在5:00

#4 楼

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

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

评论


当访问时间成为延迟的主要因素时,为什么分区在性能上会更好?

–比尔·格雷
09年6月15日在3:23

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

– David Spillett
09年6月15日在7:26

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

–阿农
18年8月8日在8:33

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

– Dan Dascalescu
19年2月13日在8:47

#5 楼

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

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

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

评论


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

– parasietje
2014年3月20日在18:13

#6 楼

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

我怀疑您会失去任何合理的性能,除非可能是每1000倍一次

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

评论


您可以为您的索赔提供任何理由吗?这似乎很有趣。

–奥斯汀
15年7月15日在3:03