在64 GB RAM计算机上交换分区大小以进行内存密集型工作


36

我的计算机上有64 GB的RAM和240 GB的SSD,将用于内存密集型计算(机器学习,数据挖掘等)。我在Internet上发现的大多数建议都是大约2-4-8 GB RAM计算机,它们建议RAM交换分区的大小为2倍(即128 GB)。

制作128 GB交换分区是否合理?制作一个巨大的交换分区有什么好处?

如果物理RAM用完了,我是否理解正确:

  1. 如果没有交换,则会出现“内存不足”错误
  2. 如果我确实进行了交换,则某些RAM页面将被复制到交换分区,并且程序将继续运行(尽管速度较慢)。

有人说在SSD上进行交换是个坏主意,因为它的读写周期有限。使用交换功能将以多快的速度耗尽SSD的读/写周期(据我所知,大约有50000个写IOPS)?

我正在使用Linux(Ubuntu 14.04(Trusty Tahr))。

现在应该设置一个16 GB的交换空间,因为它应该足够确定(例如,RedHat建议使用4 GB),而16 GB的磁盘空间实际上并不重要。


1
如果您知道工作集的大小,或者愿意做更多底层的内存管理,则可以使用mmap分配工作集页面,而不是显式地依赖交换。这样您的交换量将恰好是您过程所需的量。
蓬松的

5
推荐“ RAM数量的两倍”的建议可以追溯到计算机内存很少的旧时代。一些文档指出,它主要适用于RAM <2GB的计算机。除此之外,交换大小主要与您在计算机上执行的操作有关。
约翰·史密斯

另请参阅此服务器故障问答 -如果您正在运行Java(以及其他应用程序),则要确保有足够的交换空间来增加它们的内存分配。我个人对我的交换分区坚持使用RAM + 2的RHEL标准
Warren

2
可惜这里的大多数评论都被删除了。重新添加:值得一提的是,如果内核支持,您可能希望将交换分区安装discard在SSD上。另外(在下面的答案中提到了这一点),请不要忘记可以使用文件而不是分区来进行更轻松的管理(并且不会因碎片等原因而影响SSD的性能)。
杰森C

1
如果您有一个内存密集型应用程序(例如SVM学习),并且用完了ram并开始进行交换,那么所有内容都将变得太缓慢而无法恢复,并且您唯一可用的方法就是拔掉插头(这在我之前发生了几次) 。如果它开始交换,您可能希望您的进程被OOM杀死,以便您至少可以更改内容并重新启动。也许使用SSD驱动器还不错。我也会检查OOMK设置-在Ubuntu上我碰巧,当剩余大量
可用

Answers:


36

您可能只需要少量交换。当您确定计算机的典型工作集有足够的RAM时(我敢肯定您会这样做),您只需要交换两件事即可:

  1. 您需要交换来获取可能永远不会从RAM中访问的信息,以释放更多空间用于磁盘缓存。许多应用程序在系统启动时运行,将永远不会再次访问。您不希望它们弄脏的任何页面永远停留在RAM中。因此,您需要交换以持有它们。

  2. 您需要交换以支付将永远无法满足的分配。即使不使用此空间,它也必须仅可用。没有它,即使系统有大量可用的物理RAM,系统也将不得不拒绝分配内存,因为它没有足够的后备存储来允许立即使用其所有分配。

这些都不需要大量交换。例如,16GB应该足够了。目的不是让您以速度为代价运行更大的工作集。目的是让您有效使用64GB,而不必用垃圾塞住它或将其保留给永远不会发生的情况。

(我同意Bert所说,4GB足够用了。)


2
@wrwt将交换分区放在驱动器的末尾(或至少在数据分区之后),如果您选择对其进行调整,它将使调整大小更快,写入强度更低(更具体地说,它将调整数据分区的大小)以使其更简单,因为您不必移动起点。SSD的位置和性能之间没有联系,有时机械驱动器也没有联系。
杰森C

尽管此答案对于大多数业余爱好者来说可能就足够了,但对于真正的服务器却是个坏建议-答案取决于应用程序的编写方式,因为用完交换空间会导致内存不足杀手介入并终止随机处理(是的,您没看错;“随机”)
Soren

3
@Soren这是超级用户,不是serverfault。;)当然,设置交换空间并不是您需要为“真实服务器”做出的唯一决定。您还需要对诸如过量使用之类的事情做出决定,您可能需要调整OOM杀手,等等。(如果您希望您的工作集超过物理RAM,答案将变得更加复杂。但是几乎没有人以这种方式操作机器。)
David Schwartz

5
即使没有启用交换,Linux也会过量使用内存。当实际使用过多内存时,它将由OOMK处理。因此,答案的第二点是错误的。
Ruslan 2014年

1
@MaciejPiechotka或使用文件。
杰森C

29

RedHat 建议在64 GB的计算机上使用4 GB

但是,进行大小调整不是一门科学,而是一门艺术。这取决于机器的用途,拥有的磁盘空间和内存以及其他因素。请记住,您以后总是可以添加更多交换。

使用2X物理内存的规则已经过时,如今的内存系统数量已经过时。但是不建议零交换运行,除非您知道自己在做什么。建议使用4 GB是一个很好的起点。


12
+1为最后一段。2x建议可以追溯到大多数计算机没有足够的内存来避免在正常使用中进行交换时。从主观上讲,然后从使用计算机开始,将2x限制选择为足够大的数字,以使计算机在用尽交换空间之前将变得非常缓慢。
Dan Neely 2014年

1
当系统具有4GB / 8GB RAM和数百GB磁盘空间时,2X也可以正常工作。当然,它可能超出了需要的范围,但是有什么危害呢?但是,现在系统具有16GB / 64GB RAM和128GB / 256GB SSD,其危害显而易见。
David Schwartz 2014年

12

在Linux上,您需要足够的交换空间,以便可用的总虚拟内存(RAM + SWAP)足以满足您要一次运行的所有进程以及它们的最大虚拟占用空间。

如果交换空间少于此数目,或者根本没有交换空间,则会发生以下情况:系统用尽了内存,试图分配页面。但是,即使没有交换,这仍然是一个软故障,因为系统有很多“受害者”页面可以删除以腾出空间:即所有文件支持的内存映射的页面,例如可执行文件和共享库!

随着您的系统需要越来越多的数据空间(无法交换出去),它将越来越多地撤消可执行代码(共享库和可执行文件),导致可怕的崩溃,因为工作集被缩小为越来越紧密的集合。页面。

交换空间通过为交换匿名(未映射文件)页面提供了一个位置来软化此问题:用于内存分配的页面,以便可执行代码可以保留在内存中。

即使这样,如果您不经常运行占用大量内存的任务,则大多数时候您可以摆脱无交换运行,并在需要时手动配置交换文件(而不是专用分区)。要动态创建交换文件,请成为根用户并执行以下操作:

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

当您不再需要它时:

swapoff /path/to/swapfile
rm /path/to/swapfile

笔记:

  1. 您绝对不需要至少配置与RAM一样多的交换。这个经验法则可以追溯到由于交换方式的设计而成为硬性要求的操作系统。

  2. 在没有可用内存的情况下,有几种方法可以使Linux严重失败,即通过操纵以下sysctl条目的值:

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
+1实际上指的内核配置参数-的关键是问题的一部分If I have no swap, I get an 'out of memory' error-这是false-事实是,当你的交换空间耗尽内存外的杀手将和杀踢释放空间的随机过程-因此所需的交换空间量取决于应用程序的编写方式。
索伦2014年

@Soren可能大多数RAM都将填充实际数据,因此内存不足杀手不会有太大变化。不管怎样,还是“真相”。
wrwt

3

还有更多注意事项。如果您需要/想要挂起工作,那么至少需要RAM的大小,然后再加上一些。但是,由于您似乎主要是在构建计算工作马,因此听起来似乎不太需要。

在这种情况下,请考虑使用交换文件而不是分区。您无需担心大小调整,以后再删除或添加它不需要任何重新分区。在分区上使用文件不会(明显)降低性能。如果您碰巧需要它,请查看尺寸,这也会为您提供很好的提示。


1
@Kaz我认为您在谈论的东西与kaste不同。kaste的意思是,如果您希望能够挂起/休眠计算机,将其关闭,然后在上次中断的地方继续工作,则需要足够的交换空间来存储所有RAM(否则它将流向何处?)。
合金2014年

@amalloy如果将RAM存储在交换空间中,那么交换在哪里进行(请记住,交换被视为内存,如果交换丢失,则与丢失ram相同)。
NPSF3000

2

要应用于计算机的工作负载需要一定数量的内存才能运行(请记住向方程式添加足够的内存以处理峰值负载),并且您需要将计算机配置为至少具有该内存。

现代操作系统将虚拟内存作为物理内存和交换空间的组合提供,因此,如果您需要的内存超出了计算机的可用空间,则必须添加足够的交换空间来填补空白。即,如果您需要最大80 GB,而计算机具有64 GB,则需要16 GB交换空间。

通常,操作系统安装程序会要求您设置一个初始交换区(因为这是最简单的交换区,甚至允许安装小型计算机),并且发现,对于典型的Unix操作,一个好的经验法则是将虚拟内存的大小设置为三倍于物理内存,因此通常建议这样做。但是,您对使用模式了解更多,因此可以适当地更改它。

如果您的内存压力始终较小,那么在没有交换空间的情况下工作没有任何问题。Linux将透明地将所有未使用的内存用作磁盘缓存。


2

比“大量交换”更好的主意是(重新)组织工作,以使工作集适合内存,然后使用文件系统存储和检索您所做的工作。即,不是强迫操作系统猜测您的内存使用方式,而是使用对问题的了解来控制内存使用方式。

作为今年夏天与我直接相关的一个随机示例,在实施二次筛时,需要一个大的(显然)连续的数组进行标记(使用一些复杂的算法,对于该示例,细节实际上并不重要)。该阵列需要约100个千兆条目,因此很容易在1 TB范围内。我可以假装分配它,让OS进行大量的低效率交换,以使页面进出RAM,以支持通过阵列的所有顺序写入。我没有做那些笨拙的事情,而是安排分配一个恰好适合内存的小得多的数组,然后重用该小数组以迭代方式覆盖切片中的其余大数组。我还剥离了操作系统,剥离了正在运行的服务,更换了外壳,

SSD可能很快,但是却不及组织计算以执行相同的操作集而不会停顿进行交换的速度。


1

正如其他人提到的那样,即使您有足够的RAM,交换分区也是一个好主意。将其放在SSD上不是一个好主意。频繁写入交换分区将最终使驱动器磨损。

如果您有备用的USB 3.0端口,建议您为交换空间使用闪存驱动器。有许多高速闪存驱动器,其速度与您的SSD一样快,但便宜得多-如果确实开始出现故障,则足以更换。在亚马逊上进行的快速搜索显示,有许多不错的16 GB USB 3.0闪存驱动器价格低于20美元,甚至有一些64 GB驱动器价格低于60美元。

将整个闪存驱动器分区为交换空间,如果需要,您将拥有交换空间,并且知道重复写入的内存可以轻松(且廉价地)更换,因此请放心。


3
+1表示不交换到SSD,-1表示交换到寿命很短的组件。
Aviator45003 2014年

1
@TC是正确的,ArmanX-如果您要避免使用闪存(SSD),为什么要在USB上使用闪存?那是不合理的。
沃伦

2
@TC:由于介质耗尽,不使用SSD进行交换是不合理的城市传说。交换不会“一直”发生,但很少发生。此外,这是Win7发行后在Microsoft进行的广泛研究的结果,结果是SSD可以接受典型的交换访问模式(Windows是Windows,不是Ubuntu,但是Linux的性能可能不会差很多)。由于没有人读过的愚蠢日志文件(通常同步每一行),因此使SSD耗尽的写入操作增加了一百(或千)倍。
戴蒙2014年

逻辑有缺陷:如果指驱动器的确和SSD一样快,为什么便宜呢?
Agent_L 2014年

这是一个平衡。一方面,拥有交换文件是一个好主意。另一方面,如果交换文件确实使SSD磨损(没错,可能没关系),那么最好使用便宜的替代品-而且20美元的闪存驱动器比售价超过100美元的固态硬盘。
ArmanX 2014年

1

即使有1GiB(可能更少)的交换,您也可以。我的工作计算机通常使用不超过140-150 MiB。1 GB的存储空间为此过多。
除非您执行的计算任务需要数百GB的数据集,而且(这一点很重要!)以或多或少的访问一次访问方式访问数据,否则您将永远不希望拥有比这大得多的交换空间。但是再说一次,简单地对数据文件进行内存映射对于该应用程序同样有效。

但是更多的交换可以帮助更多,对吗?越多越好!

考虑一下交换(例如16GiB)会带来什么变化(或想到64GiB)。如果您从不使用这些16GiB,则最好不要将它们放在首位。但是,如果您确实使用它们,会发生什么?与主内存相比,磁盘非常慢。即使使用SATA-600 SSD,传输16GiB仍需要30到40秒,是其他一些配置的2-4倍。
现在,不可避免地会有人反对,您宁愿调入和调出大约12个4kiB页面,而不是一次16GiB页面。尽管这是事实,但这一点仍然成立。如果只需要换入和换出几页,则不需要16GiB的交换,但是如果您确实需要16GiB的交换,那么您也将要转移它们(一种或另一种方式)。

从理论上讲,所有用户中有99.9%甚至可以使用64GiB机器(或任何8 + GiB机器)而无需进行任何交换,并且很可能永远不会注意到丢失的任何东西。但是,这是不建议的。
首先,它是次优的,因为操作系统在物理内存不足时可以选择丢弃的内容的选择较少。它可以做两件事:交换不使用的东西,或者从缓冲区缓存中丢弃页面。如果没有交换,则只能做一件事。从缓冲区高速缓存中丢弃页面是无害的,但可能会明显影响性能。
其次,如果没有交换,私有匿名映射可能会简单地失败。通常不会发生这种情况,但是最终,当没有足够的物理内存来满足所有这些条件并且没有交换时,操作系统只有这一种选择,除了...
第三,可怕的OOM杀手er可能会加入进来。这意味着或多或少的随机过程会被杀死。不,谢谢。这不是您想发生的事情。

话虽这么说,诸如您需要交换X倍于已安装的RAM数量的建议来自那些重复听了(但不理解!)的人,或者重复了听了(但不理解!)数十年的人。前。
“使用RAM的2倍”规则在1980年代和1990年代是一个容易记住的经验法则,它从来不是“黄金真理”(对于大多数用户而言,这仍然行得通),并且如今已不再适用。

您应该有一个合理的交换量,您可以轻松负担(例如1 GB),这样操作系统就可以分页一些过时的东西,因此一旦您请求更多的内存,世界不会立即结束。就是这样。

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.