如何查找单个Windows服务的内存使用情况?

任务pipe理器显示svchost.exe的整体内存使用情况。 有没有办法查看单个服务的内存使用情况?


注意这与svchost.exe的Finegrained性能报告类似

有一个简单的方法来获取您所要求的信息(但它确实需要对您的系统进行轻微的更改):

拆分每个服务以在其自己的SVCHOST.EXE进程中运行,并且消耗CPU周期的服务将在任务pipe理器或进程资源pipe理器中很容易看到(需要“=”之后的空间):

SC Config Servicename Type= own 

在命令行窗口中执行此操作,或将其放入BAT脚本中。 pipe理权限是必需的,需要重新启动计算机才能生效。

原始状态可以通过以下方式恢复:

 SC Config Servicename Type= share 

例如:使Windows Management Instrumentation在单独的SVCHOST.EXE中运行:

 SC Config winmgmt Type= own 

这种技术没有不良影响,除了可能稍微增加内存消耗。 除了观察每个服务的CPU使用情况外,还可以轻松观察每个服务的页面错误增量,磁盘I / O读取速率和磁盘I / O写入速率。 对于Process Explorer,菜单View / Select Columns:选项卡Process Memory / Page故障Delta,选项卡Process Performance / IO Delta写入字节,选项卡Process Process性能/ IO Delta读取字节数。


在大多数系统上,只有一个SVCHOST.EXE进程有很多服务。 我已经使用这个序列(它可以直接粘贴到命令行窗口中):

 rem 1. "Automatic Updates" SC Config wuauserv Type= own rem 2. "COM+ Event System" SC Config EventSystem Type= own rem 3. "Computer Browser" SC Config Browser Type= own rem 4. "Cryptographic Services" SC Config CryptSvc Type= own rem 5. "Distributed Link Tracking" SC Config TrkWks Type= own rem 6. "Help and Support" SC Config helpsvc Type= own rem 7. "Logical Disk Manager" SC Config dmserver Type= own rem 8. "Network Connections" SC Config Netman Type= own rem 9. "Network Location Awareness" SC Config NLA Type= own rem 10. "Remote Access Connection Manager" SC Config RasMan Type= own rem 11. "Secondary Logon" SC Config seclogon Type= own rem 12. "Server" SC Config lanmanserver Type= own rem 13. "Shell Hardware Detection" SC Config ShellHWDetection Type= own rem 14. "System Event Notification" SC Config SENS Type= own rem 15. "System Restore Service" SC Config srservice Type= own rem 16. "Task Scheduler" SC Config Schedule Type= own rem 17. "Telephony" SC Config TapiSrv Type= own rem 18. "Terminal Services" SC Config TermService Type= own rem 19. "Themes" SC Config Themes Type= own rem 20. "Windows Audio" SC Config AudioSrv Type= own rem 21. "Windows Firewall/Internet Connection Sharing (ICS)" SC Config SharedAccess Type= own rem 22. "Windows Management Instrumentation" SC Config winmgmt Type= own rem 23. "Wireless Configuration" SC Config WZCSVC Type= own rem 24. "Workstation" SC Config lanmanworkstation Type= own rem End. 

您可以使用内置的tasklist命令并按服务名称( /fi switch)进行过滤,例如:

  tasklist /fi "services eq TermService" 

输出:

图像名称PID会话名称会话编号用法
 ========================= ======== ================ = ========== ============
 svchost.exe 2940控制台0 7.096 K

如果您不知道名称,则可以通过运行以下语句来列出它们:

  tasklist /svc /fi "imagename eq svchost.exe" 

它列出了由svchost.exe托pipe的所有服务,例如:

图像名称PID服务
 ========================= ======== ================= ===========================
 svchost.exe 632 DcomLaunch
 svchost.exe 684 RpcSs
 svchost.exe 748 Dhcp,Dnscache
 svchost.exe 788 LmHosts,W32Time
 svchost.exe 804 AeLookupSvc,AudioSrv,浏览器,CryptSvc,
                                    dmserver,EventSystem,helpsvc,
                                    lanmanserver,lanmanworkstation,Messenger,
                                    Netman,Nla,RasMan,Schedule,seclogon,
                                    SENS,ShellHWDetection,TrkWks,winmgmt,
                                    wuauserv,WZCSVC
 svchost.exe 1140 ERSvc
 svchost.exe 1712 RemoteRegistry
 svchost.exe 196 W3SVC
 svchost.exe 2940 TermService
 svchost.exe 2420 TapiSrv

服务不一定由svchost.exe托pipe。 所以,如果你找不到执行文件名过滤的服务,只需运行tasklist /svc 。 它会显示所有的服务。

虽然进程监视器是一个通用的工具(它会做的一切,但洗盘子给你),对于这个特定的问题,你想使用VMMap(另一个SysInternals实用程序)

http://technet.microsoft.com/en-us/sysinternals/dd535533.aspx

VMMap是一个进程虚拟和物理内存分析工具。 它显示了进程提交的虚拟内存types以及操作系统为这些types分配的物理内存(工作集)的数量。 除了内存使用的graphics表示外,VMMap还显示摘要信息和详细的进程内存映射。 强大的过滤和刷新function使您可以识别进程内存使用的来源以及应用程序function的内存成本。

除了分析活动进程的灵活视图之外,VMMap还支持以多种forms导出数据,包括保留所有信息的本机格式,以便您可以重新加载。它还包括启用脚本scheme的命令行选项。

进程资源pipe理器确实会显示您在svchost内的个别内存使用确保您有从这里的最新版本http://technet.microsoft.com/en-us/sysinternals/bb896653

确保以pipe理员身份运行Process Explorer,单击要检查的svchost,单击“ View DLLsbutton(或CTRL + D )。 右键单击DLL窗口中的标题, Select Columns... ,然后检查WS Total Bytes ,然后点击OK

现在,您可以在svchost中查看和sorting单个服务(由dll实现)的内存使用情况。

这是进入到stackoverflow的领土,但如果你可以得到每个线程的内存统计信息,你可能能够大致关联到单个服务DLL通过匹配到线程堆栈中列出的DLL。 尽pipe我的小系统pipe理员大脑太多了。

彼得·莫特森(Peter Mortensen)的回答在此延伸。 在修改服务types之前,请通过以下命令检查现有types:

 sc query wuauserv 

这将输出以下内容:

  TYPE : 20 WIN32_SHARE_PROCESS STATE : 1 STOPPED WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 

除了“10 WIN32_OWN_PROCESS”,“20 WIN32_SHARE_PROCESS”之外的任何types都不应该被修改。

分离服务是正确的答案,但sc config命令不适用于我(2008 R2)。

你可以通过registry来完成,也就是将“Type”参数设置为0x00000010(hex):

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<ServiceName>\Type 

请注意,您select修改哪项服务,除了“自己”和“共享”之外,还有一些不应该改变的特殊types,如:

  • 核心
  • 的filesys
  • REC
  • 适应

之后,只需重新启动服务,您应该在ProcessExplorer中看到它现在有自己的svchost.exe进程。