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

wrw*_*rwt 39 memory linux partitioning ubuntu

我的计算机上有 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 的磁盘空间实际上并不是什么大问题。

Dav*_*rtz 36

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

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

  2. 您需要交换来覆盖永远不会被填充的分配。这个空间必须是可用的,即使它不会被使用。没有它,系统将不得不拒绝分配内存,即使它有足够的空闲物理 RAM,因为它没有足够的后备存储来允许一次使用所有分配。

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

(我同意 Bert 的观点,4GB 很可能就足够了。)

  • 即使没有启用交换,Linux 也会过度使用内存。当实际使用太多内存时,它只会进行 OOMK 处理。所以答案的第二点是错误的。 (5认同)
  • @Soren 这是超级用户,而不是服务器故障。;) 当然,设置交换空间并不是您需要为“真实服务器”做出的唯一决定。您还需要做出关于过度使用、可能需要调整 OOM 杀手等问题的决定。(如果您希望您的工作集超过物理 RAM,答案就会变得更加复杂。但几乎没有人再以这种方式操作机器了。) (3认同)
  • @wrwt 将您的交换分区放在驱动器的末尾(或至少在您的数据分区之后),如果您选择调整它(更具体地说,它将调整数据分区的大小),它会更快地调整它的大小并减少写入密集以适应它更简单,因为您不必移动开始)。SSD 上的位置和性能之间没有联系,因为有时在机械驱动器上有联系。 (2认同)

Ber*_*ert 31

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

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

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

  • +1 最后一段。2x 建议可以追溯到大多数计算机没有足够的内存来避免在正常使用中进行交换的时候。主观上,从那时使用计算机来看,2x 限制似乎已被选为一个足够大的数字,以至于计算机在交换用完之前会变得非常慢。 (12认同)
  • 当系统具有 4GB/8GB 的​​ RAM 和数百 GB 的磁盘空间时,2X 也能正常工作。当然,这可能超出了需要,但有什么危害呢?但是现在系统有 16GB/64GB 的 RAM 和 128GB/256GB 的 SSD,危害是显而易见的。 (2认同)

Kaz*_*Kaz 12

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

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

随着您的系统需要越来越多的数据空间(无法换出),它会越来越多地疏散可执行代码(共享库和可执行文件),导致可怕的颠簸,因为工作集被修剪成越来越紧凑的一组页。

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

即便如此,如果您不经常运行内存密集型任务,您可能可以在大部分时间运行无交换,并在需要时手动配置交换文件(而不是专用分区)。要即时制作交换文件,请成为 root 并:

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

当您不再需要它时:

swapoff /path/to/swapfile
rm /path/to/swapfile
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  2. 当没有可用内存时,有一些方法可以使 Linux 严重失败,即通过操作这些 sysctl 条目的值:

    vm.overcommit_memory
    vm.overcommit_ratio
    
    Run Code Online (Sandbox Code Playgroud)

  • +1 用于实际引用内核配置参数——关键在于问题的一部分“如果我没有交换,我会收到“内存不足”错误”——这是“假”——事实是当您用完交换空间时,内存不足杀手会启动并终止一个随机进程以释放空间 - 因此所需的交换空间量取决于您的应用程序的编写方式。 (3认同)