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

Aid*_*yan 44 windows memory svchost service

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


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

Pet*_*sen 52

有一种简单的方法可以获取您所要求的信息(但它确实需要对您的系统稍作改动):

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

SC Config Servicename Type= own
Run Code Online (Sandbox Code Playgroud)

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

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

SC Config Servicename Type= share
Run Code Online (Sandbox Code Playgroud)

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

SC Config winmgmt Type= own
Run Code Online (Sandbox Code Playgroud)

这种技术没有不良影响,只是可能会略微增加内存消耗。除了观察每个服务的 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.
Run Code Online (Sandbox Code Playgroud)

  • 对于那里的 PowerShell 用户:Get-Service | ForEach-Object {C:\Windows\System32\SC.EXE config $_.Name type= own} (14认同)
  • @TomWij:使用此代码段时要_极其_小心--如果您使用 EFS(加密文件系统)并将其设置为 `type= own`,它可能无法正常工作,并且您将无法访问任何加密的文件使用它(如果操作系统文件被加密,这可能是灾难性的!) (4认同)
  • @Peter Mortensen:我创建了 [服务披露工具](http://sourceforge.net/projects/svcdisclsr/)。它 1. 存储共享 svchost.exe 进程的服务。2. 将服务配置为在单独的进程中运行。3. 将第 1 步中存储的所有服务返回给一个进程。欢迎您提出意见和建议。谢谢你的想法。 (3认同)

spl*_*tne 20

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

 tasklist /fi "services eq TermService"
Run Code Online (Sandbox Code Playgroud)

输出:

Image Name PID Session Name Session# Mem Usage
==================================================== ======================
svchost.exe 2940 控制台 0 7.096 K

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

 tasklist /svc /fi "imagename eq svchost.exe"
Run Code Online (Sandbox Code Playgroud)

它列出了 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、事件系统、helpvc、
                                   lanmanserver, lanmanworkstation, Messenger,
                                   Netman, Nla, RasMan, Schedule, selogon,
                                   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认同)

小智 10

进程资源管理器确实会在 svchost 中显示您的个人内存使用情况确保您从这里获得最新版本https://docs.microsoft.com/sysinternals/downloads/process-explorer

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

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

  • 它不显示堆大小。 (4认同)

Sea*_*arp 7

虽然 Process Monitor 是一个通用实用程序(它可以为您做除洗碗外的所有事情),但对于这个特定问题,您想使用 VMMap(另一个 SysInternals 实用程序)

https://docs.microsoft.com/sysinternals/downloads/vmmap

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

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

  • 凉爽的!现在有没有办法将堆内存块的使用情况跟踪到拥有它的单个服务? (5认同)