是的。

是的。

据我了解,这样做的目的交换Linux 中的分区是从 RAM 中释放一些“不经常访问”的信息并将其移动到硬盘驱动器上的特定分区(代价是读取或写入速度变慢),本质上允许活动应用程序更多地使用“高速存储器”。

当您使用的计算机内存较小并且不想在内存耗尽时遇到问题时,这非常有用。但是,如果您的系统有16 GB或者32GBRAM,并假设您没有为 StackExchange 运行 MySQL 数据库或在 Linux 中编辑 1080p 全长电影,应该使用交换分区吗?

答案1

是的。

你绝对应该总是启用交换,除非有非常令人信服的、禁止的原因(例如,根本没有磁盘,或仅存在网络磁盘)。您是否应该按照经常推荐的荒谬大小(例如 RAM 大小的两倍)进行交换?出色地,

原因是,交换不仅在应用程序消耗的内存多于物理 RAM 时有用(实际上,在这种情况下,交换是有用的)不是很有用因为它严重影响性能)。如今交换的主要动机是不是神奇地将 16GiB RAM 变成 32GiB,但为了更有效地利用已安装的可用 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 级的数据)物理内存页)。现在如果你写入文件映射?在这种情况下,操作系统必须有一个物理页(或交换空间)为每个写入的页面做好准备。在脏页写回过程完成其工作(可能需要几秒钟)之前,没有其他方法可以保留数据。因此,操作系统会保留(但不一定会提交)交换空间,因此,如果您正在写入映射,而恰好没有未使用的物理页(这是一种很可能且正常的情况),那么您'关于保证它仍然有效。

现在如果没有交换怎么办?这意味着不能保留交换(废话!),这意味着一旦没有剩余的空闲物理页面,并且您正在写入页面,您就会以进程接收的形式获得惊喜分段错误,并且可能被杀死。

[/编辑]

然而,将交换区设置为 RAM 大小两倍的传统建议是无意义的。尽管磁盘空间很便宜,但分配那么多交换空间是没有意义的。浪费便宜的东西仍然是浪费,而且你绝对不想要不断地换入和换出数百兆字节(或更大)的工作集。

没有单一的“正确的”交换大小(有多少用户和意见就有多少“正确”大小)。我通常分配固定的 512MiB,无论 RAM 大小如何,这对我来说非常有效。其背后的原因是 512MiB 是您可以总是如今,即使在小磁盘上也能负担得起。另一方面,添加几 GB 的交换空间也好不到哪儿去。除非出现严重问题,否则您不会使用它们。

即使在 SSD 上,交换也比 RAM 慢几个数量级(由于总线带宽和延迟),并且虽然它是非常可以接受将可能不再需要的东西移动到交换(即您很可能不会再次交换它,因此您的可用页面池实际上免费扩大了),如果您真的需要大量的交换(也就是说,您有一个使用例如 50GiB 数据集的应用程序),您几乎迷路了。

一旦您的计算机开始换入和换出千兆字节的页面,一切都会变得缓慢。因此,对于大多数人(包括我)来说,这不是一个选择,因此进行如此多的交换是没有意义的。

答案2

我不同意我在这里看到的一些观点。我仍然会创建一个交换分区,尤其是在生产环境中。我也为我的家用机器和虚拟机执行此操作。

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

如果内存不足,交换空间可以为您提供一点时间和缓冲来解决问题。

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

交换区域可以保存部分内核转储,以便可以在下次重新启动时恢复。这对于将来您被要求执行的一些紧急调试可能很有用。

答案3

或许:

我对这个话题进行了很多思考,并且看到争论双方的观点多得我数不清。我的方法是开发一种方法来找出答案。

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

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

可以选择切换到其他工作区。

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

当您感觉系统处于高负载(或可能达到的高负载)时,请查看终端并检查结果。或者更好的是通过添加>output.txt到命令中将输出重定向到文件,以便您可以检查完整的运行。如果您使用的交换空间从未超过可用内存,则不需要交换空间。如果是这样,你就这样做。 免费.png

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

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

答案4

您的交换空间永远不应该大于您能够容忍等待内核换入/换出的最大大小;否则,您只是为系统创建了一种新的故障模式(在交换中陷入不可恢复的困境)。请注意,尽管现代驱动器能够以 GB/秒的速度传输,但 Linux 通常只能以每秒数百 kB 或最多几 MB 的速率移动交换。如此巨大的交换可能会让您的系统在几分钟、几小时甚至几天内无法使用。

如果您有足够的物理内存来完成您正在做的事情,则理想的交换大小是将其与进程保留但从未使用的“垃圾数据”数量相匹配。这可能在几兆字节到几百兆字节的范围内。此策略允许将所有物理内存用于缓存有用的信息,而不是永久存储可能永远不会再次使用的数据。

如果您没有足够的物理内存,则需要评估是否可以容忍大量交换带来的严重减慢。如果是这样,则拥有最多 1-2 GB 的交换空间可能很有意义,如果您有极快的驱动器,也许高达 4 GB。但超过这个数量只会使系统的故障模式变得更糟,因此您应该考虑购买更多 RAM。

相关内容