故障描述:
剛剛接到一個(gè)用戶(hù)反饋,說(shuō)他每次開(kāi)機(jī)以后發(fā)現(xiàn) spoolsv.exe 進(jìn)程消耗了大量的CPU資源(70%),嚴(yán)重影響了系統(tǒng)的運(yùn)行,懷疑是計(jì)算機(jī)病毒,向我求救。
故障檢查:
根據(jù)他的描述,我首先檢查了 Print Spooler 服務(wù)的加載方式等內(nèi)容。
- 打開(kāi)注冊(cè)表編輯器
- 定位到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Spooler
- 檢查這個(gè)鍵以及子鍵的內(nèi)容是否正確。
經(jīng)查,故障系統(tǒng)的鍵完全正確,沒(méi)有問(wèn)題。但是為什么會(huì)有?spoolsv.exe 進(jìn)程消耗了大量的CPU資源的問(wèn)題呢?
有人可能會(huì)問(wèn),spoolsv.exe 進(jìn)程是不是計(jì)算機(jī)病毒的進(jìn)程,這一點(diǎn)很容易確認(rèn)的。正確的 spoolsv.exe 進(jìn)程的映像文件路徑肯定是%SystemRoot%\System32\spoolsv.exe ,因?yàn)楦鶕?jù)Windows System File Check 的原理,如果說(shuō)%SystemRoot%\System32\spoolsv.exe 被替換的話(huà),Windows系統(tǒng)文件保護(hù)裝置會(huì)從DllCache里面把正確的文件替換。所以在大多數(shù)情況下是可以相信 %SystemRoot%\System32\spoolsv.exe 文件是正確的。而故障系統(tǒng) spoolsv.exe 進(jìn)程的映像文件路徑的確是%SystemRoot%\System32\spoolsv.exe,因此 spoolsv.exe 進(jìn)程沒(méi)有問(wèn)題。
???*注:有些特殊的方法可以繞開(kāi)這個(gè)保護(hù),這里不進(jìn)行討論。
根據(jù)以往知識(shí),我們知道 Print Spooler 服務(wù)是用于維護(hù)一個(gè)打印列表的。所以我懷疑是由于某個(gè)打印列表造成了 Print Spooler 服務(wù)占用了大量的CPU資源。在進(jìn)行以下嘗試以后我大致知道的問(wèn)題的原因:
- 先啟動(dòng) Print Spooler 服務(wù),讓 spoolsv.exe 進(jìn)程消耗大量的CPU資源。
- 這個(gè)時(shí)候啟動(dòng) Process Explorer,然后選擇 spoolsv.exe 進(jìn)程,雙擊這個(gè)進(jìn)程,再選擇線(xiàn)程選項(xiàng)卡。在線(xiàn)程選項(xiàng)卡里面,我發(fā)現(xiàn) CreateThread API函數(shù)的調(diào)用占用了很高的 CPU 資源。問(wèn)題應(yīng)該就出在這里,由于某種特殊的原因,導(dǎo)致 CreateThread 在創(chuàng)建線(xiàn)程的時(shí)候出現(xiàn)了死循環(huán),從而導(dǎo)致spoolsv.exe 進(jìn)程消耗大量的CPU資源。
再,我們知道每當(dāng)創(chuàng)建一個(gè)打印任務(wù)以后,會(huì)在 %SystemRoot%\System32\spool\PRINTERS 目錄下創(chuàng)建2個(gè)文件,擴(kuò)展名分別為 SHD 和 SPL。如果估計(jì)沒(méi)錯(cuò),肯定是這里出現(xiàn)問(wèn)題了。遠(yuǎn)程控制,打開(kāi) %SystemRoot%\System32\spool\PRINTERS 目錄檢查,果然發(fā)現(xiàn)有2個(gè)文件,擴(kuò)展名分別為 SHD 和 SPL,如果刪除這2個(gè)文件會(huì)不會(huì)解決 spoolsv.exe 進(jìn)程消耗大量的CPU資源的問(wèn)題呢?
故障處理:
嘗試先把? Print Spooler 服務(wù)停止掉,然后再把 %SystemRoot%\System32\spool\PRINTERS 目錄下的 SHD 和 SPL 文件刪除,重新啟動(dòng)? Print Spooler 服務(wù),故障排除。
故障分析:
Print Spooler 服務(wù)啟動(dòng)的時(shí)候會(huì)檢查打印隊(duì)列,如果發(fā)現(xiàn)有未完成的隊(duì)列則會(huì)嘗試執(zhí)行,如果隊(duì)列文件被破壞,則可造成 Print Spooler 服務(wù)執(zhí)行的時(shí)候出現(xiàn)死循環(huán),導(dǎo)致 spoolsv.exe 進(jìn)程消耗大量的CPU資源.
SPL文件為當(dāng)前脫機(jī)文件,包含當(dāng)前打印任務(wù)。
SHD文件為當(dāng)前脫機(jī)打印的信息文件,包含誰(shuí)發(fā)起了打印任務(wù),打印任務(wù)中的隊(duì)列信息,以及該打印任務(wù)發(fā)送到哪里等等信息。
此外還伴隨一些TMP文件,如果SPL、SHD文件出現(xiàn)問(wèn)題,或者打印隊(duì)列送往無(wú)效打印機(jī),又或者送往的打印驅(qū)動(dòng)模塊無(wú)法正確響應(yīng),這可能導(dǎo)致spoolsv.exe進(jìn)行反復(fù)嘗試,進(jìn)而占用大量CPU資源,這個(gè)現(xiàn)象有可能導(dǎo)致系統(tǒng)掛起。