当我们想要设置 Linux 系统时,通常建议将交换空间设置为物理内存的两倍。我想知道为什么我们需要这样做,以及这个建议是如何得出的?
答案1
简短的回答是“你不需要有到”。
根据内核/系统类型,调整交换空间的大小可能是有意义的,例如在 FreeBSD 中调音(7)在手册页中我们发现交换大小至少为物理内存大小的 2 倍,其背后的原理如下:
对于 RAM 小于 2GB 的系统,您通常应将交换空间的大小设置为大约 2 倍主内存,如果 RAM 大于 2GB,则应将交换空间的大小设置为大约 1 倍主内存。但是,如果您的 RAM 不多,则通常需要更多的交换空间。不建议您在系统上配置少于 256M 的交换空间,并且在调整交换分区大小时应考虑将来的内存扩展。内核的 VM 分页算法经过调整,当交换空间至少是主内存的 2 倍时,性能最佳。配置太少的交换空间可能会导致 VM 页面扫描代码效率低下,并且如果您向计算机添加更多内存,则以后会产生问题。最后,在具有多个 SCSI 磁盘(或在不同控制器上运行的多个 IDE 磁盘)的大型系统上,我们强烈建议您在每个驱动器上配置交换空间。驱动器上的交换分区应大致相同。内核可以处理任意大小,但内部数据结构会扩展到最大交换分区的 4 倍。保持交换分区大小接近相同将允许内核以最佳方式将交换空间条带化到 N 个磁盘上。不要担心过度使用,交换空间是 UNIX 的救命稻草,即使您通常不使用太多交换,它也可以为您提供更多时间从失控程序中恢复,然后再被迫重新启动。
在决定分配多少交换空间、分配到哪里等时,其他因素可能也很重要。例如,如果您要安装一台具有 128 GB 物理内存的大型服务器,最好避免预先分配 256 GB 的磁盘空间用于永远不会使用的交换。
另一方面,一些交换空间通常可以抓取内核转储(例如在 Open-、Net- 和 FreeBSD 中)。因此,最好至少有足够的交换空间来在崩溃时抓取完整的内核转储。
没有绝对适合的规则全部案例。您必须阅读有关特定系统的行为、了解其工作原理、考虑系统的预期用途并确定最适合的交换空间大小你的需求。
答案2
你根本不需要。旧版本的 Windows 会将分配的内存的每个页面视为交换文件上的 mmap,因此你至少需要交换中的总物理 RAM 大小才能使用它 - 如今不再如此,在 Linux 中也从未如此,但谣言仍然存在。
但是,有一种情况需要至少与 RAM 一样多的交换空间 - 休眠。由于 Linux 使用交换文件进行休眠(又称挂起到磁盘),因此您需要足够的交换空间来容纳 RAM 中的所有数据以及已换出的所有数据(减去缓存 RAM)。当然,这仅适用于需要休眠的机器,例如笔记本电脑。
最后,过多的交换可能会坏的不管别人怎么说,这都是一个问题。想想看 - 如果您有 4G 的 RAM,并且还需要额外的 8G 交换空间,您认为您的系统是否仍然可用,它正在执行所有磁盘交换?内存耗尽时立即终止占用内存的进程通常更好,而不是让整个系统在开始花费所有时间将数据编入和编出交换空间时变得缓慢到无法使用的程度。
答案3
很久以前,有一种常见的 unix 变体(我认为是 BSD,但我现在找不到参考资料)会将每个虚拟内存页面分配到交换空间中。因此,如果您的交换空间与 RAM 一样大,则虚拟内存的大小仍将与 RAM 相同。当时通常的建议是将交换空间设置为 RAM 的两倍,从而使虚拟内存的大小为 RAM 的两倍。
现代的 Unix 系统并不如此,因此这条规则的制定理由已经过时了(我认为它在 1992 年就已经过时了,因此它与 Linux 无关)。但奇怪的是,这条规则却幸存了下来。如果你现在遵循这条规则,你将获得三倍于 RAM 的虚拟内存,而最初的意图是获得两倍的内存。
仅仅因为规则背后的历史原因是错误的,并不意味着它是愚蠢的。磁盘空间已经变得更便宜,因此分配更多的交换空间是有意义的。您应该有多少交换空间在很大程度上取决于您有多少 RAM 以及如何使用它。您可以在没有交换空间的情况下运行系统,但如果您的 RAM 确实已满,您就没有机会选择要终止哪些程序,并且系统可能会变慢(有时最好将 RAM 用于缓存并交换出一些程序内存)。分配过多的交换空间会占用少量的 RAM(用于内核数据结构)和磁盘空间(但如今,除了 SSD 之外,这通常非常便宜)。如果您想休眠,则必须有足够的交换空间来容纳所有虚拟内存。
答案4
这是一项古老的建议,基于对典型系统内存容量、内存总线速度与磁盘速度以及进程在各种等待状态下所花费时间百分比的假设。我怀疑现在您是否希望在交换空间中使用超过 1/2 的物理内存——这刚好足以防止在内存利用率接近满负荷时随机发生 OOM 终止。但完全取决于您的典型工作负载、YMMV 等。