故障描述:
剛剛接到一個用戶反饋,說他每次開機以后發現 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資源,這個現象有可能導致系統掛起。
posted on 2006-08-13 11:00
matthew 閱讀(4078)
評論(0) 編輯 收藏 所屬分類:
雜錄