yek*_*chi 21 memory windows operating-systems memory-management
我想给我的计算机添加一些 RAM,因为这几天它变慢了,所以我来到任务栏查看内存使用统计,但我很难猜测一些内存管理参数的真正含义。所以
问题 1:Commited Memory、Cached、究竟是什么Paged,Not-Paged pool以及它们与In-UseMemory有何不同。
Q2 : 据我所知,内核有一个复杂的内存管理算法,所以如果我的笔记本电脑内存中有一些空闲内存,我是否可以得出我的物理内存足够的结论?
wbk*_*ang 19
回答 Q1:
对 Q2 的回答:
简单地说,在 Windows 上,“内存”可以由物理 RAM 或页面文件(在磁盘上)支持。页面文件有多种用途,包括为不常访问的程序释放物理 RAM。它比物理 RAM 慢几个数量级,因为它由磁盘支持,无论是否旋转。
如果您的系统没有足够的内存,则您正在使用的应用程序可能会溢出到磁盘并导致您的系统显着变慢。
正如您从答案 1 中看到的那样,从这些数字中确定您是否有足够的内存是完全不容易的。
我建议使用以下方法来确定您是否有足够的内存:
perfmon /res)你有几个补救措施:
Jam*_*han 10
服用这些不是按照你问的顺序...
(注意:这仍在进行中。我可能会在接下来的几天内对其进行调整和编辑。我将添加屏幕上限。)
(注意第二点:我意识到这很长。这大约是我能做到的尽可能短,同时至少尝试回答通常由较短答案引起的大多数问题。为了进行比较,Windows Internals的内存管理章节是大约 200 页,足以自己制作一本体面的书。如果你真的想学习这些东西,还有另一本书(我推荐)叫做What Makes It Page?它更详细。刚刚结束600 页。正如我上面提到的,我可能会在接下来的几天内对其进行编辑,但不要指望它会变短!)
In Use是与虚拟页面相对应的物理内存 (RAM) 量,可以在不发生页面错误的情况下访问这些页面。
注意:这不是在不发生页面错误的情况下可以访问的虚拟内存量!这是一个更大的数字。许多不同的虚拟页面可以映射到同一个物理页面。
背景:每个虚拟页面都可以是“有效”的,这意味着它占用物理内存并且其页表条目设置了“有效”位。否则,有效位可以清除,在这种情况下,引用虚拟页面将导致页面错误。然后操作系统必须解决故障。然后,该页面被称为“故障”到 RAM。这通常被认为意味着“从磁盘读取页面”,但通常情况并非如此(稍后详述)。您会听到用于有效页面的另一个术语是“常驻”。
In use的主要贡献者是包含进程和操作系统工作集的页面,以及非分页池(通常相当小,几百 MB 左右 - 我稍后会详细介绍)。进程的工作集只是该进程当前“常驻”的物理页面的列表。每个进程都有自己的工作集列表。
注意:RAM 的物理页可以同时在多个进程的工作集中。这意味着将所有进程的工作集大小相加将得到一个大于它们使用的实际 RAM 量的数字。在使用中总,虽然正确地考虑共享的页面; 即它不会重复或多次计算它们。
注意:“使用中”一词可能会产生误导,因为备用和修改列表上的 RAM 页面也可以说是“正在使用”,即使它们在没有页面错误的情况下无法访问并且它们不在任何工作集中。这两个列表将在稍后解释。
注意:很多讨论都将提到流程及其工作集。Windows 操作系统的内核模式代码和数据也存在于虚拟内存中,其中大部分是可分页的。也就是说,它不必一直呆在 RAM 中,就像应用程序代码和数据一样。虽然不是进程本身(尽管是所谓的“系统”进程),但有一个工作集来跟踪对操作系统“有效”的页面——或者更准确地说,对内核地址空间“有效”。实际上,从 Windows 7 及更高版本开始,系统工作集分为四个工作集(用于各种类型的可分页代码和数据),主要是出于性能原因。我谈论的关于工作集的几乎所有内容都适用于操作系统的工作集以及进程的工作集,但我不会添加“
你没有问这个,但这很重要。可用的是可以分配给新用途的所有 RAM(例如分配给之前使用它的进程以外的进程,或者甚至分配给同一进程中的新虚拟页面),而无需将其从工作集中删除将其内容保存在某处。(因为内容已经保存在某处,如果它们很重要的话)。
可用不会出现在当前的任务管理器性能选项卡的内存窗格中。它在资源监视器的内存选项卡中可见。它是备用、空闲和零页列表的总和。有关这些的详细信息即将公布。
任务管理器性能选项卡上的缓存计数器是以下三种 RAM 使用的总和。它是 RAM 的计数,而不是虚拟内存的计数。
缓存的第 1 部分:备用页面列表(包括SuperFetch)
这在“资源监视器”“内存”选项卡上可见。在 Windows Vista 之前,它专门用作“页面缓存”:从工作集中删除的 RAM 页面(之后对它们的引用会导致页面错误)首先放在备用页面列表中。从那里它们可以重新分配给其他用途(“重新调整用途”)。但是,如果原始进程在此之前引用了 SPL 上的页面,则该页面可以恢复到其原始工作集(即,它可以“使其有效”)而无需从磁盘读取它。因此,SPL 形成了一个系统范围的先进先出页面缓存,这些页面可能很快就会再次需要。(与每个进程的工作集相反;页面是根据最近最少使用的基础从工作集中删除的,而不是 FIFO。)
所有这些仍然适用。但是从 Vista 和更高版本开始,SPL 上的某些页面可能会重新用于SuperFetch使用。SuperFetch 是一种主动的只读文件缓存机制,它维护经常访问的文件的历史记录,并尝试通过在实际请求之前将这些文件读入 RAM 来加快处理速度。
SuperFetch 的巧妙之处在于,SuperFetch 使用的页面不会从备用页面列表中删除,因此仍然可以在很短的时间内重新调整用途,就像 SPL 上的任何其他内容一样。而且它们仍被视为Cached 的一部分。并作为Available 的一部分。所以 SuperFetch 并没有真正“使用”任何 RAM!或者至少,它不会影响“可用”,也不会影响“使用中”。
默认情况下,在操作系统磁盘使用 SSD 的系统上禁用 SuperFetch。备用列表仍按此处所述用作页面缓存。
备用页面列表是报告为可用的 RAM 的一部分,这意味着它的任何和所有页面都可以在任何时候重新用于其他任何东西——即使是那些被 SuperFetch 使用的页面。它不是In Use 的一部分,即使它正在被使用。当然,SuperFetch 正在使用它!每次将软页面错误解决到 SPL 时也会使用它。我在这里要说的是,声称In Use是“正在使用”的 RAM 量,充其量只是一种误导。Microsoft 应该为In Use选择一个不同的术语。
缓存第 2 部分:修改后的页面列表
从 Windows 8 和更高版本开始,缓存计数器还包括修改页面列表中的物理页面。(MPL 已经存在了很长时间;所有新的东西都将它算作 Cached 的一部分。)与 SPL 一样,MPL 的大小可以在 Resource Monitor 的 Memory 选项卡上看到,尽管它通常应该很小或为零。
MPL 与 SPL 类似,不同之处在于它用于其内容在驻留期间被修改的页面。(这是由 CPU 的 MMU 记录的。)当从它们的工作集中删除时,这些页面将移动到 MPL 而不是 SPL。“系统”进程中的“修改页面写入器”线程定期唤醒,将这些页面的内容复制到各自的后备存储(页面文件,或者对于文件后备页面,它们各自的文件),然后将它们移动到备用页面列表,此时它们将成为可用的一部分,并被视为就像它们首先被放在 SPL 上一样。在 MPL 上时,它们不是可用的一部分,因为在将它们的内容保存在某处之前,它们不能被重新用于其他用途。
MPL 也不计为In use 的一部分。
请注意,如果您(愚蠢地,无视好的建议)禁用了您的页面文件,系统将永远无法写出页面文件支持的修改页面。这里的常见症状是 MPL 过大,这会导致可用 RAM 短缺,从而导致“页面抖动”,即操作系统花费更多时间将页面复制到 RAM 和从 RAM 复制出来,而不是执行您想做的工作。
Windows 10 的“压缩内存”功能在某种程度上改变了“写入页面文件”部分;我不会在这里讨论这个,因为它不会影响我们正在谈论的计数器。
缓存第 3 部分:文件系统缓存
或者至少是文件系统缓存的“常驻”部分。再次 - “常驻”意味着它是更大虚拟分配的 RAM 中、工作集中的部分。
嘿,我们不是已经讨论过缓存了吗?“超级获取”?是的,但这与 SuperFetch 不同。与 SuperFetch 不同,文件系统缓存是一种反应性缓存(永远不会预测 - 即它在实际使用之前永远不会缓存任何东西,然后它会被缓存以备将来快速使用(在同一个操作系统实例中)。
文件缓存在支持非扇区对齐边界上的文件访问方面也起着至关重要的作用。如果使用“无缓存”选项打开文件,则所有读取和写入操作都必须是驱动器扇区大小的倍数,并且必须从扇区边界开始。文件缓存允许您一次只读取和写入一个字节(至少就您的 API 调用而言)。
在早期版本的 Windows 中,文件缓存的常驻部分是系统工作集的一部分,它对系统工作集的贡献可以在 PerfMon 计数器中找到Memory | System Cache Resident Bytes。从 Windows 7 和更高版本开始,系统工作集已分解为四个独立的工作集,文件缓存占用其中一个,并且相同的计数器仍反映其驻留大小。无论哪种方式,文件系统缓存的常驻部分都包含在“使用中”中(因为它是一个工作集)。
该分页和非分页柜台给内核地址空间的两个区域的虚拟大小,被称为“内存池”。两者都用于 Windows 内核模式代码的各种组件(包括设备驱动程序)所需的相当小的短期内存分配(通常每个都远低于 1 MB)。内核模式代码以与使用“堆”的应用程序非常相似的方式使用这些。(Windows 称它们为池而不是堆的原因是历史性的。)
其中一个池是非分页的,这意味着它始终保存在 RAM 中。所以对于这个,任务管理器指示的大小是物理(RAM)大小以及虚拟大小。非分页池由可能在无法处理页面错误的上下文中执行的组件使用,例如设备驱动程序的中断服务例程、DPC 例程和其他必须在 IRQL DISPATCH_LEVEL 或更高级别运行的例程。我在这里的另一个答案中解释了 IRQL。
其他池称为分页通过任务管理器,真的应该被称为“页面能”。就像通过processses使用普通的虚拟内存,它没有必要换出,这只是它的部分可以是。与所有其他可分页区域一样,它的页面将根据需要“故障”到 RAM 中——即在不在 RAM 中时被引用时——如果物理内存不足并且必须解决新的页面故障,则稍后可能会“调出”。
任务管理器为可分页池显示的大小是虚拟大小。其中的一个子集将是“有效的”,即在 RAM 中(即物理大小)。任务管理器不会报告分页池的内存中(调入)部分的大小,但可以在 SysInternals 工具进程资源管理器(查看 | 系统信息)或 PerfMon 计数器中看到Memory | Pool Paged Resident Bytes。
所有“非分页”池以及分页池的“调入”或“常驻”部分都被视为“使用中”的一部分。
有关内核内存池的更多信息,请参阅内核接口文档ExAllocatePool。
注意:非分页不是分页的分页子集!这些是单独的虚拟分配。因此,例如,非分页池以比分页更大的大小显示是完全有可能的——但并不常见。
注意:这些绝不是内核虚拟地址空间的总量。
的承诺计数器指特定类型的虚拟内存。为了真正解释这一点,我必须解释其他类型。
虚拟地址空间的每一页都可以处于以下五种状态之一:未使用、不可分页、映射、保留和已提交。
“不可分页”、“已提交”和“已映射”虚拟地址空间对应于虚拟内存,可以成功访问(读取或写入),可能会出现页面错误;无法访问“未使用”和“保留”。
(您有时会看到该错误消息 - “0x(某个地址)处的指令引用了 0x(某个地址)处的内存,无法读取该内存”(或“写入”)?如果您的系统上的代码试图访问“未使用”或“保留”地址空间。或者如果尝试写入只读页面,或从用户模式访问内核保护的虚拟地址。注意:报告的地址是虚拟的,而不是物理的,并且该消息并不意味着您的 RAM 有问题。这是程序中的错误。)
“不可分页”虚拟内存始终在物理上“驻留”,并且几乎完全属于 Windows 内核模式代码的范畴。它是“使用中”的一部分。已经讨论过的非分页池是不可分页虚拟内存的一个示例。
注意:即使不可分页的虚拟内存总是常驻,我们仍然认为它是“虚拟的”,因为我们仍然通过虚拟地址引用它。它也具有虚拟内存的所有其他属性,除了它始终“有效”,因此在访问时永远不会产生页面错误。
“映射的”虚拟地址空间可以从磁盘分页到/从磁盘分页。它的“后备存储”——这是一个奇特的名称,表示如果它们不能同时保存在 RAM 中,它的部分保存位置——是在创建每个映射区域时提供的文件。(这里的相关 API 是CreateFileMapping和MapViewOfFile。)映射区域的内容实际上是从这些文件开始的;它在访问时被读入 RAM(“需求分页”)。
顺便说一下,映射内存非常常见——它位于所有可执行代码所在的映射区域中。与传统的读/写访问相反,它也非常常用于访问大文件。
映射区域可以跨进程共享。如果映射设置为读/写访问(通常不会为代码文件完成!),则对映射 vas 的修改将写回相应的映射文件。
然而,有能力创建一个“页面文件支持的映射区域”,该区域可以像任何其他映射区域一样在进程之间共享,但是一旦所有进程都取消映射它,更改将不会保留在任何地方。
“提交的”虚拟地址空间也可以从磁盘分页到/从磁盘分页。这与“映射”之间的区别在于,“已提交” vas 的后备存储(如果需要)是页面文件(如果您有一个,您肯定应该这样做)。
“已提交”和“映射”一样是按需分页的,但是第一次访问已提交内存的页面时,不会从磁盘读取 - 因为与映射内存不同,没有地方可以从. 一个新的物理页被简单地分配给进程(从以前的“可用”RAM,通常是零页列表)并在进程工作集中有效。因此,在第一次引用之前,已提交内存的页面不会在任何地方占用任何存储空间。
由于提交的内存是可分页的(即使您没有页面文件,但您确实应该有一个),因此并非所有内存都可能同时位于 RAM 中——“常驻”。像往常一样,操作系统尝试将最近访问的 vas 页面保留在 RAM 中;如果可用 RAM 稀缺,那么操作系统将“分页出”其他页面,将它们从它们的工作集中删除并将它们放在 SPL 或 MPL 上。在后一种情况下,它们很快就会被写入其后备存储。
“提交”的总大小(即,页面文件支持,或者如果你有一个页面文件,你肯定应该这样做),在所有进程加上操作系统内核中,是单词Committed下的第一个数字。
它还包括其他一些贡献:主要是非分页和分页池,以及任何映射到写时复制的映射区域。这个数字通常称为提交费用。
考虑提交费用的一种方法是:如果您有一个页面文件(您应该这样做),并且除了映射内存之外,所有可分页的内存内容(提交、分页池等)都必须从 RAM 中分页 - 这是需要多少页面文件空间。
Committed一词下的第二个数字是“提交限制”。它是 RAM 的大小加上页面文件的当前总大小。提交费用不得超过此值。如果进程尝试提交大小超过提交限制的虚拟内存,那么如果可能,Windows 将扩大页面文件以腾出空间(并且您将看到“内存不足”弹出窗口)。如果无法放大页面文件,则消息将显示“内存不足”,并且执行此操作的进程将崩溃。
提交费用的常驻子集是“使用中”的一部分。请注意,即使您没有页面文件(如果没有,您有什么问题?)这也不一定与提交费用相同。一方面,如果您提交了虚拟内存,但随后没有访问所有虚拟内存,那么您未访问的部分将永远不会占用任何存储空间。提交的内存也可以从工作集中删除并放在修改后的页面列表中。通常,只有一部分已提交内存会占用 RAM。
任务管理器无法确定 RAM 中已提交内存的子集。但是,SysInternals 工具“RAMmap”可以显示这一点。
可用+使用中+修改后的总和为操作系统可用的总 RAM。
操作系统可用的总 RAM 加上“硬件保留”RAM 应等于安装的 RAM 总量。
可用等于备用页面列表,加上空闲页面列表,加上零页面列表
资源监视器的内存选项卡显示的空闲是零页面列表和空闲页面列表的总和。
(我故意省略了对零页列表的更多讨论,因为这对被问到的柜台并不重要。)
Cached =备用页面列表(其中一些由 SuperFetch 使用),加上(对于 Windows 8 和更高版本)修改后的页面列表,加上(对于早期版本的 Windows 尚未精确确定)页面的分页或驻留部分系统文件缓存。
注意:由于备用页面列表是“可用”和“缓存”的一部分,因此完全有可能将“可用”和“缓存”相加并得到大于 RAM 总量的总数!这些数字并不意味着要加在一起。
资源监视器的内存选项卡将空闲和零的总和显示为单个数字,标记为“空闲”。性能监视器可以分别显示这些大小。
“据我所知,内核以一种复杂的方式操纵内存管理,所以我可以得出结论,如果我的笔记本电脑的内存中有空闲内存,那么我的内存就足够了吗?”
“我有足够的内存吗?”的最佳指标 通常是您的硬页面错误率。硬页面错误是需要从磁盘读取的页面错误。您可以在资源监视器(“概览”和“内存”选项卡)右列的图表上或在“内存”选项卡上的每个进程中看到这一点。PerfMon 计数器Memory | Page Reads/sec也显示它。
整体故障率是硬故障率的超集,远没有那么有趣。它包括“软页面错误”,它不涉及磁盘读取,因此花费的时间要少得多。(很难说他们花费了多少时间,但我估计最多需要几百个指令时间。)这些包括解决到备用和修改页面列表的错误,已经驻留的共享页面的错误一个或多个其他进程,以及“要求零”错误,这些错误发生在第一次引用私有页面时。如果您每秒看到数千个页面错误,请不要感到惊讶。从磁盘读取的页面会极大地减慢速度(即使您的磁盘是 SSD)。
但是“可用”呢?还是“免费”?
许多人担心“可用”内存或“可用”内存的数量。首先,对于一个没有多少进程长时间退出的 Windows 系统来说,没有或几乎没有可用内存是很常见的。这是预期的,因为通常将内存返回到“空闲”的唯一事件是进程退出时;然后将对其“提交”内存有效的物理页移到“空闲”列表中。
“可用”包括备用列表,并且与“免费”一样可以分配给新用途,因此如果您有足够的“可用”,则不必担心其中没有太多“免费”。
即使对于“可用”,拥有大量可用内存的主要优点是支持新程序的快速启动,或已运行程序的新行为。在这种情况下,您会看到一连串的硬页面错误——这是完全正常的,确实是不可避免的。如果您的工作负载不是很多,那么您的系统可能会对较低百分比的可用 RAM 感到满意。
我将再次提及:SSD 使硬页面错误发生的速度比发生在旋转磁盘上的速度要快得多。如果是 M.2 PCIe SSD,它们的运行速度还会更快。它们仍然比软故障慢得多。
还有一件事:您经常会听到“您永远无法拥有足够的 RAM”的说法。嗯,确实(除非某些异常情况)向您的系统添加 RAM 永远不会导致性能问题。但是,您肯定可以花太多钱在内存上。有一个收益递减点,超过这个点,添加更多 RAM 不会显着加快您的系统速度。这点在哪里取决于您的工作负载和硬件的各个方面(特别是您使用的是 SSD 还是旋转磁盘)。正如我相信我在上面已经明确说明的那样,摆脱页面文件并不能消除与磁盘的分页,因为映射文件仍然存在并且仍然通过分页读取和写入。所以摆脱你的页面文件(无论如何你都不应该这样做)并不意味着你可以不再担心你的磁盘有多快。
| 归档时间: |
|
| 查看次数: |
25712 次 |
| 最近记录: |