现代 Linux 系统的正确交换空间大小是多少?

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

Lewis Cowles, CC BY-SA 4.0

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

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

这考虑到了 RAM 内存大小通常很小,并且为交换空间分配超过 RAM 2 倍的量并不能提高性能。 交换空间超过 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。 即使在运行四到五个 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 和交换。 这使它简单易记。 我遇到麻烦的唯一一次是当我尝试使用 pan2 来访问 Usenet 时。 即使有这么多的交换空间,它也无法处理 NewsDemon 上的保留。 它曾经运行了 84 个小时,并耗尽了所有交换空间来下载标头,然后因分段错误而崩溃。

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

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

Windows 只需要交换来从系统崩溃中恢复,这大约是内核交换的 50-150MB。

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

在 RAM 较少的系统上,我建议研究 zswap/zram。 如果你有足够的 RAM,在我看来你根本不需要任何交换。

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

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

我选择零的原因:我总是购买足够的 RAM,而我最大的工作负载(RAM 方面)是浏览器或一些游戏。 在后一种情况下,较低的纹理质量比运行到交换空间要好得多。

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

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

感谢您指出这一点。 它已被修复。

回复 作者 Rudolf Polzer (未验证)

在 Linux 上 — 不少于 RAM 的大小:用于挂起到磁盘! 通常你会给出更多,因为缺乏对空间需求的精确估计 — 这实际上应该存在于某人的脑海中,并且是一件很棒的事情...

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

这不值得花太多心思。 当我使用监控工具查看我的系统实际使用的东西时,交换很少起作用。

这真的取决于你的使用情况和背景。

早在 486/Pentium 系统的时代,我永远不会创建超过 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 的 RAM,而我只使用了 40GB。

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

哈哈,我只能想象 288GB 的交换空间。这就是为什么设置因设置而异的原因。

我通常避免在具有 4GB+ RAM 的系统上使用交换空间......我也更喜欢完全关闭而不是休眠。我想它可能在 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

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

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

为了适应各种可能的需求,我为任何具有 8GB RAM 或更高的系统创建一个 8GB 的交换分区(我认为比文件更好)。如果你已经分配了交换空间并且需要更多,那么添加另一个分区就足够容易了。对于 RAM 少于 8GB 的设备,我使用 2X 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 绰绰有余,甚至零也可能可行。事实上,我一次从未见过超过 50% 的 RAM 被使用。

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

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

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

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

一个简单的经验法则是,你至少需要与交换空间一样多的 RAM 才能存储崩溃转储。

我通常选择零或等于物理 RAM 的大小。

当你开始进行任何重要的交换时,事情通常会变得非常慢,以至于你的应用程序看起来好像“挂起”了。也许对于未运行交互代码的服务器来说不是这样,但对于我来说,当坐在键盘前使用交换空间时,那就是死亡。

我有 32 GB 的内存和超过 1 TB 的 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 内存就远远不够用了。 几乎没有进行交换,因为虽然我使用的一些软件编写良好,并且内存使用效率很高,但其他程序则不然,它们占用大量存储空间,因为它们将不再使用的东西保存在内存中。 这意味着我需要大量的交换空间来存储这些程序“丢弃的垃圾”,并且通常不会出现颠簸问题。 我目前配置了 48 GB 的交换空间来搭配我的 32 GB 内存,以允许休眠和存储“垃圾”,但随着我越来越多地遇到浪费内存的代码,64 GB 的交换空间可能更合适。

以我的经验来看,一切都取决于机器的用途。您正在运行的应用程序应该告诉您需要什么,如果您使用的交换空间过多,您可能需要更多的内存。恕我直言

我的客厅笔记本电脑运行 8GB 内存、Ubuntu 14 和 Chrome 几年,零交换空间。 我忘记创建它了,而且从来没有问题。

经验法则是,如果您正在使用交换空间,请添加内存。

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

我不确定低内存时崩溃并重新启动是否更好,还是拥有少量交换空间以便在可以重新启动之前允许恢复更好。

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

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

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

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

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

首先我要说的是,由于休眠的需求,笔记本电脑是一个例外。 在服务器环境中,我运行没有或只有最小交换空间。 多年前,当我管理 VMWare ESX 时,我开始进行实验。 由于 ESX 主机盒已经有一个相当大的交换空间,我发现我可以减少我的访客机的交换空间(或 Windows 的页面文件)。 我的理论是,只有主机操作系统知道真实的硬件状况。 交换空间实际上是硬件的一个函数 - 准确地说是有限的 RAM。 在拥有大量 RAM 的系统上,我从不看到发生交换。 这就是我的简要解释。

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