在 Windows Server 2003 上啟用“低碎片堆”LFH 的缺點?
我一直在調查在 IIS6 上執行的生產 Classic ASP 網站的問題,這似乎表明記憶體碎片。
Stackoverflow 提出瞭如何改善這一點的建議之一:如何找到為什麼一些經典的 asp 頁面隨機需要很長時間才能執行?. 它建議翻轉站點的global.asa文件中的設置以“打開”低碎片堆(LFH)。
下面的程式碼(帶有隨附 DLL 的註冊版本)起到了作用。
Set LFHObj=CreateObject("TURNONLFH.ObjTurnOnLFH") LFHObj.TurnOnLFH() application("TurnOnLFHResult")=CStr(LFHObj.TurnOnLFHResult)
(真的,程式碼對這個問題並不那麼重要)。
一個連結文章的作者報告了一個看似神奇的解決方案,並且,閱讀更多,我發現這個設置在 Windows Server 2008 上是預設啟用的。
所以,自然地,這讓我有點擔心:
- 為什麼在 2003 上預設不啟用此設置,或者
- 如果它在 2008 年有效,為什麼微軟沒有發布更新檔以在 2003 年預設啟用它?
我懷疑上面的答案對兩者都是一樣的(如果有的話)。
顯然,我們正在非生產環境中對其進行測試,並進行一系列指標和比較,以確定它是否對我們有幫助。但除此之外,我真的只是想了解是否有任何技術原因我們應該這樣做,或者是否有任何我們需要注意的問題。
在 Windows 中,當寫得不好的應用程序以低效的方式分配記憶體時,堆會變得碎片化,這樣它的堆就會處於碎片狀態。當應用程序的堆完全碎片化時,它不能再進行記憶體分配,因為堆中沒有單個連續的記憶體塊足夠大來滿足請求。都是小片段。即使所有這些小片段的大小總和足以滿足記憶體分配。
強調寫得不好的應用程序。
Sysinternal 的 VMMap 非常適合查看程序的地址空間並檢查它是否存在此類碎片問題。
請注意,ASLR 也是在 2008 年推出的,這確實在一定程度上加劇了這種碎片化問題。我想這對在該作業系統中預設啟用 LFH 的決定有一定影響。此外,LFH 政策往往需要更多的記憶體預先 AFAIK,這在 2003 年可能比在 2008 年更成為一個問題。
要獲得比 Microsoft 決定在 2008 年更改此政策的原因更明確的答案,您可能需要詢問 Microsoft 的那些工程師。