如果我有足够多的RAM,是否需要交换空间?


91

据我了解,Linux 交换分区的目的是从RAM中释放一些“不那么频繁访问”的信息,并将其移至硬盘驱动器上的特定分区(以使其读取或写入速度较慢为代价) ),从本质上允许活动应用程序使用更多的“高速内存”。

当您在具有少量RAM的计算机上并且如果用完时不希望遇到问题时,这非常有用。但是,如果您的系统具有16 GB32 GB的RAM,并且假设您没有在StackExchange上运行MySQL数据库或在Linux中编辑1080p全长电影,那么是否应该使用交换分区?


16
@mikeserv你知道,我很乐意接受这两个字母作为喜剧效果的答案。
IQAndreas

3
@Janis-花费很多。如果您实施了声音内存管理,那么即使在1GB的计算机上也无需交换就可以轻松完成。交换会提高性能-当拥有交换时,内核将不可避免地使用它。因此,在1TB或任何大小的磁盘上创建交换分区,是向内核发出了将内存页放入磁盘的邀请,而不是将其保留在RAM中或将其完全删除。使用16gb,典型的用户将永远无法使用所有功能- 在3天的正常运行时间后,我已经使用了24gb / 2gb的RAM和10gb的高速缓存(因为我将torrent放到/tmp
mikeserv

5
@mikeserv,我怕你错了;我一直在观察显示的磁盘指标。只要有可用内存,就不会使用交换,只有在内存已满时才开始交换。我认为这取决于您使用计算机的方式。每天晚上关闭的台式机系统很少会遇到内存问题,尽管我的系统有几个月的正常运行时间。是的,交换会提高性能,但是如果没有RAM空间,则系统可以继续工作。您有什么选择?也许您可以详细说明内存管理参数。我使用预配置的Linux系统。
Janis

40
@mikeserv您如何发表少于15个字符的评论?
immibis

11
@immibis有12 零宽度的空间在那里
戴夫

Answers:


98

是。

您绝对应该始终启用交换功能,除非有非常令人信服的令人讨厌的原因(例如,根本没有磁盘,或者仅存在网络磁盘)。您是否应该按照通常建议的荒谬大小(例如,两倍于RAM的数量)进行交换?好吧,

原因是,交换不仅在您的应用程序消耗的内存大于物理RAM的内存时才有用(实际上,在这种情况下,交换根本不是很有用,因为它会严重影响性能)。当今进行交换的主要动机不是将16GiB的RAM神奇地变成32 GiB,而是更有效地利用已安装的可用RAM。

在现代计算机上,RAM不会被闲置。未使用的RAM是您可能不应该购买并节省的钱。因此,任何你加载或任何因其他内存映射,任何可能可能被任何人任何时间后,再使用(通过安全条件的限制)被缓存。机器启动后不久,所有物理RAM都将用于某事

每当您从操作系统请求新的内存页时,内存管理器都必须做出明智的决定:

  1. 从缓冲区缓存中清除页面
  2. 从映射中清除页面(在大多数系统上与#1相同)
  3. 移动长时间未访问的页面(最好永远不会访问)以进行交换(实际上甚至可以主动发生,不一定在最后一刻发生)
  4. 杀死您的进程,或杀死随机进程(OOM)
  5. 内核恐慌

选项#4和#5是非常不可取的,只有在操作系统完全没有其他选择时才会发生。选项#1和#2意味着您扔掉了一些可能很快就会需要的东西。这会对性能产生负面影响。

选项#3表示您将(可能)很快不需要的东西移到了慢速存储上。很好,因为现在您需要的东西可以使用快速RAM。

通过删除选项#3,您实际上已将操作系统限制为只能执行#1或#2。从磁盘重新加载页面与从交换重新加载页面相同,除了通常不太可能需要从交换重新加载页面(由于做出了正确的分页决策)。

换句话说,通过禁用交换功能,您一无所获,但会限制操作系统处理内存请求时有用选项的数量。这可能不是,但很可能会是一个不利的(也永远不会是一个优势)。

[编辑]

认真阅读mmap 联机帮助页(特别是的说明)的读者MAP_NORESERVE会注意到另一个很好的理由,即使在具有“足够”物理内存的系统上,交换也有一定的必要性:

“当没有保留交换空间时,如果没有物理内存可用,则可能在写入时得到SIGSEGV。”

-等一下,这是什么意思?

如果您映射文件,则可以直接访问文件的内容,就好像该文件以某种方式魔术般地位于程序的地址空间中。对于只读访问,原则上操作系统只需要一个物理内存页面即可,每次访问不同的虚拟页面时,它可以用不同的数据重新填充(出于效率方面的考虑,这当然不行,但是原则上,您可以通过单页物理内存访问价值TB的数据。现在如果你写入文件映射?在这种情况下,操作系统必须具有一个物理页面(或交换空间),以准备写入的每个页面。在脏页写回过程完成工作之前(这可能需要几秒钟),没有其他方法可以保留数据。因此,操作系统会保留(但不一定要提交)交换空间,因此,如果您正在写映射而又没有物理页面未使用(这是很可能的,并且是正常情况),重新保证它仍然可以工作。

现在,如果没有交换该怎么办?这意味着不能保留任何交换(duh!),这意味着一旦没有可用的物理页面,而您正在写到页面,就会以过程接收的形式令人惊喜细分错误,有可能被杀死。

[/编辑]

但是,传统的建议是将交换空间增大为RAM的两倍。尽管磁盘空间很便宜,但分配这么多的交换空间没有意义。浪费便宜的东西仍然是浪费,而且您绝对不希望不断地换入和换出几百兆(或更大)大小的工作集。

没有单一的“正确”交换大小(“正确”交换大小与用户和意见一样多)。无论RAM大小如何,我通常都分配一个固定的512MiB,这对我来说非常有效。背后的原因是为512MiB的东西,你可以随时买得起的今天,即使在一个小的磁盘。另一方面,添加几GB的交换再好不过了。您不会使用它们,除非出现严重错误。

即使在SSD上,由于总线带宽和延迟的原因,交换的速度也要比RAM慢几个数量级,并且虽然可能不需要再次进行交换(尽管很可能不需要),但是移动某些东西还是可以接受的再次交换它,因此您的可用页面池将有效地免费扩展),如果您确实需要大量交换(即,您的应用程序使用例如50GiB数据集),则您会迷路了。

一旦您的计算机开始交换进出千兆字节的页面,所有内容都会进行爬网。因此,对于大多数人(包括我)来说,这不是一个选择,因此进行大量交换是没有意义的。


7
完全不正确:内核不使用磁盘可能是一个优势,特别是如果您已按照规范配置了OOM。如果将OOM杀手配置为处理清理,则这样做比浪费磁盘空间和降低计算机速度要好
mikeserv

22
有8 GB的RAM和8 GB的交换空间以及16 GB的RAM和无交换空间有什么区别?如果您的计算机认为它需要16.001 GB的内存,难道它不会以相同的方式开始清除/杀死事物吗(但是性能会在开始发生之前下降)。
尼克T

5
@NickT:交换不是为了更多的RAM,而是一个红旗,以至于某些东西很快就会被杀死。我喜欢在杀人之前有一个红旗,而不是让一个过程“随机地”消失在我眼前。
Mooing Duck

10
-1这个答案没有任何意义。为何慢速内存(交换)比相同数量的更快内存(RAM)具有更好的性能?在某些时候你不得不承认足够的内存意味着没有交换是必要的..
迈赫达德

14
@Mehrdad:确实有道理。较慢的内存(交换)可提高性能,因为“较慢”对于您很少访问或从不访问的内容无关紧要。通过移出“冷”数据,交换可有效地增加可用于“热”数据的内存量。每小时仅执行一次操作的守护程序或由默认加载但从未使用的内核模块分配的内存就是一个示例。您可以换出这些,也可以从缓存中删除页面。哪一个更好?
戴蒙2015年

50

我将不同意我在这里所说的一些观点。我仍然会创建SWAP分区,尤其是在生产环境中。我也为我的家用计算机和虚拟机执行此操作。

这些天,我将它们的大小调整为1-1.5倍的内存。2倍的记忆曾经是经验法则。交换磁盘是“便宜的”,因为它不需要备份或保护。

如果您的内存不足,那么交换空间将为您提供一点时间和缓冲来解决该问题。

意识到/ tmp之类的东西可以驻留在交换空间中。

交换区域可以保存部分内核转储,以便可以在下次重新引导时将其还原。这对于您将来需要进行的某些调试紧急情况可能会很好。


16
+1。进行交换意味着内存不足时性能下降与硬崩溃之间的区别。
Davidmh'3

6
@mikeserv不管您如何配置,如果您的程序尝试分配的内存超出可用内存的数量,则将导致崩溃,否则操作系统将开始杀死它们。
Davidmh 2015年

6
@Davidmh:因此,您的交换文件必须无限大,否则您的程序在耗尽交换文件时仍然会崩溃。
Mehrdad 2015年

6
@Mehrdad,但它也更昂贵。鉴于您拥有X GB的RAM,因为这是您力所能及的,因此对于某些合理的Y值(这将取决于您的使用情况和大小),它绝对比拥有X GB的RAM和y的交换更糟糕。您的高清)。
Davidmh,

9
“您的交换空间为您提供了一些时间和缓冲来解决问题” –这还意味着我必须在无响应的计算机前坐更长的时间,直到内存泄漏“解决”自身为止。
拉斐尔

23

也许:

我已经对该主题进行了很多思考,并且看到观点出现在论证两边的次数超出了我的估计。我的方法是开发一种找出答案的方法。

从您认为足够大的活动交换分区开始。

然后,在工作区中打开终端并发出命令free -hs 1,该命令将每秒报告一次使用情况。

(可选)切换到其他工作区。

做您可能会做的每件事,然后再做更多。一次运行所有常用应用程序,浏览多个选项卡,然后拼命尝试为系统提供实际锻炼,这可能意味着在运行编译操作并检查电子邮件或其他内容时重新编码1/2打视频。让我们面对现实,这一切都与如何使用系统有关。

当您感到系统处于高负载(或您可能获得的最高负载)之后,请查看终端并检查结果。或者最好通过添加>output.txt到命令来将输出重定向到文件,以便您可以检查完整运行。如果您使用的掉期从未超过Mem free,则不需要交换。如果可以,那么您可以。 free.png

我不需要交换 也许你会。为什么不找出来?

就规模交换而言,经验法则通常被高估,因为这是基于使用的问题。


2
那么,您是说交换仅在系统绝对需要时才使用吗?在这种情况下,启用交换功能是否会受到惩罚-以防万一?其他评论似乎表明,即使存在交换也会损害性能?
怀特先生

3
@ w3d不,我不是在说那个。从上面的输出中可以看到,即使不需要交换,也会使用swap。这可以通过交换因子进行一些调整。我说的是交换或不交换的必要性。
年长者极客2015年

swap可以在任何时候通过脚本向上递增交换free吗?
JFA

@JFA我还没看完。就我个人而言,我很难为此目的保留不确定数量的交换空间。从理论上讲,一切皆有可能。这是实现阶段,很有趣。
极客长老

17

注意:这是在特定的异常情况下发生的。如果要解决问题,这可能会很有用。我并不是说所有机器都必须交换。

也许!

过去,我在构建“设备”时遇到了问题,该设备在Linux上运行-在紧凑型闪存设备上运行,我不想使用swap来磨损CF,并且有足够的内存供应用程序使用。

这些电器大多数都能正常工作,但是在一个特别忙碌的盒子上,我遇到了一个问题:

内存碎片

没有交换空间,内存逐渐变得越来越分散,尤其是在长时间运行的进程中(即使我有很多可用内存,但内存都很小)。我放入了一些交换空间,并告诉Linux除非必要,否则不要使用它。这完全解决了问题。

除其他所有功能外,交换空间还使内存可以移动并对其进行碎片整理。如果内存碎片,并且需要一个大块,则碎片将被换出;当它们被换回时,它们会有效地进行碎片整理。

看看/ proc / buddyinfo-我的现在看起来像这样:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

数字代表不同大小的块;每个大小是下一个块大小的一半,从左侧的4mb块到右侧的4kb(即4mb,2mb,1mb等)。新启动的计算机应在左侧保留所有块,而在右侧保留很少的块(=未分段)。还要记住,相同的内存量(例如4mb)在各列中将被表示为不同的数字-最左边一列为1块,最右边一列为1024。

从尽可能远的池中分配内存;例如,如果您的程序想要一次存储12kb的内存,它将从16kb的列中获取它;其余的将出现在4kb列中。如果没有16kb的块,则它将取自32kb的块,从而剩下16kb和4kb,依此类推。

如果没有足够大的内存块,并且您有交换空间,那么例如,如果您需要16kb的内存,它将找到使用最少的16kb块(例如,可能包含4kb的已用块,4kb的可用块,和另外2个已使用的4kb块),仅移动USED部分进行交换,然后将释放的内存分配给新应用程序。

在崩溃的盒子中,我有成千上万的4kb和8kb块,除此之外没有多少。

我尽力告诉(崩溃的机器去!)内核将从内存移动到交换,再交换到内存,但是永远不会在内存之间移动。


3
您的案例看来是分配/实现大页面的好案例。它将避免碎片问题(因为一旦分配了一定大小的大页面,此后将永远永远仅以该大小再次分配它)
mikeserv

2
这就是我曾经读过的最好的理由,它赞成使用交换分区。我尝试了快速搜索,但没有找到相关参考,我想知道为什么不经常记录此功能。
To마SE

1
(非透明)大页面可能无法被您的应用程序使用。通常,需要大量内存的应用可以使用它们。例如,数据库服务器,java jvm。必须显式启用它们,它们将成为一个单独的内存池,不能用于其他目的。根据您的情况,这可能是好事,也可能是坏事。另外,了解透明大页面。它们试图四处移动,以便您使用巨大的页面(以提高性能),即使您的应用程序不知道如何操作。如果内存零散,那么大页面清扫程序还有很多工作要做。
丹·普里兹

1
我毫不怀疑您对Flash设备的使用经验,只是不相信您介绍的单个用例等同于可能需要交换,而且我仍然不相信内存碎片与是否进行交换有关。它的确提出了一个有趣的问题,可以轻松地对其进行测试,证明或证明。
年长者怪杰

1
后续问题。您所说的“内存碎片”是什么意思?MMU不在乎某个虚拟地址空间中用于连续页面的物理页面是否连续。物理页面是零散的,但这无关紧要(只要我们在单集群物理计算机上谈论普通的应用程序内存,而不是例如外围设备或系统管理程序使用的内存页面)。当程序要求16kB时,它会得到4页,这可能会或可能不会在物理内存中的任何地方靠在一起。
吉尔斯2015年

15

交换分区具有重要的价值,而不仅仅是在用完时充当一些额外的RAM。

首先,Linux使用尽可能多的内存来缓存文件和IO操作,如果进行一些交换,您可能会发现更多的内存用于缓存IO并使其更快(通过最小化磁盘访问并减少SSD的磨损)保留某些程序已分配但每12小时仅使用一次的数据,某些守护程序可能就是这种情况。

另外,Linux使用一种乐观的内存分配策略,即使不确定它是否具有实际的内存来填充页面,也可以通过该策略名义上分配页面。这比进行适当的检查和映射每个分配更为有效,并且通常不会造成任何问题。但是,内核用来确定允许分配是否合理的启发式方法包括系统上可用的交换级别,因此,即使系统使用的交换量不多,如果系统具有大量交换,分配可能会更快。

这些因素加在一起,使我个人认为最好在几乎所有普通系统上进行一些交换,但是对于较大的内存大小,我会忽略ram * 2规则,而只需将交换空间限制为4-8GB(取决于磁盘的大小) )。


9
甚至4GB对于台式机来说也太大了。如果发生问题,我宁愿先激活OOM杀手,然后再等待大量交换填充。(如果遇到了我需要更多的情况,我可以在运行任何需要比我的计算机具有更多RAM的虚拟内存的大型工作之前,先dd和mkswap一个交换文件。也就是说,如果退出我的Web浏览器不能释放足够的空间...)
彼得·科德斯

我完全理解@PeterCordes这可能取决于您正在执行的任务类型。就我个人而言,我发现我受益于高级别的交换,因为我经常在使用计算机时在后台以低优先级进行长时间编译,然后在内存不足的情况下(通常在计算机太忙而无法进行任何编译时)将这些交换掉无论如何)。不过,我同意这是一项非常个人化的工作量决定,应该在决定之前始终考虑自己的用法。

1
有趣的故事:就在今天,在我的笔记本电脑上,笔记本电脑具有4GB内存,0.5G交换(SSD),firefox触发了OOM杀手(它选择了firefox)。我以前从未发生过。(尽管我比平时更多地使用笔记本电脑)。几乎没有其他东西在运行(只是xfce中的gnome-terminal)。因此,我认为我可以接受,因为Firefox应该比捆绑这么多的RAM更了解。不久前,我看到有人说“存在用于对虚拟内存子系统进行压力测试的Web浏览器”,或类似的东西。Firefox是非常糟糕的,在释放缓存对于尚未被用于天制表符等
彼得·柯德斯

3
Linux认为可用交换空间的一种情况是大型进程尝试启动子进程时:fork()+ exec()系统调用首先大致复制了父进程的分配-内核无法保证新的子进程会更小比父母 通常不使用交换空间,但是除非有可用空间,否则fork()可能会失败。客户端上的一个典型示例是启动插件的浏览器,或者大型应用程序容器调用帮助程序时在服务器上。交换的1/2或1GiB通常足以解决问题。谷歌“ java exec无法分配内存”
詹姆斯

13

您的交换空间绝不能超过等待内核进行交换的最大容量。否则,您只是在为系统创建新的故障模式(交换时陷入无法恢复的泥潭)。请注意,尽管现代驱动器能够以GB / sec的数量级进行传输,但是Linux通常只能以每秒几百kB或最多几MB的速率移动交换。因此,巨大的交换可能会使您的系统在几分钟,几小时甚至几天内无法使用。

如果您有足够的物理内存来执行操作,则交换的理想大小是使其与正在运行但从未使用的“垃圾数据”进程数量相匹配。此范围可能在几兆到几百兆之间。这种策略允许您将所有物理内存用于缓存有用的信息,而不是永久存储那些可能永远不会再使用的数据。

如果没有足够的物理内存,则需要评估是否可以忍受大量交换带来的严重速度下降。如果是这样,那么最多有1-2 GB的交换空间可能是有意义的,如果您的驱动器非常快,则可能有多达4 GB的空间。但是,除此之外,还只会使系统的故障模式变得更糟,您应该考虑购买更多的RAM。


2
我认为这是最好的答案。如果交换空间过多,则由于所有交换,可能会使计算机完全无响应。这意味着您无法终止令人讨厌的过程。如果减少交换空间,OOM杀手将自动为您完成工作。关于文件缓冲区缓存的其他答案中的参数完全令人信服。您应该进行交换,以便内核可以将文件缓冲区移至交换...磁盘上的哪个?请。
Timmmm '18年

我可以找到的关于交换空间的唯一论据是:“某些程序泄漏内存”。和?如果OOM杀手杀死了您没有保存的重要内容,那么您实际上就失去了工作。这意味着该参数变得完全无关紧要,我可以强制关闭我的计算机以达到完全相同的效果,同时对于那些占用大量内存且经常被换出的低优先级任务仍然具有高交换空间。如果您的计算机陷入这种状态,那是您自己的错。发生在我身上的唯一时间是我自己编写一个程序来填充整个工作记忆。
ah速节

11

仅当您希望能够休眠以进行交换时(此功能也称为“挂起到磁盘”,涉及保存RAM的全部内容并关闭电源)。通常,此方法仅在笔记本电脑和其他移动设备上使用,因此要视情况而定。


6

没有通用而明确的答案,因为这取决于您将要执行的任务。如果您要运行数据库,HTTP,虚拟化或高速缓存服务器,则无论您拥有多少内存,都永远不要启用任何类型的交换。如果您拥有台式机或混合任务主机,并且具有16 Gb以上的快速RAM,请在此处查看:zRam


zRam是一个不错的选择。我已经将其与微型闪存驱动器系统结合使用,以达到良好的效果。
年长者极客2015年

1
@ElderGeek我还在无盘环境(例如网络启动)中使用了它。出色的工作,但有一些警告:首先,您不仅需要更多的内存,还需要快速的内存。缓慢而廉价的ram模块,可能会在通常的经典情况下为您提供服务,可能会导致问题。还必须考虑CPU前端总线:即使CPU频率较低但FSB频率较高也会大大改善性能。第二个问题是许多zRam交换分区。尝试从1到您的CPU核心数的数字。不要在单核系统上使用!
Alexey Vesnin

好的有效点全部。因为我是一个性能极客,并且总是设计和构建自己的系统,所以我个人并没有为这些问题所困扰
Elder Geek 2015年

@ElderGeek我也是:)认识你很高兴!我也注意到zRam行为中有一件奇怪的事情。它会在不同的内核版本和配置中出现和消失,但在内核HZ 100和1000上可以高度重现。zRam适用于1,2,4-但不能用于更多分区。即使在几乎是闲置任务的顶级硬件上,也可以在8和16个物理内核上使用。因此,请记住要进行调整!来自俄罗斯的问候!
阿列克谢·韦斯宁

我不同意“如果您运行数据库,则...永远不要启用任何类型的交换,而不管您拥有的RAM挂载如何”。交换通常比使用OOM杀手杀死随机进程更好。是的,您应该为正在运行的应用程序提供足够的内存,是的,使用大量交换可能会减慢您的系统速度。我羡慕您生活在理想的世界中。
AMADANON Inc.

5

无法知道是否需要交换空间,如果我们知道的唯一参数是安装的RAM数量。

在任何情况下,都有一个常见的误解,认为拥有交换空间会对系统性能产生负面影响。这是不正确的。只要您有足够的RAM,无论大小大小都有交换区都不会损害性能。影响性能的原因是RAM不足,无法有效使用交换空间。

  • 情况1:如果您没有交换空间并且碰巧没有RAM,Linux内核将选择一个或多个它认为是不错的候选程序并将其杀死。

  • 情况2:如果您有交换空间并且内存不足,内核将选择较少使用的内存页面,并将它们放在交换区域中以释放RAM。这将减慢系统速度,但不会影响您的应用程序。

我总是喜欢第2种情况,因为我感到无法分散的部分或全部工作是因为内核认为我的应用程序值得杀死。而且,由于当前的平均磁盘大小在TB范围内,因此保留几个百分比的交换应该不是问题。


6
我更喜欢情况1,因为我唯一的用尽RAM的时间就是当我有一个失控的程序时。OOM杀手通常很擅长识别逃亡者,我真的宁愿立即杀死它,而不是经过数小时的繁重交换。
标记

1
@Mark,这是正确的观点。我仍然尽量避免先委托算法,然后再考虑方法。
jlliagre 2015年

2
情况2仅在您有警告您这种情况的事情并且有足够的时间在系统用尽交换空间之前手动“执行某些操作”时才有效。但是您可以改为监视已用RAM的百分比以获得相同的结果。
Totor

1
根据您的推理,监视RAM使用就足够了
Totor

1
@Totor我不希望在半夜被笔记本电脑监控应用唤醒,因为我启动了一个处理大量文件并耗尽RAM的批处理。我宁愿完成这项工作,即使由于RAM尺寸不足而要花很多时间而不是将全部工作中断也要花几个小时。
jlliagre 2015年

3

我在任何系统中应用交换的规则是对此有答案:

  • 该系统的目的是什么?
  • 应用程序将消耗多少内存?
  • 这是关键系统吗?
  • 我需要一个临时磁盘空间来进行文件传输吗?
  • 预计的应用增长率?

当我得到此信息的答案时,将相应地调整系统大小。在过去的几年中,我一直遵循Sun Microsystem的经验法则。高达16 GB的SWAP RAM的两倍,从16 GB到相同数量的RAM。但是另一方面,如果您有足够的RAM可用空间并且应用程序不强制使用SWAP,则可以忽略交换。如果需要,只需放置新磁盘或lun并配置SWAP。Sun的规则之所以适用,主要是因为在Solaris上,如果发生“内核崩溃”,内存将全部转储以交换以进行进一步分析。


1

如果没有足够的RAM来运行所有程序 需要交换。

您说您没有执行任何需要大量RAM的操作。因此,您确实有足够的RAM。

然后,您不需要交换空间。

但是,如果您认为在某个时候,尽管您在问题中暗示了什么,您的程序仍将使用RAM的一半(或三分之二)(经验法则),那么请阅读另一篇“赞成交换”答案。您不需要交换,但是它可以提高系统性能。


使用交换可以帮助避免灾难性的崩溃,但绝不会提高性能,就像降落伞会加快法拉利的速度一样。;-)
极客长老2015年

@ElderGeek可能是一个极端情况,但是交换可以提供帮助。有时候,您只有足够的RAM来存储所有内容,但是可以将空闲程序换出以更好地利用RAM(例如,一些有用的磁盘缓存)。在90年代后期,我经常看到这种情况。当我有小于1GB的可用RAM(包括磁盘缓存),而实际上不需要交换空间时,有时我会看到这种情况。
jbo5112

@ jbo5112如果您这么说,我不会完全排除这种可能性,到目前为止,我的经验表明。这并不奇怪,因为这是一个如何使用系统的案例,而不是一成不变的规则(每个人似乎都在寻求)。
年长者怪杰

@ElderGeek我可能现在才看到它,因为我的磁盘已经使用了十年并且急需缓存。通常,在几乎任何情况下都存在将交换性设置得过高的附加问题,这会导致交换空间的使用过于激进。建议将值从60降至10。您可以将其降低得更低,但是在某些时候,您将转储过多的磁盘缓存,从而在交换时导致大量额外的I / O。
jbo5112

@ jbo5112好点。这始终是不同子系统之间的平衡行为。我记得当初调整希捷ST225和ST238驱动器等硬盘插入和RAM刷新速率这样的参数以从80286系统中挤出最大性能。我们始终必须视情况而定,以最大限度地提高性能和可靠性。恭喜BTW!我上一次无法从驱动器中挤出10年的时间是一个Micropolis,其总容量为600MB。
年长者极客2015年

0

简短的答案:

是的,您总是需要交换,只是在不太可能的情况下,应用程序甚至不会打扰映射内存,而是直接映射虚拟内存。

将交换文件设置为:

  • RAM+round(sqrt(RAM)) 如果您使用休眠
  • round(sqrt(RAM)) 如果你不

swappiness在台式机(而不是服务器)上将您的密码设置为10

长答案:

以往:

过去25年使用的经验法则是最小1xRAM,最大2xRAM,因此您会一直引用该规则。

这个最小值是在我十几岁的时候进入石器时代的,当时恐龙仍在地球上漫游,因为RAM太昂贵了,您绝对需要交换空间才能完成任何事情。

之所以在那时设置最大值是因为收益递减:必须交换这么多的内存太慢了,因为HDD访问比RAM慢了1000倍:在紧急情况下很好,但对于日常使用而言却并不好!那时,当您用完交换空间时,该增加更多RAM了!(今天仍然如此)。

在现在:

  1. 如果你不使用的休眠和你的内存超过1GB的拇指的新规定round(sqrt(RAM)),其中RAM显然是在GB您的内存大小。

  2. 如果使用休眠方式,则需要能够将全部RAM +已交换的RAM交换到磁盘,因此公式变为: RAM+round(sqrt(RAM))

  3. 收益递减的规则今天仍然保持最大,但是除非您测试实际使用率,否则使用2xRAM只会浪费磁盘空间,因此请不要使用最大值,除非使用其他方法耗尽交换空间

所有这些都为您提供了下表:(最后3列表示交换空间)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

以上只是一个经验法则; 这不是引力定律!
可以,如果打破这种规则(不像万有引力定律)的特定用途的情况是不同的!

专家提示: 始终在HDD开始时分配SWAP,因为磁头需要在磁盘内部移动得更少。
是的:在SSD上,放置交换区域的位置实际上不再重要,因为它们使用量子隧道代替移动磁头,并且现代SSD使用其所有存储单元(甚至未分配的空间)来防止量子退化。

如何测试您的swap用法是否与“通用”规则不同:

只需执行:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

这将为您列出所有被交换出的正在运行的程序(其中一个使用交换空间最多的程序)

如果您使用的空间更多,则增加几个KB:将大小调整为最小的大小,否则,不要打扰...

如果您在服务器上,请立即停止阅读:一切就绪!


如果您使用的是台式机/笔记本电脑客户端(而不是服务器),则希望GUI尽可能灵敏,仅在真正需要时才进行交换。Ubuntu已经经过优化,早期交换服务器使用,但是你的客户你想编辑一个巨大的250兆像素的原始图片中gimp是快速的,所以设置你的swappiness〜10将保持内核从交换太早,同时确保它不”太晚交换:

sudo nano /etc/sysctl.conf

并添加:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

到文件末尾,保存文件(在nano中为Ctrl+ XY+ Enter)并执行:

sysctl --system

要重新加载该参数或仅出于旧时考虑请使用Window $方法并重新启动... :-)


-1

妥协答案:这取决于“应该”的含义。

如果您在描述的操作条件下没有交换分区,是否需要某种交换分区?没有。

明智的做法是,有一个交换分区,以防万一您意外地产生了一批记忆猪,因此您有机会在OOM杀手踢进来之前将其杀死?是。

如果您的物理RAM“大大”超过了您将始终同时运行的所有程序的数据内存使用量,那么进行交换不会带来性能优势。如果超过,但不是“很大”,如果OS能够交换出很少使用的内存以将更频繁访问的“文件数据”保留在内存中,则可能会带来性能上的好处。

总而言之,您拥有16GB RAM真是太好了。但是,如果您还有一个1TB的磁盘,是否不能保留其中的16GB进行交换?它只是磁盘的1.5%。

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.