在64位Windows Server 2003上,我可以看到使用taskmgr或进程资源pipe理器,总的提交费用大约为3.5GB,但是当我总结每个进程使用的专用字节(通过运行pslist -m并添加所有值Priv专栏)总计1.6GB。
我知道哪个进程似乎是造成这个(sqlservr.exe),当我杀了进程,提交费用急剧下降。 然而,这个过程只消耗了大约220MB的私有字节,但是这个过程却让这个过程下降了1.6GB。
这怎么可能? 如何提交费用如此显着大于专用字节,这应该代表承诺的内存量? 如果其他一些因素导致交易费用,那么这个因素是什么,我怎样才能看到它在过程资源pipe理器中的影响?
注意:我声明我已经理解了保留和已提交的内存之间的区别 :上面的调查特别涉及只包含已提交的内存并排除保留的内存的专用字节 。 在这种情况下,进程的虚拟大小超过了4GB,但是这应该是无关紧要的 – procexp中的虚拟大小代表保留的未提交的内存,不应该对提交费用做出贡献。
我特别感兴趣的是这个问题的一般化的答案:我假设,如果sqlservr.exe可以这样的行为,任何进程可能会。
我注意到在这个过程中指向Sysinternals VMMap尽pipeProcexp报告了一个220MB的私有字节,但报告了一个1.6GB的“私有数据 ”。 鉴于“Windows®Sysinternalspipe理员参考手册”中关于此字段的文档声明:
专用数据存储器是由VirtualAlloc分配的内存,不会由堆pipe理器或.NET运行时进一步处理,也不会被分配到堆栈类别… VMMap的“专用数据”定义比Process Explorer “专用字节”。Procexp的“专用字节”包括属于该进程的所有专用提交的内存。
即VMMap提交的“Private Data”应该小于Procexp的“Private Bytes”。
另外,在阅读Mark Russinovich的“ 推动内存”一节“ 推动Windows的限制:虚拟内存”之后 ,他突出强调了两个不会出现在私有字节中的情况:
-l标志进行testing,并且没有显着的内存被页面文件支持的部分占用) 编辑:请注意,评论部分现在不相关,因为我的原始答案已经消失。
你的问题:
一个进程的私有字节如何能大大减less对系统执行的影响?
这可以从马克Russinovich直接引用回答:
有两种types的进程虚拟内存可以计入提交限制:private和pagefile-backed。
归因于进程的专用字节可以(通常是)小于进程对系统提交费用的影响,因为进程也可以分配由页面文件支持的虚拟内存。
页面文件支持的虚拟内存很难归因于特定的进程,因为它可以在进程之间共享。 没有特定于进程的性能计数器可以告诉您有多less页面文件支持的虚拟内存已经分配或正在引用,但是它仍然会计入提交限制。
本文是关于这个主题的权威文章,在那篇文章中,他特别演示了一个进程已经分配了大量页面文件支持的虚拟机的情况,但是该进程的私有字节仍然非常低。
他还向您展示了如何使用handle.exe来检测段对象的句柄分配大小。 这就是你如何能够发现哪个进程对交付费用有如此大的影响。
您提到您已经使用handle.exe查看了sqlservr.exe ,并且它没有处理大量的节对象,这些节对象会sqlservr.exe在您sqlservr.exe时释放的提交费用。
巧合的是,在内核空间中还有内存分配,这些内存分配是针对系统提交限制(例如分页和非分页池)以及驱动程序locking的内存(包括虚拟机气球驱动程序等)进行的。我不相信这与这个案子,但我不想离开它没有说。
SQL Server是一个庞大而复杂的产品,由许多不同的进程组成,这些进程在系统上一起工作以提供所有的SQL Server服务。 事实上,SQL Server有自己的内部内存pipe理器,可以从devise用于测量Windows虚拟内存分配的工具的angular度来看,它使其看起来不典型。
sqlservr.exe不会单独执行。 还有
msmdsrv.exe (分析服务) sqlwriter.exe (SQL VSS编写器) sqlagent.exe (SQL代理) fdlauncher.exe (全文filter守护程序启动器) fdhost.exe (全文主机) ReportingServicesService.exe SQLBrowser.exe 当我杀死sqlservr.exe , sqlagent.exe也自动死亡。 这意味着系统提交费用将会降低两个进程所贡献的金额。 其他与SQL相关的进程也可能在sqlservr.exe被sqlservr.exe时释放页面文件支持的部分,即使进程本身仍在运行。 所有这些都会导致当sqlservr.exe被sqlservr.exe时,系统当前的执行费用下降,即使它们不属于sqlservr.exe的专用字节的一部分。