交换分区的重要性

交换分区的目的是什么?
如何知道我有足够的交换分区?不会太多或太少。
我的Ubuntu电脑用于一般的事情:
网络(电子邮件,Facebook等)
一些电影
很少玩游戏。

从已发布的内容来看,似乎我的交换空间太多了。3GB的内存,300GB的硬盘,以及一个8GB的交换分区。 - lamcro
2多余的交换空间不会对你造成任何伤害,而且为了将其缩小而回收1.7%的磁盘空间可能并不值得努力。是的,它比你可能永远使用的要大得多,我不会担心这个问题。 - msw
1如果您将来给您的系统添加了额外的内存,您无需扩大交换分区,这也可以看作是一种“未来可靠”的交换分区。:) - JanC
6个回答

交换分区有几个作用。
它可以作为备份内存。也就是说,如果您的计算机的内存不足,它将使用交换区作为临时更多内存的来源。更具体地说,它会将未使用的项目从RAM中“交换”到交换区,以便在那一瞬间留出空闲空间给需要它的应用程序。这并不理想,因为与普通RAM相比,向硬盘的数据传输速率显着较低。实际上,这意味着从交换区检索信息要慢得多。
当计算机休眠时,它也会被用到。休眠涉及将RAM的当前状态(类似于ISO表示图像)拍摄成一个镜像,并将其保存到交换区。然后在计算机重新启动时重新加载此镜像。
为了最有效地使用,交换区应至少为(RAM * 1.5),但建议使用更多。例如,在我的3GB RAM系统上,我有一个7.2GB的交换区。

如果您不使用某些东西,将其置换到磁盘上并使用RAM来处理您实际使用的内容是理想的(例如,将CUPS或其他不经常使用的守护进程移动到交换空间可以为缓存实际经常使用的磁盘数据提供更多内存)。 - JanC
-1; "(RAM * 1.5) although more is recommended" - 在桌面电脑上吗?你正在重复多年来被证明是错误的传统智慧。 - user280493
值得注意的是,当您发表评论时,这个答案已经几年前了。 - Chris Pfohl

这与关于“交换分区”正确大小的问题非常接近。 我在那里的答案中提供了许多相同的信息 - 基本上,如果您想要休眠,通常希望您的交换空间至少与RAM一样大,除此之外,1或2 GB这样的整数轮数就足够了。 因为交换比RAM慢得多,如果您填满了多个GB的交换,则计算机几乎肯定变得无法使用。
此外,没有真正需要交换分区 - 交换文件(可用于主流Linux文件系统)提供相同的性能,并使添加更多交换空间变得非常容易,如果您发现自己不够用。

这里有关于交换空间的非常深入的信息

有些人说交换空间应该是内存的两倍,但我个人推荐这样设置:

交换空间 = 1.5 X 总内存

例如:

如果你有2GB的内存 -> 交换空间 = 1.5 x 2 = 3

P.D:Ubuntu桌面版使用交换空间来休眠(关闭电脑,不需要电源,程序状态保存)。如果休眠对你很重要,请确保交换空间大于内存加上溢出的交换空间。


free命令可以告诉你正在使用多少交换空间。例如,在这台机器上:
$ free -m
             total       used       free     buffers     cached
Mem:          1947       1863         84         312        758
-/+ buffers/cache:        792       1154
Swap:         4000          3       3997

显示给我我的RAM有2GB(1947m),系统已经使用了大部分。然而,312m被用于I/O缓冲区,剩下的758m系统决定用磁盘缓存填充。

磁盘缓存很有趣,因为它使用快速内存而不是慢速磁盘来存储内容。这些内容本可以从磁盘获取,但为了以防万一保留了下来。这也意味着如果需要的话,有758m的内存可以立即回收,因为系统知道可以在磁盘上找到这些数据。

这就是为什么有第二行显示,如果没有缓冲和缓存,我将有一半的RAM可供使用(1154m)。

第三行显示我有一个过大的交换分区(它一直在那里却没有做任何事情),其中仅使用了惊人的3m。这是内核真的不指望很快会用到的东西,所以它被放在了"后院"。

虽然free给你当前的快照,但vmstat可以给你一个运行中的图像:

$ vmstat 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0   3588  86236 316524 769132    0    0    14    13  126   81  4  1 95  0
 0  0   3588  83872 316532 770512    0    0     0    20  264 1229  3  1 96  0

有很多信息在那里,但有趣的是没有交换进入(si)或交换出去(so)的流量。这意味着在过去的10秒钟里我根本没有使用交换空间。

我有一台配备了慢硬盘但相对高内存(8GB)的笔记本电脑。在这种配置下,我发现交换驱动器是适得其反的,原因如下:
  1. 从交换空间中恢复应用程序的速度很慢,与从头开始加载应用程序相当。我宁愿拥有一个快速响应的环境,即使这意味着有时必须关闭和重新加载应用程序,也不愿意遇到突然停顿的环境。
  2. 如果我想要休眠功能,那就意味着要将大量数据写入磁盘。如果持续进行(swappiness 60的默认行为),那将会持续消耗电池电量;如果只在休眠时进行(通过降低swapiness),那实际进入休眠状态需要很长时间。我发现将系统挂起到RAM而不是挂起到磁盘的效果非常满意。它可以保持挂起状态数天,并且恢复挂起的速度比完全休眠要快得多。
  3. 由于硬盘速度较慢,我更喜欢保留1GB的RAM作为磁盘缓存,以实现内存与速度的交换。这使得我的机器反应迅速,但也意味着我只能将8GB中的7GB用于应用程序。我使用的软件是earlyoom的一个分支版本,当RAM使用量达到88%时,它会关闭旧的浏览器标签。我偶尔需要重新加载被关闭的旧浏览器标签。

这些建议在什么情况下不适用?

  • 如果您拥有一个快速硬盘驱动器或固态硬盘(SSD),并且对电池耗尽没有太多顾虑,那么我上面提到的缺点将不适用。(尽管早期的SSD可能存在磨损问题,但我相信自2018年以来销售的任何SSD都应该没问题。)

  • 如果您的机器内存非常少,或者您喜欢同时使用多个占用内存较大的应用程序,那么无论有什么缺点,您可能需要使用交换空间来完成工作。在内存变得更便宜之前,这是交换空间的主要用途。

  • 如果您真的需要休眠(也许您想暂停您的笔记本电脑,并在几天后重新打开而不充电),那么您需要一个交换驱动器(建议至少与您的内存一样大)。

注意:

我们长时间运行的一些软件(尤其是操作系统和桌面环境)会将代码加载到内存中,但实际上永远不会再次使用。这些页面可以被移动到交换空间,并且永远不需要再次取出,从而避免了我之前提到的缺点。因此,有时我会创建一个小的512MB或1GB的交换文件,让未使用的内存页面被交换出去。这样就为应用程序留下了更多的RAM。(需要:一种测量交换翻转的技术,以帮助调整交换文件的大小。)

交换区是硬盘空间的一部分,用于支持有限的RAM内存空间。由于RAM的大小有限,因此某些应用程序需要比可用的RAM空间更多的RAM。在这种情况下,这个交换空间也被称为虚拟内存,用于支持RAM。
与RAM的速度相比,它的速度较慢。当我们运行一个大型应用程序时,该应用程序最近未使用的部分会被交换到硬盘上的交换区,当需要时再从交换区交换回来。这使操作系统感觉像拥有更多的RAM一样。
它是在安装操作系统时创建的专用分区。
如果将交换区的大小设置为RAM大小的两倍,则效果更好。
您可以使用以下命令检查已使用和可用的交换区: $ cat /proc/swaps 文件名 类型 大小 已使用 优先级 /dev/sda10 分区 7812092 16 -1