2007年12月21日 星期五

GDI, USER, Handles - 搶救『系統資源』大作戰

其實, 這個『搶救系統資源大作戰』持續了好一陣子。

到現在, 我把 IE7 暫時換掉了, 希望這次真的能夠找到『元凶』....

不過, 倒也比較清楚『系統資源』的定義、限制、以及如何監測

.

在開始之前, 先回顧一下最近的重灌記錄 :

.

導論

先將『系統資源不足』和『記憶體不足』作一個區隔。

『記憶體不足』通常會導致的結果就是『慢』和『硬碟狂轉』, 因為『記憶體不足』時, 需要使用大量的硬碟空間做為虛擬記憶體, 這些硬碟讀寫動作自然拖住了系統的速度。但必須注意, 會導致『慢』和『硬碟狂轉』的主因也有可能是硬碟本身太慢, 或者是磁碟需要重整 (defrag)。

『系統資源不足』則是跳出一個對話框告訴你『系統資源不足』, 或是『圖示不見』, 『畫面顯示不正常』, 『無法開新視窗』。至於『系統資源不足』的原因, 通常不見得是記憶體不足, 而是 :

  1. 用來『管理系統資源』的『記錄表』不夠用了, (這是白話的說法, 其實應該是 Heaps, Handles 或是 Pointers),
  2. 或是『系統資源的管理』出了問題, 例如 : resource leakage -- 使用後的『系統資源』沒有正確回收

目前得知的是, 兩種 16 bit 的 GDI ObjectsUSER Object 可能被 Desktop Heap 或是 每個程序的最大值 (GDIProcessHandleQuota, USERProcessHandleQuota ) 所限制, 其他如 32 bit 資源, 以及 Handles to Kernel Objects 則在實用上幾乎只會受限於記憶體本身。另一個有可能的限制則是 Icon Cache

需要了解『系統資源』的更詳細說明, 可以看英文的 Desktop Heap Overview (ntdebugging), Object Categories (User Objects, GDI Objects, Kernel Objects, MSDN), 或是中文的『解決Windows系統資源嚴重不足的最新方法

請注意 : 在網路所看到的登錄設定項目,有些可能是長年以來的誤解, 必要時可到 MSDN 查詢, 或是到 ntdebugging 發問。

.

偵測系統資源

  • 工作管理員 (TaskMgr)

使用 Windows 內建『工作管理員』的 檢視 => 選擇欄位 就可以看到系統資源的使用狀況,

  • GDI Objects,
  • USER Objects,
  • Handles (控制碼, 就是 MSDN 指的 Kernel Objects)
  • Threads (執行緒)

.

可以自訂顯示的欄位, 包括 :

  • CPU 總使用率,
  • CPU 使用率最高的程序 (TopCPU)
  • 記憶體空間
  • 記憶體使用最多的程序 (TopMem)
  • 磁碟讀寫狀況
  • 讀寫最多的程序 (TopDisc)
  • GDI, USER, Handles, Threads, ...
  • IP 位址
  • 電池電量
  • NumLock, CapsLock

而且很多欄位按右鍵之後, 還能看到更詳細的資料

Tech Support Alert - 38 Best Free Resource Meter (系統資源監測) 找來的,

需要登錄 e-mail 才能下載新的版本 (目前是 0.97, 比不必登錄 e-mail 的 0.96a 版 好用許多)。除了 GDI, USER, Handles 之外, 我還發現它的 TopDisc 欄位真的能找出到底是那個程序在讓『硬碟狂轉』。

.

可以偵測個別程序的 記憶體使用, GDI Objects, USER Objects, 並在超過設定值時發出警告並保留記錄,

(可惜沒有 Handles, Threads ... 等, 而且也不能儲存設定 -- 每次都要重設監視項目)

.

Desktop Heap Overview (ntdebugging) 所介紹。安裝時可能需要下載 "symbol" ( C:\>dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols ), 有說明檔 dheapmon.chm 。

我的使用方式如下

C:\kktools\dheapmon8.1\x86\dheapmon.exe -l

C:\kktools\dheapmon8.1\x86\dheapmon.exe -v

.

  • 效能記錄及警示 (XP 內建)

.

修改系統登錄

試過幾個修改系統登錄的方式 (RegEdit), 有些好像稍有改善 (減低發生的頻率), 但都沒有完全解決『系統資源不足』, 『圖示不見』...等問題, 不過或許對你會有用

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (不好意思, 忘記出處)
    • Max Cached Icons -- 增加設定值, 請注意 十進位/十六進位
    • AlwaysUnloadDll -- 設為 1, 或者 手動加入機碼

此外, 還可以試試 Windows 2000(XP) 最佳化技巧19招

.

呼之欲出的答案

---- 暫時少用 IE7少用檔案總管

我觀察到的是, 在我的使用情境下, Heap 既使設為 3072 也很少佔用超過 50%, 但 IE7 的 GDI 3xxx (系統總 GDI 9xxx) 時就出了問題, (此時 GDIProcessHandleQuota 已從 10000 改為 15000/十進位, 而 Heap 也改為 8192)。由此看來, Heap 和 GDIProcessHandleQuota 似乎都不是我的問題所在, 而且同一台 NB 的第一年, 沒增加這些設定值其實也沒有這麼常發生『系統資源不足』的問題。倒是 IE7 的 GDI 3xxx 是我看過所有程序裡最誇張的值, 而且也曾經看過既使關閉所有 IE7 視窗之後好一陣子, iexplorer.exe 還高掛在 『工作管理員』。再加上網路上看到的其他佐證, 我想我只好暫時不用 IE7:

I open two or three instances of IE and visit websites like flicker and browse through images. The GDI count for the IE process goes to 9000 + and the whole OS slows down.

I notice that IE accumulates quite a lot of memory after I use it for some time and occasionally crashes ...

... the number of GDI objects is really getting high numbers when reading feeds using Internet Explorer 7, but browsing ordinary sites does not get that high numbers. ...

我採用的 IE7 的替代方案是 Avant Browser - http://www.avantbrowser.com/

簡單的說, Avant Browser 基於 IE6 / IE7 核心, 還有不少 IE7Pro 的功能,

  • Avant Browser + (IE6/IE7核心) =~ IE7 + IE7Pro
    • 可以依百分比縮放頁面, 但沒有調整視窗大小的功能
    • 滑鼠手勢
    • 超級拖曳
    • 自動回復不正常關閉的頁面
    • 更多 ...
  • 相容於很多 IE 上的插件, (比 GreenBrowser, Crazy Browser... 等, 好很多)
  • 持續更新中, Avant Browser 11.5 build 21, (2007-09-30)
  • GDI 的使用比 IE7 來得省, (目前只看過 GDI 1xxx, 雖然曾經看過 Handles 用到將近 7000, 但並沒有造成問題)

還有 檔案總管, 曾經看到 GDI 用到 16xx, 所以也開始使用替代方案 (電腦玩物), 目前用的是 MDIE

.

p.s. 這一篇, 寫得我自己也不是很滿意, 還請多多指正

Powered by Zoundry Raven

0 意見:

發表您的回應

張貼留言