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


42

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


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


1
对于具有相同问题的任何人(例如我):-Windows任务管理器->性能(选项卡)->资源监视器(按钮)-然后您将svchost.exe按服务拆分在Windows 7上
Oliver

1
@Oliver资源监视器显示每个服务的CPU,但是此问题与内存有关。
艾丹·瑞安

您可以在此SO答案中看到一个脚本来检查各个服务的内存。
Rosberg Linhares

@RosbergLinhares此脚本等效于PeterMortensen的
Aidan Ryan

@AidanRyan,对我而言,PeterMortensen的脚本不适用于Schedule和gpsvc服务。
Rosberg Linhares

Answers:


51

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

将每个服务拆分为在其自己的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.

12
对于在那里的PowerShell用户:Get-Service | ForEach-Object {C:\ Windows \ System32 \ SC.EXE config $ _。Name type = own}
Tamara Wijsman 2010年

1
实际上,我通常会svchost.exe在Windows XP系统上注意到3或4个实例。在这一个我看到6
桑布

4
@TomWij:使用此代码段时要格外小心-如果您正在使用EFS(加密文件系统)并将其设置为type= own可能无法正常工作,并且您将无法访问使用此文件加密的任何文件(如果OS文件经过加密,将是灾难性的!)
Beau

@Beau:你知道为什么会这样吗?
Tamara Wijsman

2
@Peter Mortensen:我创建了Service Disclosure工具。它1.存储共享svchost.exe进程的服务。2.将服务配置为在单独的进程中运行。3.将第1步中存储的所有服务返回到一个进程。欢迎您提出意见和建议。谢谢你的想法。
Dmytro Ovdiienko

18

您可以使用内置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。它将显示所有服务。


6
这似乎没有显示问题所要求的单个服务使用的内存。
邓肯·琼斯

9

进程资源管理器确实会向您显示svchost中的各个内存使用情况。确保从此处获得最新版本http://technet.microsoft.com/zh-cn/sysinternals/bb896653

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

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


4
它不显示堆大小。
Der_Meister 2014年

7

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

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

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

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


5
凉!现在有没有办法将堆内存的使用情况跟踪到拥有它的单个服务?
艾丹·瑞安

3

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


2

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

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


1

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.