你可以有太多的交换空间吗?

我只是想知道是否可以有一个太大的交换分区。如果是的,那么什么时候交换分区会太大?即使我有足够的磁盘空间,拥有一个太大的交换分区会有什么不利影响?
如果不行,拥有超过推荐交换空间的好处是什么?

5明显的缺点是浪费磁盘空间。另一方面,如果你的系统上有“过多”的交换空间(比如在4GB的系统上有30GB),那么表现不良的应用程序将会在内存耗尽之前更晚地出现,并且这会拖慢你的系统。行为有序的应用程序(没有内存泄漏)根本不会使用它。(我承认,这只是一个简化的观点。) - PerlDuck
我同意@PerlDuck的观点 - "太多的交换空间"只会占用磁盘空间。如果系统开始使用交换空间,你的系统会变得很慢。在这种情况下,要么运行更少的应用程序,要么使用更轻量级的应用程序,或者增加更多的内存。 - Panther
我知道,所以如果你有足够的内存,除了占用过多的磁盘空间之外,还有其他的缺点吗?当然,像PerlDuck说的那样,除了“行为不端”的应用程序。 - An0n
1VTD 编辑中的所有问题都证明了将关闭原因从重复更改为主题过于宽泛是合理的。提问者显然有些生气,但元论坛或聊天室更适合讨论。 - WinEunuuchs2Unix
3如果有人对@PerlDuck(和Panther)所说的内容感到困惑,请注意,即使您拥有无限的磁盘空间,增加交换空间也会导致本应该被终止的进程,在自动终止之前会使系统变得非常缓慢,持续很长时间(参考链接:https://askubuntu.com/a/931644/22949)。我认为PerlDuck的评论也可以作为一个答案。如果我们重新打开这个问题,或许可以添加一个关于拥有远超需求的交换空间的缺点的答案。因为确实存在一些缺点。 - Eliah Kagan
我认为如果明确指定了低内存量,这个问题会更有趣。如果你的内存超过16GB,那么就没有必要设置太多的交换空间,太多只是浪费磁盘空间,但也没有什么坏处。 - FreeSoftwareServers
这个问题甚至与RAM无关,有趣的部分是RAM的答案。 - An0n
6个回答

乍一看,你可能认为交换空间越多越好,因为你可以将其视为增加内存的一种方式。实际上,它并没有真正“增加”内存,只是假装增加了:如果你有8GB的真实内存和配置了24GB的交换空间,那么你的程序可以分配和使用高达8+24=32GB的内存,这听起来一开始很不错。

但是

如果你运行的应用程序要么存在内存泄漏,要么并不适合在8GB内存下运行(比如视频编辑等),那么这些应用程序将开始使用交换空间,而交换操作是很慢的。交换空间被这些应用程序积极使用得越多,系统就会忙于将内存从磁盘中移动出来或者移回磁盘,这将严重降低整个系统的响应速度,给用户带来糟糕的体验。

最终,当交换空间耗尽时,一些应用程序将面临内存不足的情况,并被内核的OOM Killer杀掉。

来自维基百科

现代计算机中典型的OOM情况发生在操作系统无法再创建更多虚拟内存时,因为所有潜在的后备设备都已被填满。
结论
因此,拥有过多的交换空间的一个缺点是:你拥有的越多,这种OOM情况发生的时间就越晚,你将遭受更长时间的系统延迟和无响应。
另一个明显的缺点当然是浪费磁盘空间,但在现今可能并不那么重要。

+1 对于边缘情况的考虑。就个人而言,我不是一个热衷于交换的粉丝,因为冬眠是给熊的,而我的系统忙得太过繁忙了。;-) 干杯。 - Elder Geek
@ElderGeek 哈哈。实际上,Eliah Kagan 让我把我的简单评论变成了一个答案。他说服我,拥有太多的交换空间的前述缺点是一个关键问题,对其他人可能很重要。我和你一样,只配置了很少的交换空间(8GB RAM 的 2GB),几乎从不使用。 - PerlDuck
我在相似的设置下得到了类似的结果,我希望2倍交换(传闻)最终能够消失。 - Elder Geek
我们要密切关注这个问题,不能有任何泄漏。如果你的16GB内存已经不够用了,再增加4GB可能会有所帮助。在笔记本电脑上同时运行4个IDEA服务器、一个本地数据库和Teams,简直是自找麻烦。 - mckenzm

大型交换空间没有直接的缺点。由于内核对其进行管理,增加交换空间的数量超过所需量对性能几乎没有或者没有可观的影响。
“过多”交换空间的唯一缺点是无法将该空间用于存储。

老实说,我不认为这是一个缺点。因为你可以利用那个空间进行交换。 - An0n
1@An0n:我认为将目前连接到我的计算机上的全部约6 TB作为交换空间会有相当大的缺点。那我要把我的音乐放在哪里呢...? - David Foerster
取决于你是否能启动。 - An0n
2@An0n:如果一台电脑只能启动而无法存储任何有用的数据,那它有什么用呢?听起来更像是一台昂贵的取暖器。 - David Foerster
有什么用的数据,如果你无法启动呢? - An0n
2@An0n:当然,我也是这么想的,但你没有理解重点。我认为我们可以达成共识,一台有用的计算机必须能够达到可用的系统状态(包括能够启动),并且具备用户可以用于个人数据的存储空间。这就要求它不被交换空间占用 - David Foerster
我认为你没有理解我的观点。因为可用的系统状态是相对的,取决于你打算用它做什么。在系统设置中,你定义系统空间和存储空间。如果你需要额外的存储空间,可以添加它,这个问题是关于当前状态下的系统设置,而不是关于即将升级或需要多少存储空间的问题。 - An0n
2当然,这是相对的。就像“太多”一样,这也是相对的。如果我有一个可引导的系统,并且我将所有的空闲空间都分配为交换空间,那么在我改变系统配置以获得更多空闲空间之前,它对我来说就不再有用了。从这个意义上讲,在那段时间内,交换空间会成为“太多”,并使系统在那段时间内变得无用。无论如何,我不是来与你争辩词义的。 - David Foerster
1要強調這一點,交換空間是你不能用於其他任何目的的空間。磁盤存儲空間需要花錢。如果你的磁盤空間有限(我只有32GB),你會希望盡可能多地保持空閒,以安裝程序和寫入包含你的內容(如音樂)的文件。出於這個原因,人們通常會盡量減少交換空間的使用,並且沒有其他原因。交換空間是系統可能需要保持高效運行的一個要素,但對用戶而言無價值。通常情況下,我們希望系統僅使用必要的資源,並留下足夠的空間供我們使用。 - Zanna
@Zanna:完全同意。但问题是当你有足够的空间时,如何将Ubuntu设置为默认操作系统,并尽可能地进行最佳设置,这种情况下是否可以有太多的SWAP?例如,当你拥有1TB的硬盘时。 - An0n
@An0n:"充足"与"无限"之间仍然有很大的差距。只要一个资源的可用数量是有限的,总会存在这样一种情况:过度分配到某个目的会导致对其他目的的不足分配,从而使周围系统的某些部分无法高效地运行,达不到预期的效果。 - David Foerster

你不会感受到除了磁盘空间减少之外的任何其他不利因素,我认为在大多数系统中,现在2倍内存的概念已经过时了。不过,我通常建议在笔记本电脑上使用与RAM相同大小的交换内存,这样可以让您在休眠计算机时不会因为RAM的易失性而丢失任何数据。
唯一考虑使用超过1倍RAM大小的交换分区的情况是,如果您认为您将在短时间内升级RAM大小。或者如果您计划使用一种系统,在该系统中,您将以某种缓存方式存储程序在非同时使用的内存量。
希望我的观点足够清楚,并且我再次重申,我认为您拥有过多的交换内存不会遇到任何问题。
祝您有愉快的一天!

2如果单个用户的台式机内存大于2-4 GB,我根本不会使用交换空间。 - Panther
1@Panther 为什么不呢?这与你如何或何时使用它无关,而是与尺寸和用途有关。 - An0n
2你有没有考虑过内存泄漏的影响? - Elder Geek
@ElderGeek 嗨,我没有考虑过这个问题。我喜欢你的答案,我之前不知道有内存泄漏的问题! - zurg

什么是SWAP:

在Linux中,当物理内存(RAM)已满时,会使用交换空间。如果系统需要更多的内存资源而RAM已满,那么内存中的非活动页面将被移至交换空间。虽然交换空间可以帮助具有较少RAM的机器,但它不应被视为更多RAM的替代品。交换空间位于硬盘上,其访问时间比物理内存慢。

交换空间可以是专用的交换分区(推荐),也可以是交换文件,或者是交换分区和交换文件的组合。

交换空间应等于物理RAM的2倍。


优点:

当您的内存完全填满时,提供溢出空间 可以将很少使用的项目移出高速内存 允许您进入休眠状态

缺点:

占用硬盘空间,因为SWAP分区不会动态调整大小 可能增加对硬盘的磨损 不一定能提高性能(见下文)


当SWAP分区“无助于”(即“不值得与额外存储相比较”)时:
如果您的硬盘只有5400转每分钟的转速,并且您的RAM很少,比如大于2GB。 为什么?因为系统不断地想要访问SWAP分区,它最终会变得非常慢。即使您现在在内存中有空间,SWAP分区中的所有内容也需要被移回来。因为系统会变慢,很多东西都停留在SWAP分区中。这只能通过重新启动来修复。而重新启动本身也需要一段时间,因为系统在关闭之前需要清空SWAP分区中的所有内容。
**结论:**
如果您想要能够让您的计算机进入休眠状态,那么您应该拥有一个SWAP分区。这个分区的大小应该是您安装的内存大小加上额外的10-25%,以便为已经移动到SWAP分区的任何项目留出空间。
如果您只想要一点性能提升(并且您至少有一个7200转/分钟的硬盘),那么您可以添加一个SWAP分区,但除非您安装的内存小于4GB,否则不需要。这个分区的大小可以随意选择。然而,我建议将其设置为RAM的两倍。如果您有足够的存储空间。
如果您有一个5400转/分钟的硬盘,那么您不应该创建一个SWAP分区,因为瓶颈会使您的计算机变得更糟。然而,如果您绝对想要有SWAP,那么您仍然可以按照上述的大小指南创建一个分区 - 但将swappiness值更改为较低的值。

我的观点:

无论如何,如果您将Ubuntu用作日常主操作系统,我建议内存大小增加2倍。这是因为您使用Ubuntu并不仅仅是因为您有一台旧电脑,而是因为您想将该系统作为您的主要操作系统。

与其调整系统分区来保持其运行状态,不如购买一些额外的硬件(如果需要)。就像购买游戏时确保您的系统“最新”,而不是调整设置使其“可玩”。

您可以选择更多的空间、SWAP、速度和功率,而不是过短或之后需要调整一切。因为您需要SWAP或者空间,购买了内存?或者需要快速购买内存,因为一个内存插槽或条破损了。


关于你的结论 这根本就没有道理,或者换句话说,我们应该在哪里划定界限呢? 比如说,8GB的RAM加上16GB的交换空间: 如果我使用了8GB的RAM和9GB的交换空间,那么还是不够休眠的空间。 那么问题来了? 换句话说,无论你把它做多大,你仍然可以使用全部甚至更多。 那么为什么交换文件不能有两个专用空间,一个作为虚拟内存,另一个作为休眠空间,它们的总和就是其他两个的大小。 对我来说,这完全说不通,也没有人回答过这个问题。 - TheArchitecta

休眠真正需要多少SWAP?

有一种误解认为在使用休眠时,您需要RAM x 2来确定SWAP大小。实际上,SWAP大小需要是已使用的RAM而不是已安装的RAM的大小。通常,交换文件大小应为已安装RAM的2/5。要找出最低所需的RAM量:

$ cat /sys/power/image_size
3153907712

在这台8 GB RAM的机器上,需要至少3 GB的内存才能进行休眠。

您可以调整image_size值以减小交换空间的大小,但这可能会增加失败的风险。您也可以调整它以增加交换空间的大小并可能加快休眠速度。

参考链接:https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate


1995年的16MB RAM,2018年的16GB RAM有不同规则

在你拥有16MB RAM的时代,为你的720MB硬盘提供32MB交换空间是有道理的。在这篇1995年《华盛顿邮报》文章中可以了解一些RAM和硬盘的历史。

23年后,一些来自1995年的技术文章(尽管我没有找到任何)可能会误导新用户。然而,我确实找到了一篇2007年的文章,推荐使用SWAP = RAM x 2

回到1995年,760MB的硬盘中32MB的交换空间占据了硬盘的4%。确实,在1995年,交换分区可能被广泛使用。而在今天的2018年,对于256GB的固态硬盘来说,拥有16GB x 2的内存用于32GB的交换空间已经不再合理,因为它占据了SSD的13%。如今,我的8GB交换分区根本没有被使用,除非我强制将其填满以进行OOM-Killer测试:Google Chrome会占用我的内存,导致我的电脑几乎停顿。我该怎么做才能防止这种情况发生?

+1 对于经常被吹捧的2倍规则的误解进行指正,这完全是胡说八道。 - Elder Geek
@ElderGeek 谢谢。我增加了一个历史部分,介绍16 MB RAM乘以2得到32 MB SWAP可能是有意义的时间。 - WinEunuuchs2Unix
另一个需要考虑的问题是SSD与HDD。我们是否希望SSD进行大量的读写操作,从而加快SSD在该部分的故障速度(或者这只是一个谣言)? 在我的系统中,我使用了2GB的Velociraptor硬盘作为SWAP,但没有打算使用休眠功能,我仍然不确定这样做是否合适,可能我本来可以不设置SWAP?但如果我要休眠,也许4GB就足够了,但很有可能我会使用20GB的浏览器,那么4GB就不够用了吗? - TheArchitecta
@NZDev 我的交换空间存储在固态硬盘上,但很少使用。上次我检查时,经过一年的使用后,它仍然有100%的寿命剩余。要查看剩余寿命的百分比,请访问:https://askubuntu.com/questions/1038701/how-do-i-check-system-health/1038711#1038711 - WinEunuuchs2Unix

确实存在一些开销,但非常小;对于每个磁盘上的“页面”,都有一个引用计数器,并且与每个交换区相关联的是一对结构体;这些都在内核内存中,所以不能进行页面化。根据架构而定,每4GB的大小在2到16MB之间。其余部分相当动态,因此取决于使用情况。

因此,你可以有很多交换空间,但要记住页面化的地址空间本身对RAM会有一些开销,除此之外还会对交换页进行一些跟踪,因此它不能扩展得太远;即使带来了相当大的开销,文件系统在处理较大的区域时比交换区更高效,因为虚拟文件系统(vfs)可以将结构信息转移到磁盘上(通常至少无法交换页表,因为受硬件限制,并且虚拟内存管理器(vmm)可能会使用不可交换的内存进行所有的记录)。

我想不出其他任何缺点,另一方面,如果交换页面太少,可能会导致页面交换时的碎片化,这意味着需要更多的寻址。当拥有大量交换空间时,达到一定点后也不会有改进。

交换通常是最后的资源(休眠除外),所以如果你的RAM超过4GB,特别是你拥有超过4GB RAM,甚至和RAM一样大,你可能不会从拥有更多的交换空间中获益(考虑到64GB)。


抱歉,你最后一句话有点让人困惑,不过除此之外,是对上面的内容的一个很好的补充。 - TheArchitecta
@NZDev 现在好了吗? - Ismael Luceno
由于一些错误或错误,我在240GB SSD设备上创建了一个40GB的交换分区,而且并非有意为之。这是在一位客户的机器上,该机器配备了2GB的RAM。其余空间用于根目录 ("/")。我认为,没有其他持久性存储。据我所知,将SSD填满会对其产生危害,因此,这个大容量的SSD可能会有所用处,因为它可以防止SSD过度填充。但我怀疑,未使用的交换空间是否会被一些小数据片段稀疏地写入其中? - qdinar
阅读了https://askubuntu.com/questions/846163/does-swap-space-have-a-filesystem上的答案后,我认为没问题。 - qdinar