为什么部分内存不足会导致延迟?


53

为什么即使部分空间可以存储更多数据,部分RAM(比如说80%)也会使设备滞后很多?我期望它可以正常运行直到99%。

我注意到在移动设备上比在PC上更多,因为它具有较小的RAM,例如,我的移动设备具有2 GB RAM。当我的可用RAM少于1 GB时,它会滞后很多!即使仍有约1 GB的使用空间,为什么会发生这种情况?


28
我怀疑您是在假设未使用可用的RAM。因此,您看到20%的RAM可用,并认为仅使用了80%的RAM。这是不正确的,RAM既可以使用也可以使用。(例如,我现在使用的计算机具有32GB的RAM和21.1 GB的可用空间,但只有1.8 GB的可用空间。)
David Schwartz

2
您的意思是我的RAM有我的RAM的可用空间?莫非。
Mohammed Noureldin

3
当然可以更换它们。但这将对性能产生巨大的负面影响-正如您所看到的那样。如果工作集超过RAM,那么无论有多少RAM可用,性能都会很糟糕。
David Schwartz

3
是什么让您认为导致设备延迟的是RAM百分比?
enkryptor

4
@MohammedNoureldin我想您的RAM繁忙(一定数量的进程正在工作并正在执行某些操作)一定是有原因的。这可能与设备落后的原因相同。RAM加载可能只是一种症状,而不是原因本身。
enkryptor

Answers:


71

这里涉及很多事情,但是我将尽我所能简单地以适用于几乎所有操作系统的方式来解释它。

这里有2条基本原则:

  1. RAM中需要的所有内容的总和与RAM中受益的所有内容的总和几乎总是大于RAM的大小。受益于RAM的事物包括进程工作集和备用列表。后者包含的数据和代码曾经处于活动状态,但此后一直不活动。其中大部分将再次使用,其中一些很快就会使用,因此将其保留在RAM中是有益的。此内存充当一种缓存,但并不是真正必需的,因此在可用内存类别中是这样。像空闲内存一样,它可以快速提供给需要它的任何程序。为了性能,备用内存应该很大。

  2. 存储块的使用频率远非随机,但可以非常准确地预测。内存分为多个块,通常为4K字节。如果系统运行了足够长的时间,则某些块每秒会被访问多次,而其他块可能会在几分钟,几小时,几天甚至几周内没有被访问。在这两个极端之间使用范围很广。内存管理器知道哪些块最近已被访问,哪些块尚未被访问。有一个合理的假设,即不久将再次需要最近访问过的存储块。近期可能不再需要最近未访问的内存。长期的经验证明这是有效的原则。

内存管理器利用第二个原理来大大减轻第一个原理的不良后果。为此,它起到了平衡的作用,即将最近访问的数据保留在RAM中,而将很少使用的数据保留在原始文件或页面文件中。

当RAM充足时,此平衡操作很容易。许多最近使用的数据可以保留在RAM中。这是一个好情况。

当工作负载增加时,事情变得更加复杂。正在使用的数据和代码的总和较大,但RAM的大小保持不变。这意味着可以将其较小的子集保留在RAM中。一些最近使用较少的数据不再可以在RAM中,而必须保留在磁盘上。内存管理器非常努力地在活动使用的内存和可用内存之间保持良好的平衡。但是随着工作量的增加,内存管理器将被迫为正在运行的进程提供更多可用内存。这不是一个好情况,但是内存管理器别无选择。

问题在于,在程序运行时将数据移入和移出RAM需要花费时间。当内存充足时,它不会经常发生,甚至不会被注意到。但是,当RAM使用率达到较高水平时,它会更频繁地发生。这种情况可能变得如此糟糕,以至于将数据移入和移出RAM所花费的时间比实际使用它所花费的时间更多。这很糟糕,内存管理器非常努力地避免这种事情,但是工作量很大,这通常是无法避免的。

内存管理器就在您身边,即使在不利条件下,也始终尽力保持最佳性能。但是,当工作负载很大且可用内存不足时,它必须做坏事才能保持运行。实际上,那是最重要的。首先是使事情保持运行,然后使之尽可能快。


1
您的回答对我很有帮助,谢谢!那memory manger是我OS权利的一部分吗?因此,如果我正在处理指针和这些非常低级的内容,它仍然可以进行分页吗?
Mohammed Noureldin

7
内存管理器是操作系统的一部分。分页是内存管理器的一项基本功能,对于您和我来说,呼吸和操作一样至关重要。它无法停止。
LMiller7

2
@MohammedNoureldin:在编写用户空间应用程序(其内存视图与内核和其他进程的视图隔离)时,您不能直接访问物理内存。您只能访问一个由内存管理器管理的内存视图,您可能猜到了它的所有功能(可能包括分页)。内存指针仅指向内存视图的地址空间中的点。它们是内核和用户空间代码中使用的语言概念,但这并不意味着两个内存视图相同。不要将进程内存管理与内核MM混淆!
David Foerster

6
它是“显而易见的”或“众所周知的”,但也许仍应在此答案中添加:内存(RAM)的速度比硬盘驱动器快1000倍(好吧,取决于很多事情,例如ssd / ide / sata等)。操作系统从ram(+ cache)执行代码,而不是从磁盘执行代码。当内存不足时,操作系统需要将部分(“未使用”)代码从内存“交换”到磁盘,以释放ram来执行其他操作,这将花费大量时间(交换),并且如果这种情况经常发生(例如:您有很多程序,每个程序都需要进行交换才能将其代码加载到内存中),这将使速度大大降低。
奥利维尔·杜拉克

3
我们通常不使用术语“交换”来指代将代码加载到内存中。通常将其称为“故障”。通常,术语“交换”仅用于表示必须将信息从磁盘中弹出之前必须写入磁盘的信息。
David Schwartz

30

所有现代操作系统都使用其他方式未使用的内存来缓存数据,以便可以从快速RAM而不是较慢的存储访问数据。他们通常会将其报告为可用内存,因为应用程序可以清除缓存并在需要时使用它,但实际上仍在使用它。它越少,可以缓存的数据就越少,并且计算机的速度就越慢。


11
实际上,应用程序不需要“清除”缓存。他们只是从操作系统请求RAM。操作系统看到它没有未使用的RAM,将清除文件缓存的一部分,并将现在归零的RAM提供给应用程序。应用程序无法确定RAM的来源。
MSalters

5
@MSalters是的,我同意,该应用程序请求RAM,并且操作系统在必要时清除缓存。我试图保持简单。
迈克·斯科特

那是很清楚的,但是我对细节有些了解,因此我感觉有些东西丢失了,我需要更多细节@LMiller答案实际上帮助了我,如果您可以修改其中的信息。
Mohammed Noureldin

4

该答案大部分已被重写,以重新组织结构并使消息更清晰。我也将其作为社区Wiki答案打开了;随时编辑。

分页是一种内存管理方案,通过该方案,固定大小的内存块将分配有进程。当内存使用率上升到较高水平(即80%的容量)时,分页开始从RAM扩展到vRAM(虚拟RAM)。

vRAM位于系统存储中,通常位于硬盘驱动器中,或位于其他相当大的存储位置中。

进程已分配给硬盘驱动器的一部分以作为内存运行,并将其部分视为RAM。这是一个完全正常的过程,但是,当往返于vRAM传输数据所花费的时间增加时,系统性能就会降低。

虽然可以通过CPU从主板直接访问专用RAM,从而提供快速连接,但虚拟RAM必须在主板和vRAM位置之间横向布线。

但是,这仅会对性能造成轻微影响。当对vRAM进行分页的速率急剧增加时(当专用RAM接近容量时),就会发生颠簸。

淘汰是一种将内存页面快速转移到虚拟内存中的做法。由于必须花费更多的时间来获取和处理数据,因此这对性能造成了巨大的损失。

假设您要写下一个30位数长的数字。您既可以使用记事本坐在屏幕旁边进行书写(使用专用内存),也可以记住5块大块,进入下一个房间,然后将其写在您的记事本中(使用虚拟内存)。两者都能完成工作,但是哪个会更快?

在这里找到更多有关thashing的信息

非常感谢这个答案的贡献者,包括丹尼尔BDaniel B)异种激素(Xenoid)乔恩本特利Jon Bentley)


3
这不是故意进行颠簸。这只是分页和争用物理内存的副作用。同样,虚拟内存不是通过将页面移至磁盘来“创建”的。
Daniel B

脱粒确实是一种副产品,但是在进程运行结束时,脱粒是非常有用的,这有助于防止陷入僵局。是的,虚拟内存被占用而不是创建。我会编辑英寸
威尔

8
不,您混淆了垃圾回收和分页。破坏只是传呼变得病态。
xenoid

@xenoid分页是一种内存管理方案;就像是说我在用汽车和公路系统撞鹿一样令人困惑。脱粒是导致性能下降的过程。但是,我确实同意您的观点,这是寻呼系统的结果。
威尔

1
Wiki答案中包含了注释,可以随时进行编辑。
威尔

1

这是因为OS必须执行大量分页(加载活动程序的一部分)和交换(将RAM中的数据移动到HD,反之亦然)才能保持软件运行。当需要加载可能比可用的20%更多的空间的新页面时,操作系统将必须换出RAM中它认为不太可能很快使用的现有页面。特别是在其他程序启动时。换入和换回页面会花费大量时间,并且会大大降低PC的性能,因为您现在以HD而不是RAM的速度工作。

它在HDD上有一点帮助,可以在HD上创建一个特殊的分区,并将其分配为专用的“交换”空间(不要将其用于“实际”文件)空间,因此交换受HD碎片的影响较小。


当谈论缓存,分页等时,ROM只是HD的命名法。不是工作内存的任何内容。而且ROM通常比RAM慢,几乎总是如此。老式计算机在引导时将数据从ROM复制到RAM(ROM阴影),因为它工作得更快。
吉尔斯·莱斯雷尔

1
当然可以,但是ROM和RAM还是用作非易失性还是​​易失性存储器?BTW ROM通常较慢,在启动时将ROM复制到RAM(ROM阴影)以提高性能。但是可以肯定的是,我将更改一个参考文献以解决您的挑剔问题。;)
吉尔斯·莱斯雷尔

1

请记住,硬盘驱动器比RAM 一个数量级,而RAM本身并不是一开始就那么快(在整个体系结构中)。按照访问速度的顺序(每个梯级比上面的梯级慢一个数量级),您可以

  1. 处理器寄存器 -实际上,寄存器在1个处理器周期内可用。考虑到处理器每秒执行数十亿个周期(3 GHz =每秒30亿个周期),这太快了。
  2. 处理器缓存 -取决于级别,但是它们仍然相当快(L1缓存的3-5个周期可用性)。
  3. 随机存取存储器(RAM) -随机部分意味着您在访问它时不知道它处于什么状态。想想一个包裹运送人,他必须停下来,拿起包裹,走到门口,按门铃,然后等待响应。也许您根本不等,或者等一两分钟,让史密斯太太拖到屋子后面的门上。实际上,我们所说的是14-27个周期之间的任何时间(取决于访问RAM时的状态)。
  4. 硬盘驱动器 -现在这里有一个物理过程,尽管它尽可能快地发生,但您正在等待磁头移动,而磁道在这些磁头下移动。实际上,一个7200 RPM的硬盘驱动器可以在大约4毫秒内完成一次旋转,对于3 GHz处理器,则可以完成大约750,000个周期。太慢了

虚拟内存管理器是一个赌徒。它打赌您不需要一直都使用所有RAM,因此可以进行有根据的猜测,并掷骰子,使您的文档程序(在您阅读本文的最后10分钟一直在后台)非常重要,并将其推向HDD。

但是,然后您单击回到文档!现在,VMM必须从HDD加载所有这些数据。更糟糕的是,如果您的RAM不足,它现在必须将其他数据(更多赌博)推送到HDD,以释放可用空间。Linux喜欢住在这里。它将用经常使用的数据填充RAM的绝大部分(对于处理很少的服务器来说是非常好的)。


1
是的,内存管理器是一个赌徒,但很容易被误解。如果内存访问确实是随机的,则内存管理器会经常出错,整个系统都会崩溃。但是程序往往具有很强的参考性。也就是说,大多数内存访问都倾向于局限于相对较小的内存区域。它们确实可以移动,但是足够慢以使系统正常工作。几率堆积在内存管理器的青睐中,错误得以迅速纠正。这已经证明了数十年的经验
LMiller7 '17

随机存取存储器中的“随机”是指您可以随机访问其中任何一个的事实。(与像在硬盘驱动器或磁带中那样,必须等待数据在读磁头下方通过,然后依次访问数据相反)。
菲尔(Phil)

0

颠簸的答案几乎钉住了它。如果可以的话,可以通过减少交换性(将东西移动到交换空间之前,系统允许使用多少内存)来最大程度地减少这种情况的发生。我想将系统设置为不交换,直到服务器应用程序的内存达到99%为止,因为默认设置实际上意味着我将需要编写代码以仅利用80%的内存来利用缓存,而不会因推送而受到惩罚系统进入交换空间。

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.