交换何时移回物理内存?


8

何时将交换移回Linux中的物理内存?是否仅按需提供 什么时候需要?还是在计算机未处于高负载状态时将交换缓慢地传输到物理内存?

Answers:


7

一经请求。实际上,Linux会在空闲时缓慢转移物理内存以进行交换(请参阅:“交换性”)。


谢谢。一个简短的答案。我喜欢这一点(尽管我感谢其他人为他们的回答所付出的努力)!
Ztyx

这个答案是错误的。问题是何时调入内存而不是调出内存。相反。在出现页面错误时,内核将从磁盘/交换中重新加载页面。因此大多是按需的。您可以访问进程的所有虚拟内存以触发页面错误。结果,页面将被复制回RAM。
user228505

7

在正常操作期间,交换数据将按需加载到内存中,如其他答复所述,但是还有一种情况发生:禁用交换空间,前提是有足够的物理内存来加载整个交换内容。

做就是了:

swapoff -a

…并且所有交换数据将“返回”到内存中。副作用是磁盘缓冲区/缓存可能会被刷新。

有时可能需要这样做swapoff -a ; swapon -a,例如,在进行了一些有漏洞的内存泄漏过程之后,在崩溃之前清除了更重要的进程,以确保系统中正在运行的任何进程都已加载到内存中,而不会等待交换中的内容。几分钟。


哦,你每天都学到好东西!顺便说一句,如果物理内存不足,“交换-a”会失败吗?进行掉期交易有风险吗?
Ztyx

如果没有足够的物理内存,它将失败。这仍然是swapoff不会失败的风险,但是系统将在内存耗尽后立即用完,swapoff并且OOM将终止随机进程(在最坏的情况下,即将调用的shell swaponswapon命令)。实际上,这是不太可能的–缓存在swapoff调用之前会占用大量内存,因此它应该有足够的RAM才能运行两个命令。
Jacek Konieczny

7

正如其他人指出的那样,仅在需要时(按需)将页面复制回RAM,而不是占用可能更好地留给缓存/缓冲区使用的RAM。

将页面复制回RAM而不是移动的事实很重要,如果您不了解,可能会造成混乱。除非完全不再需要页面(即,页面已完全释放),已在RAM中更改(因此,交换中的副本不再正确)或交换即将用尽(然后打开),否则不会从交换中释放该页面。 -disk块需要换出其他页面)。这样,如果将来需要再次换出页面,则无需进行磁盘写操作,因为内核知道磁盘上已经存在良好的副本-当可用RAM严重不足时,这可以大大减少“颠簸”,但是交换空间也不需要拥挤。

您可以看到当前在RAM中有多少页并且可以从中进行交换cat /proc/meminfo-该SwapCached行是当前在RAM和磁盘中的页中的数据量。如果您认为当前的交换使用的交换量高于预期,请检查SwapCached值,因为这很可能解释差异。


以前已经有围绕类似问题的讨论。但是,不是这个具体问题。另请参阅serverfault.com/questions/100448/…,其中涉及SwapCached。
Ztyx

我什至不记得写这个答案了……我可能只是链接到(或复制并粘贴了)它,而不是键入上面的内容……
David Spillett

0

这通常绑定到您使用的硬件。在大多数硬件(包括英特尔)上,MMU控制着整个过程。

当程序分配内存时,它将向MMU请求并将其取回虚拟地址。反过来,MMU将在全局地址空间映射中将该页面注册为“正在使用”。

当程序实际访问该内存空间时,MMU会将页面查找到地址映射中。如果该页面位于“实时”内存中,它将向操作系统发送“实时”指针,该OS将代表程序处理对内存的读/写操作。如果当前未分配内存,则将触发页面错误。然后,操作系统会捕获该处理器异常,然后由操作系统负责确定数据在交换文件中的位置,将其加载到物理内存中,然后将页面返回给MMU,以便初始过程可以继续。

这意味着,除非访问内存页,否则一旦交换掉它就永远不会回到“活动”内存中。这就是为什么通常会有一个OS API,该API允许程序指定不将特定的内存块交换到磁盘上,而应该保留在内存中(我不了解Linux,但是在Windows中,它是VirtualLock函数) 。


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.