现代 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 量以及您是否希望系统有足够的内存来休眠。要允许休眠,您需要在自定义分区阶段编辑交换空间。“推荐”的交换分区大小在默认安装期间自动建立,但我通常发现它对于我的需求来说要么太大要么太小。

The 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 的建议。即使在运行四到五个 VM、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 和 swap。这使其简单易记。我遇到问题的唯一一次是我尝试使用 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),或者当需要休眠时,因为休眠会使用交换空间。

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

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

我认为这取决于您的环境。
就我而言,我有很多 VM。大多数 VM 都是 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% 一样多。否则,系统将无法正确休眠或挂起。

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

所以我建议的规则是:取决于您用计算机做什么... ;)

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

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

我改用交换文件,它可以动态增长。我的交换文件安装在我的根分区上,我为根分区分配了 64GB。据我回忆,我只使用了大约 10% 的空间,所以如果真的需要,这基本上给我留下了大约 50GB 的交换空间。当然,我从来没有达到那么高的水平,可能我在我的计算机上运行的最占用资源的东西(它甚至不是一台计算机,它只是一台来自我学校的带有键盘的破旧平板电脑,只有 4GB RAM)是 Android Studio。

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

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

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

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

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

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

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

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

这听起来不错,但随后我们需要一个将交换空间与工作负载联系起来的规则,或者更好的是,将 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 空间作为交换空间,因为我在 2 个驱动器上有 360 GB 的 HDD 空间,所以我永远不会错过 8 GB。

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

根据我的经验,这完全取决于盒子的用途。您正在运行的应用程序应该告诉您您需要什么,如果您使用了太多交换空间,您可能需要更多 ram。恕我直言

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

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

我当时正在管理一些 OpenStack 服务器,当它们开始使用任何高于基线的交换空间时,就该重启它们了,因为在那之后它们总是会变慢。然后它们会在接下来的 1-2 个月内保持良好状态。交换空间就像金丝雀一样有用。

我不确定对于内存不足的情况,崩溃并重启是否比使用少量交换空间来允许恢复直到您可以重启更好。

使用云,您应该拥有多个 VM 和计算节点。并且您的应用程序应该是 HA,以便您可以重启节点而不会影响您的应用程序。在那种情况下,VM 上永远不要有交换空间。

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

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

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

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

我首先要说,笔记本电脑是一个例外,因为需要休眠。在服务器环境中,我运行时不使用或使用最少的交换空间。多年前,当我管理 VMWare ESX 时,我开始进行实验。由于 ESX 主机箱已经有一个相当大的交换空间,我发现我可以减少我的来宾机上的交换空间(或 Windows 的页面文件)。我的理论是只有主机操作系统知道真实的硬件情况。交换空间实际上是硬件的功能 - 确切地说,是有限的 RAM。在 RAM 充足的系统上,我从没见过发生交换。这是我的简要解释。

© . All rights reserved.