当我还有未使用的RAM时,为什么要使用一些交换空间?


9

好奇心多于问题;我承认,这是一个令人尴尬的基本问题:

我注意到,在很多情况下,即使我有约600MB的未使用RAM,在我的Linux机器上,我仍将使用约500MB的交换空间。

我幼稚的高级理解是,交换空间直到RAM用完才开始使用。

我走得更远,并假设这种情况必须由Linux内核来完成,因为请求内存的用户进程仅在逻辑上进行请求,并且不知道该内存是由RAM还是交换空间物理支持的。

这就引出了一个问题,为什么内核会抢占交换空间?这是一些性能调整算法的一部分吗?是否交换到它认为最不可能被访问的内存磁盘部分(也许是LRU方案)?如果是这样,将所有内容保留在RAM中,并且仅在接近用尽时才有意义,然后再将LRU部分从RAM交换到交换空间,这是否有意义?

我应该澄清一下,我的linux服务器有2GB的RAM和2GB的交换空间。


1
为什么以4票结束这个问题?

2
@Aaron:不是您有一个坏问题。您只是在系统管理方面进行了表述,因此它更适合高级用户或服务器管理员。您是否出于好奇而对此感到好奇,似乎更像是超级用户POV。

Answers:


11

实际上,RAM 的未使用部分用作HDD缓存。如果您考虑一下,实际上访问磁盘的某些部分会更频繁地读取磁盘的某些部分。在使用RAM缓存HDD数据的同时,将该RAM放在磁盘上是很有意义的。


7

提前换出东西很有意义,因为当您真正需要内存时,您不必等到内核完成磁盘访问即可。

例如,假设您要打开大图像。加载映像后,它将占用300MB的RAM。如果内核使用了所有可用的RAM,则加载映像要求内核将200MB从RAM转移到磁盘。如果它预先清空了RAM,则可以节省几毫秒。


7

2个原因:

  1. (@dtrosset)Linux将交换未使用的程序位,以提供更多的缓存和缓冲区。
  2. 您过去可能已经使用了更多的内存,并交换了一些东西,并且由于尚未使用它而没有将其交换掉,即使强制退出的东西现在已经消失了。

1

除了其他答案外,您还可以将Linux配置为要求对任何分配的内存进行备份,即使程序不使用它也是如此。

但是,过量使用内存和担心OOM杀手并不是Linux体验的必要部分。只需将sysctl参数vm / overcommit_memory设置为2即可关闭过量使用行为,并永远阻止OOM杀手。大多数现代系统应具有足够的磁盘空间,以在大多数情况下提供足够的交换文件。与其试图防止过度使用的内存耗尽时杀死宠物进程,不如仅仅完全避免这种情况,这可能会更容易。[ OOM杀手的喘息 ]

如果程序分配了内存,则内核可以简单地将更多页的交换标记为已提交。该指示存储在内核的内存管理器中,尚未触及实际的磁盘空间。在使用该内存之前,实际上无需交换任何内容。如果从不使用它们,那么交换使用将在不影响性能的情况下波动。

因为进程是用它们自己的地址空间或“视图”呈现的(首先是交换的工作方式),所以内核在管理方式上有很多余地。还是使用上面链接文章中的fork示例,因为共享新的内存页面比分配大量未使用的内存要多得多,因此可以分配写时复制内存,从而增加交换使用次数。实际写入时(可能不会发生),可以用任何未使用的RAM替换“已提交的交换”(然后增加RAM使用量并减少交换使用量)。想象一个分配了500MB的进程,该进程在使用了全部或几乎所有RAM的计算机上分叉。如果交换中有500MB可用空间(而且磁盘空间很便宜,那么今天的TB驱动器有1%是多少?:P),则无需复制内存(但是,

这样就避免了OOM杀手的可能性,并且假设内存分配(包括通过fork之类的“隐式”分配)立即成功或失败,并设计了大多数软件,这要简单得多,并且实际认识到,如果必须交换则可能会影响性能。这种影响几乎总是很小的,但是在最坏的情况下会导致交换失败(有时甚至比完全的内核崩溃或OOM杀手更可取)。

尽管我不知道Linux内存管理器如何工作的确切细节,但是这个答案是我自己的一般理解以及我多年来记得的内容。我试图重新编辑此答案,因此需要对OS设计有一个最低限度的了解(这是相当复杂的,不是我对自己非常感兴趣的事情),但似乎有些混乱。如果您知道如何进行改进,请告诉我。在令人抓紧的手上,这可能不是一个令人尴尬的基本问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.