进程的私有字节数如何显着小于其对系统提交费用的影响?

bac*_*car 6 windows windows-server-2003 memory process-explorer

在 64 位 Windows Server 2003 上,我可以使用 taskmgr 或进程资源管理器看到总提交费用约为 3.5GB,但是当我对每个进程消耗的私有字节数求和时(通过运行pslist -m并添加Priv列下的所有值)总容量为 1.6GB。

我知道哪个进程似乎导致了这个(sqlservr.exe),因为当我终止该进程时,提交费用急剧下降。然而,有问题的进程只消耗了约 220MB 的私有字节,但终止进程会使提交费用降低约 1.6GB。

这怎么可能?提交费用怎么会比 Private Bytes 大得多,后者应该代表提交的内存量?如果其他一些因素导致提交费用,那么该因素是什么,我如何在流程浏览器中查看其影响?

注意:我声称我已经理解保留内存和提交内存之间的区别:我上面的调查特别涉及私有字节,它只包括提交的内存,不包括保留的内存。在这种情况下,进程的虚拟大小超过 4GB,但这应该无关紧要 - procexp 中的虚拟大小代表保留的、未提交的内存,不应参与提交费用。

我对这个问题的一般答案特别感兴趣:我假设如果 sqlservr.exe 可以以这种方式运行,那么任何进程都可能会这样做。

进一步调查

我注意到,尽管 Procexp 报告了 220MB 的私有字节,但将 Sysinternals VMMap 指向此进程报告了1.6GB的已提交“私有数据”。鉴于“Windows® Sysinternals 管理员参考”中有关此字段的文档指出:

私有数据内存是由 VirtualAlloc 分配的内存,不由堆管理器或 .NET 运行时进一步处理,或分配给堆栈类别... VMMap 对“私有数据”的定义比 Process Explorer 的定义更精细“私人字节。” Procexp 的“私有字节”包括属于该进程的所有私有提交内存。

即 VMMap 提交的“私有数据”应该小于 procexp 的“私有字节”。

此外,在阅读 Mark Russinovich 出色的Pushing the Limits of Windows: Virtual Memory的“进程提交内存”部分后,他强调了两种不会出现在 Private Bytes 中的情况:

  • 具有写时复制语义的文件映射视图(但是,根据 VMMap,没有分配给映射文件的大量空间)。
  • 页面文件支持的虚拟内存(但是,我-l按照建议尝试了带有标志的testlimit ,并且页面文件支持的部分没有消耗大量内存)

Rya*_*ies 10

编辑:请注意,评论部分现在无关紧要,因为我的原始答案已经消失。

你的问题:

进程的私有字节数如何显着小于其对系统提交费用的影响?

这可以用 Mark Russinovich 的直接引述来回答:

有两种类型的进程虚拟内存确实计入提交限制:私有和页面文件支持。

归因于进程的私有字节可能(并且通常)小于该进程对系统提交费用的影响,因为该进程还可以分配页面文件支持的虚拟内存。

页面文件支持的虚拟内存很难归因于特定进程,因为它可以在进程之间共享。没有特定于进程的性能计数器可以告诉您任何进程已分配或正在引用多少页面文件支持的虚拟内存,但是,它仍然计入提交限制。

这篇文章是该主题的权威文章,在那篇文章中,他具体演示了一个进程分配了大量页面文件支持的 VM,但进程的私有字节仍然很低的情况。

他还向您展示了如何使用handle.exe来检测节对象句柄的分配大小。这就是您如何检测哪个进程对提交费用产生如此大的影响。

您提到您已经查看了sqlservr.exewithhandle.exe并且它没有打开大量节对象的句柄,这些节对象将解释在您 kill 时释放的提交费用sqlservr.exe

巧合的是,内核空间中也有内存分配是针对系统提交限制收费的,例如分页和非分页池,以及驱动程序锁定的内存,包括虚拟机气球驱动程序等。我认为这与这个案子,但我不想让它不说。

SQL Server 是一个庞大而复杂的产品,由许多不同的进程组成,这些进程在系统上协同工作以提供所有 SQL Server 服务。事实上,SQL Server 有自己的内部内存管理器,从设计用于测量 Windows 虚拟内存分配的工具的角度来看,它可以使它看起来不典型。

sqlservr.exe不会单独行动。还有

  • msmdsrv.exe (分析服务)
  • sqlwriter.exe (SQL VSS 编写器)
  • sqlagent.exe (SQL 代理)
  • fdlauncher.exe (全文过滤守护进程启动器)
  • fdhost.exe (全文主持人)
  • ReportingServicesService.exe
  • SQLBrowser.exe

当我杀死时sqlservr.exesqlagent.exe也会自动死亡。这意味着系统提交费用将减少两个进程贡献的金额。其他 SQL 相关进程也可能在被终止时释放页面文件支持的部分sqlservr.exe,即使这些进程本身仍在运行。所有这些都会导致系统的当前提交费用在sqlservr.exe被杀死时下降,即使它们从来不是sqlservr.exe.