it-swarm.cn

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

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


请注意,这类似于 svchost.exe上的细粒度性能报告

43
Aidan Ryan

有一种简单的方法来获取您要的信息(但是确实需要对系统进行一些更改):

将每个服务拆分为在其自己的SVCHOST.EXE进程中运行,并且消耗CPU周期的服务将在任务管理器或进程资源管理器中轻松显示(“ =“之后的空格是必需的)):

SC Config Servicename Type= own

在命令行窗口中执行此操作,或将其放入BAT脚本中。需要具有管理特权,并且必须重新启动计算机才能生效。

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

SC Config Servicename Type= share

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

SC Config winmgmt Type= own

该技术没有不良影响,只是可能会稍微增加内存消耗。而且,除了观察每个服务的CPU使用率之外,还可以轻松观察每个服务的页面错误增量,磁盘I/O读取速率和磁盘I/O写入速率。对于“进程资源管理器”,分别在菜单“查看/选择列”中:“进程内存/页面错误增量”选项卡,“进程性能/ IO增量写字节数”选项卡,“进程性能/ IO增量读字节”选项卡。


在大多数系统上,只有一个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.
51
Peter Mortensen

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

 tasklist /fi "services eq TermService"

输出:

图片名称PID会话名称会话#内存使用情况
 =============================== ======================================= 
 svchost.exe 2940控制台0 7.096 K 

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

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

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

图片名称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托管。因此,如果找不到按执行文件名过滤的服务,则只需运行tasklist /svc。它将显示所有服务。

19
splattne

实际上,Process Explorer将向您显示svchost中的各个内存使用情况。确保您从此处获得最新版本 http://technet.Microsoft.com/zh-cn/sysinternals/bb89665

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

现在,您可以查看svchost中单个服务(由dll实现)的内存使用情况并对其进行排序。

9
Chris T.

虽然Process Monitor是一个通用工具(除了为您洗碗以外,它会做所有事情),但是对于此特定问题,您想使用VMMap(另一个SysInternals工具)

http://technet.Microsoft.com/zh-cn/sysinternals/dd535533.aspx

VMMap是一个进程虚拟和物理内存分析实用程序。它显示了进程的已落实虚拟内存类型的细分,以及操作系统为这些类型分配的物理内存(工作集)的数量。除了内存使用情况的图形表示之外,VMMap还显示摘要信息和详细的进程内存映射。强大的过滤和刷新功能使您可以识别进程内存使用量的来源以及应用程序功能的内存成本。

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

7
Sean Earp

这正在进入stackoverflow领域,但是如果您可以掌握每个线程的内存统计信息,则可以通过将它们与线程堆栈中列出的dll进行匹配,来大致将其与各个服务dll相关联。但是,对于我细小的sysadmin大脑来说,方法太多了。

3
user2278

我在这里扩展彼得·莫滕森的答案。在修改服务类型之前,请通过以下命令检查现有类型:

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”以外的任何其他类型均不得修改。

2
sken130

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

不过,您可以通过注册表来执行此操作,这意味着将“ Type”参数设置为0x00000010(12月16日):

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

请注意,尽管您选择修改哪个服务,但是除了“自己的”和“共享”之外,还有一些特殊类型不应该更改,例如:

  • 核心
  • 文件系统
  • 记录
  • 适应

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

1
Michael Böckling