2010/08/29

解決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狂吃記憶體問題》一文,這裡面有非常詳細的說明,這裡就不贅述了。
  1. The Command Line in Windows-《Managing Windows Programs from the Command Line- Tasklist
  2. Windows Sysinternals-《Process Explorer v11.13

沒有留言:

張貼留言