现代 Linux 系统的交换空间应该多大?

完成我们的调查,表达您对应该分配多少交换空间的看法。
168 位读者喜欢这篇文章。
How to find files in Linux

Lewis Cowles,CC BY-SA 4.0

交换空间是每个人似乎都有想法的事情之一,我也不例外。我所有的系统管理员朋友都有他们的意见,大多数发行版也提出了建议。

多年前,关于应该分配多少交换空间的经验法则是计算机中安装的 RAM 容量的 2 倍。当然,那是在典型计算机的 RAM 以 KB 或 MB 为单位衡量的时候。因此,如果一台计算机有 64KB 的 RAM,那么 128KB 的交换分区将是最佳大小。

这考虑到了 RAM 内存大小通常很小的事实,并且为交换空间分配超过 2 倍 RAM 并不能提高性能。对于超过两倍 RAM 的交换空间,大多数系统花费在抖动上的时间比执行有用的工作更多。

RAM 内存已经变得非常便宜,现在许多计算机的 RAM 都在数十 GB 范围内。我的大多数较新的计算机至少有 4GB 或 8GB 的 RAM,两台有 32GB,而我的主要工作站有 64GB。在处理具有大量 RAM 的计算机时,交换空间的限制性能因素远低于 2 倍乘数。因此,建议的交换空间被认为是系统内存工作负载的函数,而不是系统内存。

表 1 提供了 Fedora 项目建议的交换分区大小,具体取决于系统中的 RAM 容量以及您是否需要足够的内存来休眠系统。为了允许休眠,您需要在自定义分区阶段编辑交换空间。“推荐”的交换分区大小在默认安装期间自动建立,但我通常发现它对于我的需求来说要么太大要么太小。

Fedora 28 安装指南 定义了当前关于交换空间分配的思考。请注意,其他版本的 Fedora 和其他 Linux 发行版可能略有不同,但这与 Red Hat Enterprise Linux 用于其建议的表格相同。自 Fedora 19 以来,这些建议没有改变。

系统中安装的 RAM 容量 建议的交换空间 建议的带休眠的交换空间
≤ 2GB 2 倍 RAM 3 倍 RAM
2GB – 8GB = RAM 2 倍 RAM
8GB – 64GB 4G 到 0.5 倍 RAM 1.5 倍 RAM
>64GB 最小 4GB 不建议休眠

表 1:Fedora 28 文档中建议的系统交换空间。

表 2 包含我根据多年来在多种环境中的经验提出的建议。

系统中安装的 RAM 容量 建议的交换空间
≤ 2GB 2 倍 RAM
2GB – 8GB = RAM
> 8GB 8GB

表 2:我建议的系统交换空间。

这两个表都可能不适用于您的环境,但它们将为您提供一个起点。主要考虑因素是,随着 RAM 容量的增加,添加更多交换空间只会导致在交换空间接近填满之前就发生抖动。如果您的虚拟内存太少,您应该尽可能添加更多 RAM,而不是更多交换空间。

为了测试 Fedora(和 RHEL)交换空间建议,我在我的两个最大系统(RAM 分别为 32GB 和 64GB 的系统)上使用了其建议的 0.5*RAM。即使在运行四到五个虚拟机、LibreOffice 中的多个文档、Thunderbird、Chrome 网络浏览器、多个终端模拟器会话、Xfe 文件管理器以及许多其他后台应用程序时,我看到任何交换使用的唯一时间是在我安排在每天早上大约 2 点进行的备份期间。即便如此,交换使用量也不超过 16MB——是的,是兆字节。这些结果适用于我的系统和我的负载,不一定适用于您的真实环境。

我最近在 Opensource.com 与其他一些社区版主就交换空间进行了对话,我的朋友 Chris Short 是这个杰出而才华横溢的群体中的一员,他向我指出了一篇旧文章,他在文章中建议使用 1GB 作为交换空间。这篇文章写于 2003 年,他后来告诉我,他现在建议零交换空间。

所以,我们想知道,您怎么看?您在您的系统上推荐或使用什么交换空间?

标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员 Linux 哲学”的坚定支持者和传播者。

38 条评论

我有点老派,因为我仍然支持物理 RAM 两倍的想法。这通常有效,因为我的目标是双核系统使用 8 GB,我的大多数系统都是如此。磁盘空间甚至比内存更便宜,所以我总是在驱动器上有几个 16GB 的分区,每个分区分别用于 root、/var、/tmp、/usr 和交换。这使其简单易记。我遇到麻烦的唯一一次是当我尝试使用 pan2 for Usenet 时。即使有那么多交换空间,它也无法处理 NewsDemon 上的保留。它曾经运行了 84 小时,用完了所有交换空间来下载标头,然后因段错误而崩溃。

除非我计划过度提交我运行的应用程序数量,否则我不使用交换空间。至于休眠,我从不关闭我的系统。

您必须以 4GB 总量为目标。大多数系统使用 500MB 系统内存 + 1.5GB 浏览器内存到 1.2GB 系统内存和 1.5GB 浏览器内存。
在后者中,这留下了大约 256MB 的共享 Vram。
如果您稍微优化一下您的系统,在低端系统上,您可以运行
<2GB 内存 = 1-2GB 交换空间
4GB 内存 = 0-1GB 交换空间
>4GB 内存 = 0MB 交换空间

Windows 只需要交换空间即可从系统崩溃中恢复,内核交换空间约为 50-150MB。

但是交换文件对 SSD 非常不利。它们会很快磨损 SSD。因此,最好不要有交换文件和休眠文件,因为大多数低端硬件通常具有非常好的睡眠状态。

在 RAM 容量低的系统上,我建议研究 zswap/zram。如果您有足够的 RAM,我认为您根本不需要任何交换空间。

我的系统不使用交换空间,因为我有 SSD 磁盘。

零在投票前的单选按钮列表中,但未出现在结果中。

我选择零的理由:我总是购买足够的 RAM,而我在 RAM 方面最大的工作负载是浏览器或一些游戏。在后者中,较低的纹理质量比遇到交换空间表现更好。

例外情况是 RAM 不足的系统(在我的情况下 <8G),或者在需要休眠的情况下,因为休眠会使用交换空间。

另一件事是,当您必须有交换空间时,至少要确保它是加密的,否则它会破坏您可能使用的任何加密的目的。让它与休眠一起工作留给读者作为练习。

感谢您指出这一点。问题已修复。

回复 ,作者:Rudolf Polzer(未验证)

在 Linux 上——不小于 RAM 的大小:为了能够挂起到磁盘!通常您会多给一点,因为缺乏对空间需求的精确估计——这实际上应该存在于某人的脑海中,并且是一件很棒的学习内容……

我认为这取决于您的环境。
就我而言,我有很多虚拟机。大多数虚拟机要么是 Web 服务器,要么是应用服务器。鉴于我们确切地知道内部运行的是什么(具有有限堆大小的 JVM、httpd、监控工具……),我们决定禁用交换空间并正确调整我们的 RAM 大小。
我认为在虚拟环境中,您已经有了虚拟机监控程序的开销。因此,在这种环境中使用交换空间并不能大大加快速度。因此,如果可以,最好依赖 RAM。
在物理服务器上,交换空间可能更有意义。

这不是值得花费太多心思的事情。当我使用监控工具查看我的系统实际使用情况时,交换空间很少发挥作用。

这真的取决于您的使用情况和上下文。

早在 486/奔腾系统的旧时代,我永远不会创建超过 64MB 的交换空间。尽管建议使用 2 倍 RAM,但我认为在具有 128MB 或更多内存的系统上创建那么多交换空间是疯狂的。考虑到硬盘驱动器的速度很慢,无论 RAM 大小如何,那么多的交换都会严重影响性能。我总是说“如果您需要超过 64MB 的交换空间,那么您真的需要更多 RAM”。

今天我保持着类似的理念,但由于 RAM 容量更大、存储速度更快,因此数字更大。我通常会分配 2-4GB 的 RAM 用于交换,主要是因为我宁愿遭受性能损失(来自交换)也不愿内核在内存耗尽时开始终止进程。但我仍然认为,如果您遇到任何大量的交换,那么您真的需要更多 RAM。在具有 8-16GB RAM 的现代计算机上,我很少甚至从不遇到交换。

创建虚拟机时,情况略有不同。我经常创建具有有限 RAM (1-2GB) 的虚拟机,因为它们不运行 GUI(通常通过 ssh 会话访问),在后台运行最少的守护进程,并且我不希望从主机环境中占用超过必要的资源。我将创建一个大的 (8GB) 交换分区,以处理最坏的情况(我严重低估了我的 RAM 需求),并监控发生的交换量。我将根据需要增加 RAM 分配,以在预期负载下将交换保持在最低限度,并保留交换文件以在负载高于预期时可用。

等于已安装 RAM 的容量或零。在做出此决定时,需要考虑两个因素。

如果唯一的可用驱动器是 SDD,或者您在加密的发行版上操作,则不使用交换空间。

我的机器中有 144GB 内存,我只使用了 40GB。

我现在禁用了交换空间。100GB 的缓存对我来说足够了。

哈哈,我只能想象 288GB 的交换空间。这就是为什么它在不同的设置中差异如此之大的原因。

我通常避免在具有 4GB+ RAM 的系统上使用交换空间……我也更喜欢完全关闭而不是休眠。我想它在 RAM 容量较小或速度较慢的系统上可能很有用,但实际上,我认为对于大多数用例来说它不是必需的。

您好,我的印象是当前的数量至少与您运行的内存加上 5% 一样多。否则系统将无法正确休眠或挂起。

我仍然几乎将内存翻倍:即使有 32Gb 内存,我在加载重型 3D 场景时也经常耗尽内存。

所以我的建议是:取决于您用电脑做什么……;)

我看到必须使用交换空间的唯一情况是用 gimp 编辑大型照片,例如大型全景照片:需要大量内存,如果您没有足够的交换空间,您的系统将冻结,您将丢失所有工作。

在大学的计算机实验室里,我们花时间分析 DNA 序列,我试图进行一个大的 DNA 序列比对实验来生成系统发育。实验室服务器计算机大约有 19GB 的交换空间(可能还有 12GB 的 RAM),我几个月前帮助设置的,但由于当时的一系列原因(即,我无法使用当时的 Linux 知识增加交换空间,也无法重新安装所有内容,因为服务器上安装了 Windows,其中包含来自其他人的大量数据),我无法进一步增加它……但我记得我用来处理该数据的实验算法只需要略多于 20 GB……所以,由于我们有一个非常大的 HDD,我注意到对于此类具有大量 HDD 空间的计算机设置,为什么不将交换空间做得非常大呢?!……如果我们有,我的实验最终可能会成功……

我使用交换文件代替,它可以动态增长。我的交换文件挂载在我的根分区上,我给它分配了 64GB。据我所知,我只使用了大约 10% 的空间,因此如果真的需要,基本上为我留下了大约 50GB 的交换空间。当然,我从未使用过那么高的空间,可能我在我的计算机上运行的最消耗资源的东西(它甚至不是一台计算机,它只是一台带有我学校键盘的破平板电脑,配备 4GB RAM)是 Android Studio。

我只使用相对较小的交换文件(几百 MB)来防止最终崩溃。

我不使用休眠:计算机使用 SSD 驱动器启动速度非常快(并且挂起到磁盘对于 SSD 来说并不理想)。挂起到 RAM 就足够了,而且效果非常好。

哦,我忘记了一个非常重要的细节,我将 vm.swappiness 设置为 1

有趣的文章。我现在知道我在装有 8 GB RAM 的 Ubuntu 18.10 上有 2G 交换空间。这太少了吗?

自从使用 Windows XP 以来,我禁用了交换空间,从未使用过它,因为我知道如何管理内存,Linux,天哪,它永远不需要交换空间,因为它在处理内存方面非常高效,因此我们的一些朋友指出在 8GB 以下,是的,也许,这些浏览器非常消耗内存,但我运行的小型 Nix 服务器使用的内存不超过 100Mb,有时增长到 500Mb,因此我认为,如果您正确管理您的机器,您可以使用很少的内存,甚至不用考虑交换空间。有些人认为在 Microsoft 世界中,您需要启用交换空间以允许内核交换,并且某些页面功能需要它……呸,他们大错特错了,就像我说的那样,自从 XP 时代以来就禁用了它,并且从未遇到任何问题,除了做了一些愚蠢的事情,一次性抓取了所有内存并使系统崩溃,但这归咎于用户错误。现在对于非系统管理员和技术人员来说,保持交换空间开启,让系统为他们管理它,因为生活确实够忙的了,尽管与之相关的安全问题有时会造成更多问题,在今天,这是一个安全噩梦,因为普通人不会启用加密或在每次重启时刷新交换文件。无论如何,这是我的 2 分钱。

为了适应各种可能的需求,我为任何具有 8GB RAM 或更高内存的系统创建了一个 8GB 的交换分区(在我看来比文件更好)。如果您已经分配了交换空间并且需要更多,则可以很容易地添加另一个分区。对于 RAM 小于 8GB 的设备,我使用 2 倍 RAM 规则。适当的 swappiness 设置消除了任何抖动。正如 @Pierre123 建议的那样,我将系统 swappiness 重置为比默认值 60 更合理的值。@Pierre123 使用 1。将其设置为 0 可以有效地关闭交换。我通常使用 10,但 YMMV。我已经将近 20 年没有使用 MS Windows 了,但当我使用时,我设置了一个交换分区而不是文件。更容易且更快地进行碎片整理,并且不太可能损坏文件系统。今天,由于所有新系统中常见的 SSD,您可以通过将分区放在标准 HDD 而不是 SSD 上来避免麻烦,因为许多系统都配备(或可以升级到)一个 SSD 和一个 HDD。感谢 @David Both,感谢您撰写了一篇出色的文章,澄清了许多初学者甚至一些老手对交换空间的困惑。

不客气。我很高兴您觉得这篇文章有帮助。

回复 ,作者:Tim K(未验证)

我的系统有 12GB RAM(4GB 原装,8GB 是我自己添加的),System76 设置分配了 13GB 交换空间。我经常检查,但我从未见过任何交换空间在使用。基于此,我认为 0.5 倍 RAM 绰绰有余,甚至零也可能是可行的。事实上,我从未见过一次使用超过 50% 的 RAM。

“因此,建议的交换空间被认为是系统内存工作负载的函数,”

这听起来不错,但随后我们需要一个将交换空间与工作负载联系起来的规则,或者更好的是,将 RAM 大小与工作负载联系起来的规则。

理由是您的交换空间应该足够大以处理最大可能的需求,而内存量与您的“工作集大小”有关。一个合理的衡量标准是查看您的正常运行时间(运行队列长度)。如果它是 20(具有无限 RAM 的系统的长期平均值),则意味着您的工作集是 20 个线程,您还需要那么多处理器核心。第一个近似值是弄清楚这些线程可能属于哪些程序,以及它们需要的内存量,并大致安装那么多 RAM。

更好的方法是将这些程序的大小和任务切换频率考虑在内。或者更简单:只需缩小 RAM 到有效吞吐量和响应时间达到所需水平的点,例如,只有具有无限 RAM 的机器性能的一半。或者您只需查找交换设备平均 15% 的时间处于繁忙等待状态的点。使用 SSD,您将安装比使用磁盘驱动器更少的 RAM,因为您的交换设备的延迟要低得多。

一个简单的经验法则是,您至少需要与 RAM 容量相同的交换空间才能存储崩溃转储。

我通常选择零或等于物理 RAM 的容量。

当您开始任何重要的交换时,通常速度会慢到看起来您的应用程序“挂起”了。也许对于未运行交互代码的服务器来说不是这样,但对于坐在键盘前使用交换空间的我来说,这简直是灾难。

我有 32 GB 内存和超过 1TB 的 SSD。我为什么要虚拟内存来额外磨损我的 SSD?在超过 3 年的时间里,并且运行了大量软件,包括大量的 Java、Eclipse、GIMP、LibreOffice 等,我从未接近耗尽内存。我相信可执行代码的内存页面由实际的可执行文件“备份”在“磁盘”上。因此已经存在“一些”虚拟内存页面。但只读,不会磨损 SSD。

我的理由是:RAM 很便宜,所以使用足够的 RAM,让您不需要交换空间。然后分配等于您的 RAM 容量的 HDD 空间,因为 HDD 空间也很便宜。我的两个系统都有 8 GB RAM,并分配了 8 GB HDD 空间作为交换空间,因为我有 360 GB 的 HDD 空间分布在 2 个驱动器上,所以我永远不会错过 8 GB。

我几乎完全在笔记本电脑上工作,笔记本电脑通常处于休眠状态,最好每隔几个月才重启一次(通常是为了解决安全问题的内核升级)。这使得交换空间需求与从不休眠且每天重启的人非常不同。今天的许多程序编写得很糟糕,内存使用效率低下和/或内存泄漏会随着时间的推移而累积。在运行一两周后,Chromium 网络浏览器本身很容易达到 12-16 GB 的内存使用量。只需退出并重新启动 Chromium,并保留所有相同的选项卡和窗口,即可将内存使用量减少 75% 或更多。再加上 Firefox(有许多选项卡)、几个活动的虚拟机、一些在后台运行的生物信息学分析代码(这些代码通常内存使用效率低下)、两个或三个活动的 IDE,如 Rstudio、PyCharm 或(如果我感觉特别受虐狂),Eclipse,我已经远远超过了我的笔记本电脑上的 32 GB RAM。几乎没有发生交换,因为虽然我使用的一些软件编写良好,内存使用效率很高,但其他程序则不然,它们会占用大量存储空间,因为它们会将不再使用的内容保留在内存中。这意味着我需要大量的交换空间来存储这些程序留下的“垃圾”,并且抖动通常不是问题。我目前配置了 48 GB 的交换空间,与我的 32 GB RAM 一起使用,以允许休眠和“垃圾”,但随着我越来越多地遇到浪费内存的代码,64 GB 的交换空间可能更合适。

以我的经验来看,这完全取决于盒子的用途。您运行的应用程序应该告诉您您需要什么,如果您使用的交换空间过多,您可能需要更多内存。恕我直言

我的客厅笔记本电脑配备 8GB RAM、Ubuntu 14 和 Chrome,零交换空间运行了几年。我忘记创建它了,而且从来都不是问题。

经验法则是,如果您正在交换,请添加 RAM。

我当时正在管理一些 OpenStack 服务器,当它们开始使用任何高于基线的交换空间时,就该重启它们了,因为在那之后它们总是会变慢。然后它们又可以正常运行一两个月。交换空间可以作为金丝雀。

我不确定对于低内存情况,是崩溃并重启更好,还是使用一点交换空间来允许恢复直到您可以重启。

使用云,您应该有多个虚拟机和计算节点。并且您的应用程序应该是 HA,这样您就可以在不影响应用程序的情况下重启节点。在这种情况下,虚拟机上永远不要使用交换空间。

我同意上面提到的 RAM 很便宜的理由……
无论如何,这在很大程度上取决于机器及其用途。
对于我的生产机器(从不休眠),交换空间为零。如果它开始交换,那么性能会急剧下降。最好是应用程序因内存不足而被终止,我被迫找到解决方案,而不是在没有注意到的情况下以较低的速度运行。

我发现,在我的个人笔记本电脑系统上,我没有同时进行大量并行任务来消耗资源,而且我很少消耗甚至一半的可用内存,因此在这种情况下,除非我关心挂起或休眠操作,否则交换空间是可选的。

我通常允许 1 到 2 倍的系统内存来考虑挂起或休眠;否则我让虚拟内存管理事务,并且由于磁盘或内存都不是问题,所以我创建了交换空间,“以防万一”。在实践中,在适度利用和定期更换应用程序的情况下,我通常没有很多进程消耗内存。这些指南只是通用的,不一定代表所有情况,当然也不代表我在家用设备上的典型使用场景。

这些经验法则需要区分工作站和服务器以及后端存储。没有人会休眠服务器。但是,如果您正在处理共享后端 SAN 的 Linux 服务器 VM 集群,则通过为 VM 分配过多的交换空间,您可能会对相邻的 VM 产生负面影响,因为它会消耗其他 VM 共享的磁盘 I/O。但是,如果您使用的是 SSD 或全闪存 SAN,那么磁盘 I/O 就不是什么大问题了。对于我的个人桌面或笔记本电脑,我分配了足够的交换空间来满足我的休眠需求。这两个系统都有 64Gb RAM,所以我有 64Gb 的 SSD 上的交换空间。对于我的服务器(所有服务器都是 VM 和基于共享磁盘的 SAN),我只分配了 2Gb 的交换空间,并使用 Nagios 监控它们。我不希望它们曾经使用交换空间并影响同一 SAN 上的其他服务器。如果超过 2Gb 的 20% 被使用,Nagios 会发出警报,我会为 VM 提供更多内存和/或找出为什么内存被消耗如此之多以至于发生了交换。

我首先要说,笔记本电脑由于休眠的需求而成为例外。在服务器环境中,我运行零交换空间或最小交换空间。多年前,当我管理 VMWare ESX 时,我开始进行实验。由于 ESX 主机框已经具有相当大的交换空间,我发现我可以减少我的 guest 系统上的交换空间(或 Windows 的页面文件)。我的理论是,只有主机操作系统知道真实的硬件情况。交换空间实际上是硬件的功能——确切地说是有限的 RAM。在 RAM 容量充足的系统上,我从不看到发生交换。这就是我的简要解释。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.