Windows Server 2003服务器svchost.exe进程意外停止crash问题分析

最近经常碰到一些基于svchost.exe的服务意外停止的案例。(例如:Computer Browser service、Server service、Windows Management Instrumentation service等停止提供服务)。

首先我们看一下什么是svchost.exe, 以及为什么这么多的服务都会受到svchost.exe的影响:

- Svchost.exe 是计算机上的一个进程,该进程包含Windows 用于执行各种功能的多个或单独服务。例如,Computer Browser service和Server service使用同一个 svchost.exe 进程宿主的服务。

- 可以有多个 svchost.exe 的实例在计算机上运行,其中每个实例都包含不同的服务。svchost.exe 的一个实例可能宿主程序的单个服务,而另一个实例则可能宿主与 Windows 相关的多个服务。可以在CMD窗口下运行tasklist -svc命令查看在 svchost.exe 的每个实例下正在运行的服务。见下图:

上图中如果PID为884的svchost.exe意外终止,那么所有对应于该PID的服务都将停止服务。可见造成的影响非常巨大。

什么是 svchost.exe?
https://windows.microsoft.com/zh-cn/windows-vista/What-is-svchost-exe#

那么svchost.exe意外终止后,如何解决呢?一般可以尝试下面的步骤:

1.       首先您可以手工启动受到影响的服务,或重启计算机以尽快从故障中恢复。

2.       其次可以检查计算机是否安装了以下补丁:

MS08-067 Security Bulletin - https://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx 

KB932762 https://support.microsoft.com/kb/932762/EN-US  

3.       如果您使用了System Center产品,该产品针对网卡的一些rules和monitors会触发Windows Server 2003系统netman的一个bug。该bug将导致与netman相关的svchost.exe异常终止。下面列出一些可能触发问题的rules和monitors:

Rules:

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedReads.Collection (Percent Bandwidth Used Read)

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedWrites.Collection (Percent Bandwidth Used Write)

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedTotal.Collection (Percent Bandwidth Used Total)

Monitors:

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedReads (Percent Bandwidth Used Read)

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedWrites (Percent Bandwidth Used Write)

-          Microsoft.Windows.Server.2003.NetworkAdapter.PercentBandwidthUsedTotal (Percent Bandwidth Used Total)

在这种环境下我们需要根据以下blog中的步骤禁用这些rules和monitors:

https://blogs.technet.com/b/kevinholman/archive/2011/12/12/opsmgr-network-utilization-scripts-in-baseos-mp-version-6-0-6958-0-may-cause-high-cpu-utilization.aspx

 

4.       如果以上方法都无法解决问题,那么svchost.exe可能由一些其他的原因导致。这种情况下我们可以做以下尝试:

     4.1 如果一个svchost.exe实例包含了多个服务,那么某个服务出现异常会导致这个svchos.exe终止。这个实例中的其他程序都受到影响。为了减小受影响的范围,我们可以把这些服务独立出来,每个svchost.exe实例仅包含一个服务。例如把netman服务独立出来的命令如下:

     Sc config netman type= own

    注:执行这个步骤后建议重启计算机使设置生效。

    4.2 联系微软技术支持中心,我们的工程师会协助您排查这个问题。为了提高排查效率,您可以先行收集dump(内存转储)文件。一般dump文件可以比较明确的发现原因。步骤如下:

-. 从以下链接下载 userdump tool 工具: (https://www.microsoft.com/downloads/details.aspx?FamilyID=e089ca41-6a87-40c8-bf69-28ac08570b7e&DisplayLang=en).

-. 运行该工具后,该工具会解压到默认文件夹 c:\kktools\userdump8.1. 根据您系统架构在x86 或 x64下运行setup.exe.

-. 之后在Control Panel 中打开Process Dumper 进行配置.

-. 点击 New 输入 svchost.exe 作为 Application Name. 点击 OK保存设置.

-. 高亮svchost.exe ,点击 Rules。

a. 选择 user custom rules.

b. 选择一个 文件夹用来存放生成的dump文件.

c. 在Exception Codes中高亮 Access Violation。

d. 将 minidump type 设置为 Complete.

 

-. 点击OK保存设置.