AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 2786
Accepted
Randolpho
Randolpho
Asked: 2009-05-02 13:00:26 +0800 CST2009-05-02 13:00:26 +0800 CST 2009-05-02 13:00:26 +0800 CST

svchost.exe 上的细粒度性能报告

  • 772

这一直困扰着我,所以我会问服务器故障社区。

我喜欢Process Explorer,因为它不仅可以跟踪您在任务管理器中获得的高级任务。但我一直想知道托管在svchost下的单个进程中的十几个服务中的哪一个使我的处理器飙升。

那么......有没有任何非侵入性的方法可以找到这些信息?

windows performance-monitoring task-manager process-explorer svchost
  • 6 6 个回答
  • 9634 Views

6 个回答

  • Voted
  1. Best Answer
    Peter Mortensen
    2009-06-03T03:01:05+08:002009-06-03T03:01:05+08:00

    是的,有一种(几乎)非侵入性且简单的方法:

    拆分每个服务以在其自己的 SVCHOST.EXE 进程中运行,并且消耗 CPU 周期的服务将在 Process Explorer 中轻松可见(“=”后面的空格是必需的):

    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.
    
    • 34
  2. Kevin Dente
    2009-05-02T13:38:56+08:002009-05-02T13:38:56+08:00

    虽然我不知道直接执行此操作的简单方法,但您通常可以从 svchost 进程的 Process Explorer 属性页面推断它。进程属性上的“服务”选项卡将告诉您哪些服务托管在该进程中。线程选项卡将显示正在运行的线程和线程堆栈以及它们的 CPU 使用率。通常,线程上的起始地址将指示入口点 DLL,并通过扩展服务,在该线程上运行。其他时候,您可以查看线程调用堆栈,并在调用堆栈中看到模块名称,告诉您正在运行哪段代码。

    • 2
  3. Dmytro Ovdiienko
    2012-02-25T09:36:10+08:002012-02-25T09:36:10+08:00

    尝试服务披露工具。它:

    1. 存储共享 svchost.exe 进程的服务。
    2. 将服务配置为在单独的进程中运行。重新启动后,您将在单独的进程中看到每个服务。
    3. 将步骤#1 中存储的所有服务返回到一个进程。

    欢迎您提出意见和建议。

    @Peter Mortensen:谢谢你的想法。

    • 1
  4. Tamara Wijsman
    2017-03-22T16:37:44+08:002017-03-22T16:37:44+08:00

    警告:请在应用此之前进行必要的研究、还原点和备份程序,并检查之后一切是否仍在工作。只能通过非 RAID 系统上的恢复环境以及 RAID 和非 RAID 系统上的安全模式来从中恢复。这已经在开发人员机器上进行了测试,而不是在服务器上。

    在 Powershell 中,您可以使用以下命令对所有非 lsass 服务执行此操作:

    Get-Service | ForEach-Object `
        { SC.EXE config $_.Name type= own }
    ForEach ($svc in @("efs", "keyiso", "netlogon", "policyagent", "samss", "vaultsvc", `
        "was", "w3svc")) `
        { SC.EXE config $svc type= share }
    

    此处排除的列表都需要在共享的 lsass.exe 中运行,但policyagent 除外,它是组策略代理在启动期间正常通信所必需的。

    最近还发现是(进程激活)和w3svc(IIS 万维网)需要共享它们的进程,因此将它们添加到排除项中。

    这已经在 Windows 10 (1607, build 14393.953) 上测试过,排除在 XP 中是不同的, ...。

    • 1
  5. Rev Danger
    2009-06-02T08:04:19+08:002009-06-02T08:04:19+08:00

    我不知道这是否仍然是您想要回答的问题,但是在对客户的 svchost 错误进行故障排除时,我了解到有一个命令行可以解决这个问题:“tasklist /svc”它提供了正在运行的进程的完整列表,使用进程 ID 和每个进程正在运行的服务。它没有给出处理器使用率,但您可以通过进程 ID 一次关闭一个进程,并至少了解哪组服务正在阻塞您的 CPU。

    • 0
  6. Rosberg Linhares
    2018-03-18T17:42:13+08:002018-03-18T17:42:13+08:00

    现在,您可以使用 PowerShell 将服务类型更改为“自己的进程”,并单独查看每个服务的内存。这个 Gist显示了完整的代码。中心思想是尝试将服务类型从侵入性最小的方式更改为侵入性最大的方式:

    $win32Service = Get-CimInstance -ClassName Win32_Service -Filter "Name = '$ServiceName'" -Verbose:$false
    
    if ($win32Service)
    {
        if (!(Set-ServiceTypeToOwnProcessByCim $win32Service))
        {
            if (!(Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service))
            {
                if (Grant-FullControlRightsOnServiceRegistryKeyToCurrentUser $win32Service)
                {
                    Set-ServiceTypeToOwnProcessByWindowsRegistry $win32Service | Out-Null
                }
            }
        }
    }
    else
    {
        Write-Warning "[$ServiceName] Service not found"
    }
    

    将Set-ServiceTypeToOwnProcess.ps1和Enable-Privilege.ps1文件放在同一个文件夹中时,您可以像这样执行脚本:

    .\Set-ServiceTypeToOwnProcess.ps1 -ServiceName 'Appinfo', 'gpsvc', 'Schedule', 'SENS', 'SessionEnv', 'wuauserv'
    
    • 0

相关问题

  • 您最喜欢的云计算提供商是什么?[关闭]

  • Vanilla Powershell 是否足以成为 Windows 和 DB 服务器管理员的语言?

  • 为什么添加新驱动器后我的磁盘驱动器访问速度如此之慢?

  • 在 Windows Server 2003 下使用 wscipt 从 .asp 文件运行 .exe

  • 最佳混合环境(OS X + Windows)备份?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve