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

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

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


注意这类似于有关 svchost.exe 的细粒度性能报告

答案1

有一种简单的方法可以获取您需要的信息(但它需要对您的系统进行轻微的更改):

将每个服务拆分为在其自己的 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 写入率。对于 Process Explorer,菜单 View/Select Columns:选项卡 Process Memory/Page Fault Delta、选项卡 Process Performance/IO Delta Write Bytes、选项卡 Process Performance/IO Delta Read Bytes。


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

答案2

您可以使用内置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 远程注册表
svchost.exe 196 W3SVC
svchost.exe 2940 术语服务
svchost.exe 2420 TapiSrv

服务不一定由 托管svchost.exe。因此,如果您无法通过执行文件名过滤找到服务,只需运行tasklist /svc。它将显示所有服务。

答案3

进程管理器确实会向你显示 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

这涉及到 stackoverflow 领域,但如果您可以获得每个线程的内存统计信息,您可能能够通过将它们与线程堆栈中列出的 dll 进行匹配,将其粗略地与各个服务 dll 关联起来。不过,对于我这个小小的系统管理员大脑来说,这太难了。

相关内容