12/10/2013

解決svchost吃記憶體、電腦跑得慢問題(**轉貼**)

最近我的Compaq電腦跑得慢了,按Ctrl+Alt+Del一看,發現RAM好多都被一個叫作「svchost.exe」的處理程序給吃了,弄得好多程式跑得簡直是龜速。
我在線上複製了四篇有關如何解決RAM被svchost.exe的網誌。


Passage A:解決svchost吃記憶體問題

偶爾,你會發現電腦突然變得很慢、所有的應用軟體甚至會慢到連動都動不了時,通常我們按 Ctrl + Alt +Del後,會發現是svchost.exe吃掉大多數的CPU資源。

通常你只能在系統非常緩慢的情況下,一個一個手動把應用程式關掉(如果還關得掉的話),否則你就得重開機了。重開機對一般人還好,但對常需要開啟多個應用程式、再存檔的使用者而言,往往會搥胸頓足、扼腕無法把重要資料如願儲存,而必須再花時間重作原先的工作。

這篇文章就是以svchost.exe為主題整理相關文章,除了教你認識svchost.exe,還告訴你如何修正svchost.exe這個問題,讓svchost.exe不再發作。

svchost.exe的功用


根據微軟中文知識庫編號314056-《Svchost.exe 的說明》一文中,可以得知Svchost.exe 是從動態連結程式庫 (DLL) 執行之服務的一般性主處理程序名稱。
...電腦啟動時,Svchost.exe 會檢查登錄中的服務部分,以建立一份它需要載入的服務清單。多個 Svchost.exe 執行個體可以同時執行,每一個 Svchost.exe 工作階段都可以包含一組服務,這樣個別的服務就可以依據 Svchost.exe 啟動的方式與位置來執行。

那些服務使用svchost.exe?


從微軟中文知識庫編號314056《Svchost.exe 的說明》一文中說明:
...登錄機碼中辨識出 Svchost.exe 群組:
HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Svchost
此機碼下的每一個值都代表一個單獨的 Svchost 群組,並且會在您檢視執行中的處理程序時顯示為獨立的執行個體。每一個值都是 REG_MULTI_SZ 值並且包含了在該 Svchost 群組下執行的服務。
每一個 Svchost 群組都可以包含一或多個服務名稱,而這些服務名稱是擷取自
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ Service_name
下面的登錄機碼,其 Parameters 機碼包含一個 ServiceDLL 值。

觀察svchost.exe的狀況


如果你想要瞭解目前到底svchost.exe的狀況有幾種方法,除了按Ctrl + Alt +Del 進入工作管理員後,切到「處理程序」頁,再點選「影像名稱」後,就會按照程序的名稱排序,看到所有svchost.exe的狀況。

另外一個方式,是進入命令列(Command Line)模式,參考以下>後的指令,就可以看到目前電腦中所有svchost.exe的動態。
C:\Documents and Settings\jose.sun>Tasklist /FI "ImageName eq svchost.exe"

Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
svchost.exe 1204 Console 0 2,168 K
svchost.exe 1276 Console 0 2,268 K
svchost.exe 1420 Console 0 38,964 K
svchost.exe 1576 Console 0 1,784 K
svchost.exe 1692 Console 0 1,700 K
svchost.exe 1988 Console 0 760 K

當然也有更複雜一點的方法,就是使用Svchost Viewer或Process Explorer for Windows的軟體,就可以知道比上述都詳細的資訊。Svchost Viewer的詳細操作,我推薦: 0與1的邂逅-《對一堆正在執行的 svchost.exe 好奇嗎?Svchost Viewer 可以給你答案》一文,那裡面有比較詳細的說明,這裡就不贅述了。

svchost.exe耗用記憶體的原因


根據iThome online-《工作管理員中有很多SVCHOST.EXE在執行,作用是什麼? 》一文的說法:...當發生佔用系統資源的情形時,可先利用Process Explorer這個工具,檢查哪一個DLL是讓SVCHOST.EXE佔用大量處理器資源的元兇。一般而言若不是電腦中毒,則很有可能會發現是 MSI.DLL或是NT.DLL造成的。
MSI.DLL或NT.DLL是屬於Windows Update服務的動態連結程式庫,會在每天固定時間,或系統重新開機後,上網搜尋Microsoft產品的更新元件,當電腦處理器或記憶體等硬體等級較差時,便很有可能佔用全部資源。
比較簡單的解決方法,是將Windows Update的自動執行排程,設定在半夜或凌晨等不會使用到電腦的時間,並且一直保持在開機狀態。不然就得要徹底停止Windows Update服務,但這方式會讓系統無法自動更新,修補漏洞時,非不得已,最好不要採取這項作法。

減少svchost.exe的記憶體用量


詳細的步驟,請參考:阿豪IT部落-《實作解決svchost.exe狂吃記憶體問題》一文,這裡面有非常詳細的說明,這裡就不贅述了。

Passage B:工作管理員中有很多SVCHOST.EXE在執行,作用是什麼?

當開啟Windows工作管理員時,常常會發現有很多個SVCHOST.EXE在執行,請問這個處理程序的用途是?若發現此程序占用了大量系統資源,又該如何處理?
根據微軟中文知識庫編號314056的文件說明:「SVCHOST.EXE是從動態連結程式庫(DLL) 執行之服務的一般性主處理程序名稱」。當電腦啟動時,SVCHOST.EXE會檢查登錄中的服務部分,以建立一份它需要載入的服務清單。多個SVCHOST.EXE可以同時執行,且每一個 SVCHOST.EXE工作階段都可以包含一組服務。 

由於這個程序是開啟Windows服務的重要檔案,因此之前也曾有疾風等多種病毒,會利用SVCHOST.EXE來達到入侵或破壞等目的。所以當發生占用系統資源的情形時,可先利用Process Explorer這個工具,檢查哪一個DLL是讓SVCHOST.EXE占用大量處理器資源的元兇。一般而言若不是電腦中毒,則很有可能會發現是MSI.DLL或是NT.DLL造成的。 

MSI.DLL或NT.DLL是屬於Windows Update服務的動態連結程式庫,會在每天固定時間,或系統重新開機後,上網搜尋Microsoft產品的更新元件,當電腦處理器或記憶體等硬體等級較差時,便很有可能占用全部資源。比較簡單的解決方法,是將Windows Update的自動執行排程,設定在半夜或凌晨等不會使用到電腦的時間,並且一直保持在開機狀態。不然就得要徹底停止Windows Update服務,但這方式會讓系統無法自動更新,修補漏洞時,非不得已,最好不要採取這項作法。停止該服務的方法如下: 

第一步:重新檢查系統的服務狀態 
首先在「開始」工具列按下「執行」,並輸入「services.msc」後按「確定」,再點選「服務(本機)」的「Automatic Updates」。選擇「登入」標籤,確定登入身分為「本機系統帳戶」,且取消勾選「允許服務與桌面互動」對話框。之後確認服務已在目前的「硬體設定檔」中被啟用,若設定檔中沒有顯示已啟用服務,則按下「啟用」按鈕。完成後進入「一般」標籤,檢查「啟動類型」是否為「自動」,並按下「啟動」按鈕。 

完成後回到「服務(本機)」頁面,並對「Background Intelligent Transfer Service (BITS) 」服務重複執行上述步驟。 

檢查Automatic Updates服務狀態。

第二步:重新註冊Windwos Update 的元件 
同樣也是先在「開始」工具列啟動「執行」,之後輸入「REGSVR32 WUAPI.DLL」,當看到「DllRegisterServer在WUAPI.DLL成功」的訊息後按下「確定」。 

之後以上述步驟重新註冊其他相關檔案,例如REGSVR32 WUAUENG.DLL、 WUAUENG1.DLL、ATL.DLL、WUCLTUI.DLL、WUPS.DLL、WUPS2.DLL,以及WUWEB.DLL 等元件。 

第三步:清除可能已損壞的 Windows Update 暫存目錄 
在「程式集」的「附屬應用程式」中,開啟「命令提示字元」,並在命令提示字元中輸入「net stop WuAuServ」。(此時若出現錯誤訊息請先重開機後再執行一次),完成後在「開始」工具列選擇「執行」,並輸入「%windir%」。在「Windows」目錄中,找到「SoftwareDistribution」資料夾,並將整個資料夾刪除(若擔心造成系統錯誤亦可先暫時改名),之後再次啟動「命令提示字元」,並輸入「net start WuAuServ」指令。完成上述步驟後重新開機,即可停止Windows Update服務。文⊙李世平 

Passage C:實作解決svchost狂吃CPU資源

我的家用筆電是七八年前買的Compaq,Intell P4-1G的CPU上跑的是Win2K的老舊系統,然而,使用起來的感覺,卻經常比目前公司使用的Intell P4-2.8G CPU + XP快且順暢得多。
由於公司電腦使用單純,幾乎可確定沒有中毒或被駭的可能,然而為求慎重起見,還是仔細檢查了一下。一開始發現是svchost.exe在作祟,正常開機操作使用情況下,開機後每隔一小段時間就跳出來狂吃CPU資源,風扇聲大作而執行中的應用軟體則龜速進展。每次svchost發作,吃個70%~80%是很稀鬆平常的事,有時過份起來甚至可以吃到97%以上,甚至滿百,幾乎是瀕臨當機無法做正事。
由於XP內建的工作管理員所提供的效能資訊極有限,所以到微軟官網下載了Process Explorer for Windows v10.21來檢查svchost.exe到底都在忙什麼。下載解壓並執行Process Explorer之後,視窗上可一目瞭然發現原來是Windwos Update讓它忙得不可開交,每隔一段時間就Automatic Updates來狂吃CPU資源。
這種現象當然不是XP正常運作時會出現的,所以需要動點手腳幫已經後天失調的相關設定重新調校一下,步驟分為三大項整理如下:
(一)確認兩項系統服務。
(1)Automatic Updates
  1. 依序選取左下的「開始」->「執行」,輸入「services.msc」並按「確定」。(這個步驟主要是叫出服務視窗)
  2. 找到「Automatic Updates」這項服務,連點二下滑鼠左鍵開啟內容設定。
  3. 點選「登入」這個頁籤,先確認目前登入身分為「本機系統帳戶(L)」,而且不勾選底下的「允許服務與桌面互動(W)」。接著再確認「Automatic Updates」這項服務已在目前的「硬體設定檔」中被啟用,若未啟用,則按下「啟用」鍵。
(2)Background Intelligent Transfer Service (BITS)
  1. 在相同服務視窗找到「Background Intelligent Transfer Service」這項服務,連點二下滑鼠左鍵開啟內容設定。
  2. 點選「登入」這個頁籤,先確認目前登入身分為「本機系統帳戶(L)」,而且不勾選底下的「允許服務與桌面互動(W)」。接著再確認「Background Intelligent Transfer Service」這項服務已在目前的「硬體設定檔」中被啟用,若未啟用,則按下「啟用」鍵。
(二)修復 Windwos Update 執行元件。
  1. 依序選取左下的「開始」->「執行」,輸入「REGSVR32 WUAPI.DLL」並按「確定」。接著視窗會跳出「DllRegisterServer 在 WUAPI.DLL 成功」的訊息,按「確定」完成動作並關閉視窗。接著,依照上述步驟逐一執行以下Windwos Update 元件:
  2. REGSVR32 WUAUENG.DLL
  3. REGSVR32 WUAUENG1.DLL
  4. REGSVR32 ATL.DLL
  5. REGSVR32 WUCLTUI.DLL
  6. REGSVR32 WUPS.DLL
  7. REGSVR32 WUPS2.DLL
  8. REGSVR32 WUWEB.DLL
(三)清除舊有 Windows Update 暫存目錄。
  1. 依序選取左下的「開始」->「執行」,輸入「cmd」並按「確定」以開啟命令提示視窗。
  2. 在命令提示視窗裡的命令提示字元右方輸入指令「net stop WuAuServ」暫停Automatic Updates服務。
  3. 依序選取左下的「開始」->「執行」,輸入「%windir%」並按「確定」以開啟系統資料夾。
  4. 在系統資料夾裡找到「SoftwareDistribution」這個目錄,並且把它更名為「SDbak」。
  5. 依序選取左下的「開始」->「執行」,輸入「cmd」並按「確定」以開啟命令提示視窗。
  6. 在命令提示視窗裡的命令提示字元右方輸入指令「net start WuAuServ」重新啟動Automatic Updates服務。
這樣整過一次骨之後,svchost.exe就沒再出來亂了,果然是欠修理。



Passage D:電腦∥解決svchost.exe / windows updates吃光資源的問題

吼~每次電腦莫名開始慢~或卡住~
就會開始擔心,是不是電腦中毒或怎樣~
查完也刪完廣告類似的後門程式之後~還是慢ˋˊ+
檢查工作管理員就發現svchost.exe這個東東吃了100%的記憶體~
而且還不只一個在跑,亂關也不成~會重開機Orz..
查了才知道,原來svchost.exe會因為windows updates 自動更新打開了,
所造成了影響~
下面的方法,試試看,應該可以將這情況改善不少喔~

svchost.exe 吃掉所有 CPU 資源的原因很多,不過很多時候的狀況都是在執行 Windwos Update 時發生的(或是自動更新服務 Automatic Updates 執行時)。因此解決方法主要就是把 Windows 的自動更新重設一次,步驟如下:
一、首先檢查系統服務的狀態。
1. 點「開始」–>「執行」,輸入「services.msc」後按「確定」。
2. 在服務「Automatic Updates」上點二下。
3. 點選「登入」頁籤,確定登入身分為「本機系統帳戶」且「允許服務與桌面互動」“沒有”被選取。
4. 確認服務已在目前的「硬體設定檔」中被啟用,如果沒有,按下「啟用」按鈕。
5. 點選「一般」頁籤,確定「啟動類型」為「自動」,然後按下「啟動」按鈕以啟動服務。
6. 對「Background Intelligent Transfer Service (BITS) 」服務重覆 2 ~ 5 的步驟。
二、接著重新註冊 Windwos Update 的元件。
1. 點選「開始」–>「執行」。
2. 輸入「REGSVR32 WUAPI.DLL」後按 Enter。
3. 當看到 “DllRegisterServer 在 WUAPI.DLL 成功” 的訊息後按下「確定」。
4. 重覆上述步驟重新註冊下列元件
REGSVR32 WUAUENG.DLL
REGSVR32 WUAUENG1.DLL
REGSVR32 ATL.DLL
REGSVR32 WUCLTUI.DLL
REGSVR32 WUPS.DLL
REGSVR32 WUPS2.DLL
REGSVR32 WUWEB.DLL
三、最後清除可能已損壞了的 Windows Update 暫存目錄。
1. 點「開始」–>「執行」,輸入「cmd」後按「確定」。 
2. 在命令提示字元中鍵入以下指令。(若出現錯誤訊息請先重開機後再報執行一次
net stop WuAuServ
2. 點「開始」–>「執行」,輸入「%windir%」後按「確定」。
3. 找到「SoftwareDistribution」並更名為「SDold」。
4. 點「開始」–>「執行」,輸入「cmd」後按「確定」,並在在命令提示字元中鍵入以下指令。
net start WuAuServ
四、大功告成!

沒有留言:

張貼留言