故障描述:
刚刚接到一个用户反馈,说他每次开机以后发现 spoolsv.exe 进程消耗了大量的CPU资源(70%),严重影响了系统的运行,怀疑是计算机病毒,向我求救。
故障检查:
根据他的描述,我首先检查了 Print Spooler 服务的加载方式等内容。
打开注册表编辑器
定位到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler
检查这个键以及子键的内容是否正确。
经查,故障系统的键完全正确,没有问题。但是为什么会有spoolsv.exe 进程消耗了大量的CPU资源的问题呢?
有人可能会问,spoolsv.exe 进程是不是计算机病毒的进程,这一点很容易确认的。正确的 spoolsv.exe 进程的映像文件路径肯定是%SystemRoot%\System32\spoolsv.exe ,因为根据Windows System File Check 的原理,如果说%SystemRoot%\System32\spoolsv.exe 被替换的话,Windows系统文件保护装置会从DllCache里面把正确的文件替换。所以在大多数情况下是可以相信 %SystemRoot%\System32\spoolsv.exe 文件是正确的。而故障系统 spoolsv.exe 进程的映像文件路径的确是%SystemRoot%\System32\spoolsv.exe,因此 spoolsv.exe 进程没有问题。
*注:有些特殊的方法可以绕开这个保护,这里不进行讨论。
根据以往知识,我们知道 Print Spooler 服务是用于维护一个打印列表的。所以我怀疑是由于某个打印列表造成了 Print Spooler 服务占用了大量的CPU资源。在进行以下尝试以后我大致知道的问题的原因:
先启动 Print Spooler 服务,让 spoolsv.exe 进程消耗大量的CPU资源。
这个时候启动 Process Explorer,然后选择 spoolsv.exe 进程,双击这个进程,再选择线程选项卡。在线程选项卡里面,我发现 CreateThread API函数的调用占用了很高的 CPU 资源。问题应该就出在这里,由于某种特殊的原因,导致 CreateThread 在创建线程的时候出现了死循环,从而导致spoolsv.exe 进程消耗大量的CPU资源。
再,我们知道每当创建一个打印任务以后,会在 %SystemRoot%\System32\spool\PRINTERS 目录下创建2个文件,扩展名分别为 SHD 和 SPL。如果估计没错,肯定是这里出现问题了。远程控制,打开 %SystemRoot%\System32\spool\PRINTERS 目录检查,果然发现有2个文件,扩展名分别为 SHD 和 SPL,如果删除这2个文件会不会解决 spoolsv.exe 进程消耗大量的CPU资源的问题呢?
故障处理:
尝试先把 Print Spooler 服务停止掉,然后再把 %SystemRoot%\System32\spool\PRINTERS 目录下的 SHD 和 SPL 文件删除,重新启动 Print Spooler 服务,故障排除。
故障分析:
Print Spooler 服务启动的时候会检查打印队列,如果发现有未完成的队列则会尝试执行,如果队列文件被破坏,则可造成 Print Spooler 服务执行的时候出现死循环,导致 spoolsv.exe 进程消耗大量的CPU资源.
SPL文件为当前脱机文件,包含当前打印任务。
SHD文件为当前脱机打印的信息文件,包含谁发起了打印任务,打印任务中的队列信息,以及该打印任务发送到哪里等等信息。
此外还伴随一些TMP文件,如果SPL、SHD文件出现问题,或者打印队列送往无效打印机,又或者送往的打印驱动模块无法正确响应,这可能导致spoolsv.exe进行反复尝试,进而占用大量CPU资源,这个现象有可能导致系统挂起。