我有16GB的RAM。我需要32GB的交换空间吗?

我在很多地方看到一个经验法则,即交换空间应该是物理内存的两倍。然而,32 GB 看起来确实很多。我需要那么多吗?在有这么大量的物理内存的情况下,我是否需要它?

92说实话...你根本不需要SWAP,因为你已经有16GB的内存,除非你真的认为你会用完内存,否则你不需要它。 - Uri Herrera
谢谢Uri,我觉得你可以把这个作为一个答案添加进去,这样我就可以接受了,除非有人过来并且证明不同的观点。这正是我所想的,我只是想确保一下。 - Tamás Szelei
69那个“经验法则”起源于大多数个人电脑只有几兆字节的内存时代。它在过去的10年里已经失去了意义,但是它就是...死不了! - Nicholas Knight
@Nicholas,完全正确。 - Uri Herrera
23@TheX:也许几年后当人们看到你的评论时会笑出声 :) - Benoit
1虽然这两个问题相似,但另一个问题没有提到冬眠... - Ashu
在/etc/sysctl.conf中,"vm.swappiness=0"是什么意思?这个选项只会在内存不足时才进行交换。顺便说一下,交换空间应该不超过8G,以免浪费空间,如果你使用的是SSD硬盘,4G的交换空间应该就够了。谢谢。 - Mustafa
@UriHerrera - 无论你有多少内存,交换空间都是绝对需要的。 - warren
@warren 为什么要这样做?交换空间的目的是为了:1)在内存不足时提供虚拟内存,以便使用;2)休眠和挂起功能。如果你不需要这两个功能中的任何一个,那就不是必需的,这也是原帖和最初问题的情况。 - Uri Herrera
@UriHerrera - 很多应用程序都依赖它(包括JVM)。 - warren
@warren JVM使用大量虚拟内存,正如其名称所暗示的那样。就我个人而言,我不使用JVM,所以也不需要交换空间,但这只是针对我而言。阅读原始未经编辑的问题,你会发现提问者之所以问这个问题,是因为在先前的评论中提到了一个“经验法则”,即如果你有大量的RAM,就需要具有如此高的交换空间,所以,提问者也不需要交换空间。另外,我猜测有一种方法可以让JVM使用真实的RAM而不是虚拟内存,但这只是这个问题的离题内容。 - Uri Herrera
@UriHerrera - JVM不是唯一需要交换空间才能运行的应用程序,VirtualBox和许多其他应用程序也需要。简而言之,当添加交换空间如此廉价时,为什么不在系统上放置交换空间呢? - warren
@warren 我很确定软件运行时不需要交换空间,至少我确定Vbox不需要。因为交换是在磁盘空间上运行的,如果有足够的RAM来运行所有内容(更快),为什么会有人想使用交换(比RAM慢)呢?除了我已经说过的。 - Uri Herrera
@UriHerrera - 有些应用程序接管了通常由操作系统执行的任务,并强制将自己退出到交换空间,然后再重新加载回来。 - warren
@warren 如果在如今这个时代的软件仍然需要使用交换空间而不是实际的内存,那就存在问题了。我的意思是,内核本身并不需要它,甚至还有一个选项可以选择不使用它,为什么其他不那么重要的东西会需要它或者使用它呢?刚刚看了一下Ubuntu FAQ关于交换空间的内容和这个问题 - Uri Herrera
@UriHerrera - 不是在争论它应该需要。但事实仍然存在一些需要的情况。 - warren
@NicholasKnight 烦人的是,这个“经验法则”在Ubuntu磁盘空间指南中有提到,并且链接在主要的图形化安装指南中。 - icc97
1其实我意识到情况并不那么糟糕,swap的意思是RAM而不是2倍RAM。 - icc97
@warren听起来对我来说是个糟糕的设计(作为一名程序员),强制使用交换空间进行堆分配... 我指的是应用程序和操作系统都允许应用程序管理它,这是一个糟糕的设计。我真的不相信会发生这种情况,如果有相关参考资料,我会非常感激。我自己没有找到任何相关信息。 - GabrielF
@GabrielF - 我在4年前的博客文章中详细阐述了这一点,并且该文章引用了这个Sun bug报告 - warren
@dn-ʞɔɐqɹW 我相当确定如果它们是重复的,那么可能正好相反。我的问题是在2011年提出的,而另一个问题则是在2015年提出的。这个问题还引用了这个问题,并解释了为什么它们不一样。 - Tamás Szelei
@TamásSzelei:是的,但是你问题上的答案现在已经过时了,所以我想要一个相反的重复问题。另请参阅官方Ubuntu文档 - Fabby
@dn-ʞɔɐqɹW 好吧,但你为什么认为它已经过时了?有什么改变吗? - Tamás Szelei
抱歉,我还在编辑评论。请阅读官方的Ubuntu文档,你就会明白了。 - Fabby
@dn-ʞɔɐqɹW 你链接的页面上的建议大致与这里的大多数答案相同(即RAM的平方根)。所以,再次问一下,你认为有什么改变吗?请不要再链接另一堆文字,直接明确陈述你的观点。 - Tamás Szelei
找出来!看看我的方法在这里:http://unix.stackexchange.com/questions/190398/do-i-need-swap-space-if-i-have-more-than-enough-amount-of-ram/190534#190534 - Elder Geek
@ElderGeek:你的回答是我找到的最正确的。它取决于使用情况,这正是我试图强调并以数学为基础的地方。有很多不同的观点,但大致应该在round(sqrt(RAM))和2*RAM之间(对于128GB RAM系统来说,介于11GB和256GB之间)。内存越大的系统越难计算出“最佳值”。如果我抄袭你回答中的一些想法(即“测试它”),你介意吗? - Fabby
@TamásSzelei:再次阅读其他问题和答案。你的问题是关于32GB RAM的,而且有很多回答,所以信息分散在各处。那个问题更通用,还询问了“为什么”,答案提供了一些这里没有找到的信息,所以我认为你的问题应该复制到那个问题上,但是社区将决定 - Fabby
1随意。我正在进行进一步的研究和测试,关于使用zram作为交换空间(这将抛弃之前的所有计算),但改变使生活有趣。我对一个zram驱动做了基准测试(它们显示在磁盘中),获得了1GB/秒的速度。SSD甚至硬盘都无法与之相比。 - Elder Geek
@ElderGeek:有空的时候来聊天吧:我对你的研究很感兴趣(或者在这里发布一个问答)。 - Fabby
@dn-ʞɔɐqɹW 你刚刚改变了你的论点,并且一再没有支持之前的论点(之前你说这里的答案已经过时,现在你又说其他问题更通用)。尽管这个问题并没有明确要求解释,但它确实有很多解释性的答案。我对你们真是感到困惑。看一下编辑历史,看看为什么这个问题特指16GB内存(不是32GB,就连你是否真的读过它都让我怀疑)。 - Tamás Szelei
@dn-ʞɔɐqɹW 社区当然会关闭这个问题,只是时间的问题,因为网站上没有“反对关闭”的投票。 - Tamás Szelei
1我有6GB内存且没有交换空间,对于IDE编码、Unity3D和2GB的VirtualBox同时运行来说足够了。 - Suici Doga
22个回答

这是来自Red Hat的一个非常好的推荐:推荐的系统交换空间
同一链接中的摘录如下:
在过去的几年里,推荐的交换空间量与系统中的RAM数量成线性增长。然而,现代系统通常包含数百GB的RAM。因此,推荐的交换空间被认为是系统内存工作负载的函数,而不是系统内存本身。
还有另一个来自页面旧版本的摘录:
然而,考虑到交换空间通常在安装时指定,并且很难事先确定系统的内存工作负载,我们建议使用以下表格来确定系统的交换空间。
RHEL 8表格:
Amount of RAM    Recommended swap space       Recommended swap space 
in the system                                 if allowing for hibernation
--------------   --------------------------   ---------------------------
⩽ 2 GB           2 times the amount of RAM    3 times the amount of RAM
> 2 GB – 8 GB    Equal to the amount of RAM   2 times the amount of RAM
> 8 GB – 64 GB   At least 4 GB                1.5 times the amount of RAM
> 64 GB          At least 4 GB                Hibernation not recommended

在上面表格中列出的每个范围之间的边界上,例如具有2 GB、8 GB或64 GB系统RAM的系统,可以根据选择的交换空间和休眠支持来行使自由裁量权。如果您的系统资源允许,增加交换空间可能会提高性能。建议对于具有超过140个逻辑处理器或超过3 TB RAM的系统,至少需要100 GB的交换空间。
Amount of RAM in the System     Recommended Amount of Swap Space
4GB of RAM or less              a minimum of 2GB of swap space
4GB to 16GB of RAM              a minimum of 4GB of swap space
16GB to 64GB of RAM             a minimum of 8GB of swap space
64GB to 256GB of RAM            a minimum of 16GB of swap space
256GB to 512GB of RAM           a minimum of 32GB of swap space 

83内存的平方根(以GB为单位),向上取整至2的幂次方。 - starblue
2新表格中存在不一致之处-根据指南,32GB系统适合16GB的交换空间,而64GB系统适合4GB的交换空间... - Charlie
2@Charlie 这是因为你使用64GB的内存,几乎不太可能用完工作内存。 - paddotk
@Charlie 不是关于系统内存的数量,而是关于可能耗尽系统内存的概率以及这种不足有多大。 - Phill Healey
除了交换速度之外,32 GB 系统带有 16 GB 交换空间和没有交换空间的 48 GB 系统之间有什么实际差别?因为似乎每个人都建议无论内存多少都应该有交换空间... - Cole Tobin
1@ColeJohnson 实际区别在于,如果你在32GB的系统上内存用尽了,还有一些缓冲区剩余。一旦系统开始交换,它就会变得明显不响应,你就有机会进行调查。而对于48GB的系统而言,没有交换空间,你拥有更多时间/内存来正常执行,但一旦空间用尽,内核就开始终止进程。在典型的终端用户系统上,一旦开始交换,你可能最终会重启,所以几乎没有什么区别。但是对于处理重要工作负载的服务器来说,保留缓冲区是有意义的。 - a2800276

这完全取决于您打算如何使用这台机器。例如,如果它是一台Sap服务器,那么是的,我会增加32GB的交换空间(我们在工作中有128GB内存和32GB交换空间的机器)。如果您要处理大型图片和视频,那么有一点交换空间是有意义的。32GB可能有些过剩。
但是我不会说完全不需要交换空间。
在极少数情况下,如果您的RAM用尽了——比如打开一个大文件,或者在Firefox中运行一个长时间的标签页,无论是什么原因,这时候您的内核OOM杀手将会启动并开始终止应用程序以释放内存。在这种情况下,很可能会丢失数据,因为应用程序被终止了。然而,如果您有一点交换空间,系统将会继续运行,获取交换空间并允许系统继续工作。当发生大量交换时,系统会变慢,您会注意到并进行调查,而不是等到所有交换空间都用尽。此外,硬盘非常便宜,所以为什么不设置交换空间呢?
任何人在不询问您实际上要用计算机做什么的情况下就说“您不需要交换空间”都是在做出假设。虽然您可能很少使用计算机来消耗内存,但最好在做出草率的判断之前询问一下您打算用它做什么。这是我个人的意见。

17你能详细解释为什么拒绝零交换吗?其他人似乎都认为除非我想要休眠(我不想),否则没有必要使用它。 - Tamás Szelei
我同意这取决于应用程序,但如果该应用程序在8GB RAM系统中需要8GB的SWAP,那么在16GB RAM系统中就不需要SWAP。 - Jochem
4@popey - 如果系统的交换空间用尽了,那又该怎么办呢?回到原点了。 - user
@popey,谢谢你提供的信息。但是你说的“你会失去数据”是什么意思? - db42
如果你有4GB的内存和1TB的存储空间,为什么不考虑将一部分磁盘空间用作交换数据呢?我并不是指永久性地将其用作交换文件/分区,而是作为最后的手段,以防止应用程序/数据被清除出内存。这种方法的缺点是什么呢? - user12753
13有一台配备8GB内存的系统,我可以说:每当我遇到一个程序失控并占用交换空间时,我的系统就会变得几乎无法响应。与其迫使进行不完全的重新启动,还不如让OOM杀手运行;如果你有这么多内存,除非你正在进行需要占用几GB内存的非常重型工作,否则你应该没问题。即使在进行繁重计算时,通常也有一种不需要使用交换空间的处理方式(这比在应用程序本身中合理处理大型数据集要低效)。 - Michael Trausch
6储存在硬盘上的空间可能很便宜,但在固态硬盘上却很昂贵;虽然不像直接附件存储(DAM)那样昂贵,但仍然不算廉价。 - Mircea Chirea
4如果您的系统使用了31GB的交换空间,并且您_需要_最后1GB,那它们可能会变得_非常_慢。依我之见,如果您经常需要超过2GB的交换空间,您应该安装更多的内存。 - Martin Schröder
嘿,Popey,能否再读一遍这个答案,并确保它是最新的吗? - Seth
2我不相信答案需要改变。作为一个测试(也是由于我收到的关于这个答案的负面反馈),我在我的16GB Thinkpad X220上运行了一段时间没有交换分区。在多次情况下,内存压力导致kswapd进程发疯(寻找交换分区),使机器完全无法进行IO操作,完全无法使用,而且频繁地进行磁盘交换。增加一小部分交换分区完全解决了这个问题。所以,我仍然坚持认为,“没有交换分区”并不总是正确的答案,无论你有多少RAM。 - popey
OOM killer是一个痛点,尤其当我有8GB的内存和2GB的交换空间时。系统会冻结,我不得不等待大约1个小时才能恢复正常操作... - kelalaka

啊,这篇帖子上的答案都太错了,在谷歌搜索“多少交换空间”时,这个帖子居然排在前面。

首先,一个很好的参考点是Ubuntu Swap FAQ

这个FAQ提到了一个重要的观点,但是没有人在这里提到(我强调一下)

有时候,一个大型程序(比如OpenOffice、Neverwinter Nights或者视频编辑器)会让整个系统需要额外的内存。这些大型程序在启动过程中使用的页面中,有相当一部分只用于初始化,之后就再也不会被使用了。系统可以将这些页面交换出去,为其他程序甚至磁盘缓存释放内存。在这些情况下,交换空间将被用来帮助系统处理额外的负载。

所以,交换不仅仅是为了休眠!这种活动,即交换未使用的页面,在某些情况下可能有益,但在其他情况下可能有害。有益之处在于它可以释放内存供系统在其他地方使用,但当交换过于激进时,会交换出您实际上想要的页面,这对于桌面系统尤其如此,因为应用程序可能长时间处于空闲状态,但用户仍然希望在将其重新启动时立即获得性能。控制这个过程的侵略性被称为“swappiness”。
Ubuntu Swap FAQ在什么是swappiness以及如何更改它?下轻描淡写地讨论了这个问题。Ubuntu系统的默认值是60,而FAQ建议桌面机器的值为10。
所以,我会说,除非你对系统的特定使用场景非常了解并且非常清楚可能产生的后果,否则绝对不要将系统完全取消交换空间,就像一些人在这个问题上建议的那样。在没有交换空间的情况下,如果发生内存不足的情况,系统将开始终止进程(通常是导致内存不足的进程)。个人而言,我不会在任何情况下运行没有交换空间的系统。

7给链接到常见问题解答点个赞,也感谢你在各种观点和个人经验中引入了一些理智。 - Marty Fried
2这个问题是,目前还没有这样的大型程序,而且你提供的链接正好与此相反。请查看这个链接:https://help.ubuntu.com/community/SwapFaq#How_much_swap_do_I_need.3F - Anwar
4为了减轻内存的负担,我更倾向于使用zRAM和swappiness=60,而不是传统的硬盘交换。 - Barafu Albino

可能不需要。如果你计划将电脑休眠(挂起到磁盘),那么你至少需要16 GB的空间。如果你不打算休眠,只需为交换空间留出几个千兆字节即可(最多4-8个)。

2我根本没有交换文件,并且可以很好地将我的笔记本电脑休眠/挂起。 - scribu
9@scribu 这听起来很有趣。我怀疑可能有一个交换文件,因为要完全关闭笔记本电脑(即拔下电源和取出电池),必须保存 RAM 的内容。 - bandi
12有16GB的RAM和4GB的交换空间,完全可以进行休眠:只要在进入休眠时使用的内存少于4GB即可。 - psusi
1@psusi Linux会尝试压缩内存。较少的交换空间=更积极的压缩。 - val is still with Monica

从我的经验来看,我可以说这样的话:
根据我使用4GB内存3年的经验,Ubuntu在进行一些非常密集的任务时,交换使用量大约为60MB。几周前,我开始使用一台有16GB内存的电脑,交换使用量一直保持在0%。我进行了多次编译、视频渲染和其他密集任务,交换空间从未发生过变化,甚至没有1KB的变化。
基本上,在Ubuntu中,你拥有的内存越多,你在任何任务中使用或需要交换空间的可能性就越小。16GB内存,甚至8GB内存已经足够了。我用16GB内存的电脑运行了8个Virtualbox虚拟机(每个虚拟机占用1GB到2GB内存)。我编译和渲染了一个720p的视频,即使在这些条件下,交换空间也没有发生变化。
话虽如此,在Linux系统中,两倍于内存大小的交换空间规则不适用,尤其是如果你拥有更多的内存。然而,你应该确保交换空间的大小与你的内存大小相等,或者如果你计划休眠,因为休眠的过程会将所有内容都保存到交换空间中,所以你需要一个与内存大小相等的最小交换空间。
另一个细节是,一些应用程序(并非全部)仍然会强制从交换空间中读取。因此,拥有一点交换空间是好的。完全禁用交换空间在内存不足或OOM的情况下非常糟糕。在这种情况下,如果您没有交换空间,内核就无法在不同的RAM应用程序使用之间进行交换,并最终开始关闭使用较少的应用程序。
如果对家庭台式机决策有所帮助,在更新了这个答案超过4年后,我使用了16GB、32GB和现在的64GB RAM PC。测试只使用128MB的交换空间表明,除非我想要休眠,否则我不需要更大的交换空间。我在云环境中使用它们,lxc、virtualbox、wine,你说得上来的我都用过。我用openshot、kazam、handbrake、audacity渲染视频。我使用gimp、blender、Inkscape甚至完整的LibreOffice套件。我甚至在steam上玩游戏,在所有这些场景中都没有使用到交换空间。当然,如果您以某种方式使用了全部的RAM容量,交换空间最终会被使用。但一般来说,您拥有的RAM越多,所需的交换空间就越少。
这只是我的个人意见。

1哥们,我喜欢你解释和体验的方式...这个回答太棒了。 - aidonsnous

不,只要你不使用像磁盘挂起这样的功能,你就不需要32 GB的内存。

在大多数情况下,我会说你根本不需要交换空间。也许如果你编辑非常大的图像文件或其他需要大量内存的应用程序,你可能需要一些。我从来没有看到过我的系统或你的系统上使用任何交换空间。事实上,有一次我意外禁用了它一两个星期,从未注意到任何问题。但我仍然保留了约5GB的交换驱动器,主要是因为我有超过1TB的可用空间,并且并不都用上了。

我记得曾经见过它的使用,当我使用五笔输入法并且进入了休眠模式时。 - Vladashram
2如果你使用休眠功能,那可能是有足够的交换空间来保存机器状态的一个很好的理由。我猜你可能永远不会需要超过可用内存的量,除非你在使用足够多的内存时已经在使用交换空间了。 - Marty Fried

如果你使用休眠功能,那么将交换空间设置为与你的内存大小相同是安全的。
关于设置多少交换空间的一般准则,请阅读这里:

https://help.ubuntu.com/community/SwapFaq

在你的情况下,我会说4 GB的内存足够与你的RAM相匹配。

如果您的内存高于1GB,通常对于Ubuntu来说已经足够了。"Swap = RAM x2" 规则适用于只有256MB或128MB内存的旧电脑。
因此,1GB的交换空间通常足以应对4GB的内存。8GB将会过多。

从Ubuntu的SwapFaq中:

为什么需要交换空间?

内存消耗型程序 有时,一个大型程序(如LibreOffice、Neverwinter Nights或视频编辑器)会使整个系统需要额外的内存。这些大型程序在启动过程中使用的许多页面可能只用于初始化,然后再也不会被使用。系统可以将这些页面交换出去,并为其他程序甚至磁盘缓存释放内存。在这些情况下,交换空间将被用来帮助系统处理任何额外的负载。

休眠(挂起到磁盘) 休眠功能(挂起到磁盘)在关闭计算机之前将RAM的内容写入交换分区。因此,您的交换分区应该至少与RAM大小相同。目前在Ubuntu中使用的休眠实现swsusp需要一个交换或挂起分区。它无法使用活动文件系统上的交换文件。

无法预料的情况 无法预料的事件可能会发生(程序失控,某些操作所需空间超出预期,或其他不可预测的事件组合)。在这些情况下,交换空间可以给你额外的延迟时间来弄清楚发生了什么,或者完成你正在进行的工作。
优化内存使用 由于机械硬盘比RAM(固态硬盘存储器SSD虽然不像物理硬盘那样慢,但仍然比RAM慢)要慢得多,当你需要一个文件(无论是像视频这样的数据文件,还是像Firefox这样的可执行文件或库文件),Linux内核会将文件读入RAM并保留在那里,这样下次你需要时,它已经在RAM中,数据访问速度更快。加速磁盘读取的RAM部分被称为“缓存内存”。你会注意到它们在响应性方面产生了巨大的差异。Linux内核会自动将程序保留但实际上未使用的RAM移入交换空间,以便更好地扩展缓存内存的用途。
优化交换空间性能。由于交换空间使用磁盘设备,这可能会导致在大量使用交换空间的任何系统中出现性能问题,因为同时需要进行交换操作时,系统本身也可能正在使用同一磁盘设备。减少此问题的一种方法是在不同的物理驱动器上设置交换空间,以便资源竞争要么降低,要么消除。
我需要多少交换空间? 对于少于1GB的物理内存(RAM),强烈建议将交换空间作为基本最小限度等于RAM的数量。此外,根据系统可用的硬盘空间量,建议将交换空间最大限度设为RAM数量的两倍,因为收益递减。 对于更现代的系统(> 1GB),如果您使用休眠,则交换空间至少应等于物理内存(RAM)大小,否则您需要最少round(sqrt(RAM))和最多两倍RAM的最小交换空间。拥有比实际使用的更多的交换空间唯一的缺点是你将为其保留磁盘空间。
“递减收益”意味着如果你需要的交换空间超过你RAM大小的两倍,最好增加更多的RAM,因为硬盘驱动器(HDD)访问速度比RAM访问速度慢大约10³倍,所以原本只需要1秒的操作,突然需要超过15分钟!即使在快速固态硬盘驱动器(SSD)上也需要超过一分钟...”
“示例场景”
    RAM(GB) No hibernation  With Hibernation  Maximum
      1      1                2                   2
      2      1                3                   4
      3      2                5                   6
      4      2                6                   8
      5      2                7                  10
      6      2                8                  12
      8      3               11                  16
     12      3               15                  24
     16      4               20                  32
     24      5               29                  48
     32      6               38                  64
     64      8               72                 128
    128     11              139                 256

1猜猜SwapFaq是从哪里来的? ;-) +1 - Fabby
很棒的回答 @Fabby +1 - Jebin Philipose