2010-05-04 42 views
3

我們的應用程序是內存密集型的並且處理讀取大量磁盤文件。總負載可能超過3 GB。WinXP中的文件和系統緩存行爲的內存映射

存在使用內存映射文件來實現這樣一個龐大的數據讀取自定義的內存管理器。這些文件只有在需要時才映射到進程內存空間,並且這樣進程內存就可以得到很好的控制。但是觀察到的是,使用內存映射時,系統緩存不斷增加,直到它佔用可用的物理內存。這導致整個系統的放緩。

我的問題是如何防止系統緩存佔用物理內存?我試圖刪除文件緩衝(通過使用FILE_FLAG_NO_BUFFERING),但是由此,讀取操作需要相當長的時間,並且會降低應用程序的性能。如何在不犧牲性能的情況下實現可擴展性。在這種情況下使用的常用技術是什麼?

我沒有WinXP的操作系統緩存行爲有很好的理解。任何解釋相同的好鏈接也會有所幫助。

+0

您是否將整個文件一次映射到內存中?對於大文件,您應該映射較小的視圖。 – 2010-05-04 20:18:10

+0

是的,我正在映射整個文件,但文件通常是1MB。並且只有在需要時才映射它們,稍後再映射它們。取消映射不會導致系統緩存被釋放。它不斷積累。 – Canopus 2010-05-05 03:29:22

回答

3

我上的文件備份產品的工作,所以我們經常碰到類似的情況,在我們自己的文件訪問導致緩存管理器保持周圍的數據 - 這可能會導致內存使用秒殺。

默認情況下,Windows的緩存管理器將嘗試通過預讀,並在周圍的情況下保持文件數據的需要再次是有用的。

有幾個註冊表項,使您可以調整緩存行爲,我們的一些客戶已經與這個良好的效果。

XP是,它有一些服務器功能獨特,但默認情況下爲桌面程序的優化,不緩存。您可以在XP中啓用系統高速緩存模式,這會導致更多的內存用於緩存。這可能會提高性能,或者你可能已經這樣做了,並且它有負面影響!你可以閱讀關於here

我不能推薦自定義內存管理器,但我知道最重量級的應用程序有自己的緩存(Exchange,SQL)。你可以看到,通過運行process monitor.

如果你想完全阻止緩存管理器使用內存來緩存文件必須禁止讀取和寫入緩存:

FILE_FLAG_NO_BUFFERING和 FILE_FLAG_WRITE_THROUGH

還有其他提示你可以給CM(隨機訪問,臨時文件)讀取緩存行爲文檔here

即使禁用緩存,但仍然可以獲得良好的讀取性能, mulate通過擁有自己的後臺線程緩存管理器的行爲做着閱讀aheads

另外,我建議您升級到服務器級操作系統,甚至是Windows 2003將會給你更多的緩存管理器的優化選項。當然,如果您可以遷移到Windows 7/Server 2008,那麼由於動態分頁/非分頁池大小調整和工作集改進,您將獲得更高的性能改進和相同的物理資源。有在一個記事本是here

1

類型下來一個不錯的文章,並將其保存爲.vbs文件。每當你意識到系統RAM太低時運行它。系統緩存被清除並添加到RAM中。我發現它在網上,並在這裏給它,以便它可以幫助你。另外,建議關心第一個記錄不應超過實際RAM的一半。所以如果你有1 GB RAM,請從你的VBS文件中的以下文本開始。

FreeMem=Space(240000000) <This one is to clear 512 MB ram> 
FreeMem=Space(120000000) <This one is to clear 256 MB ram> 
FreeMem=Space(90000000) <This one is to clear 128 MB ram> 
FreeMem=Space(48000000) <This one is to clear 64 MB ram> 
FreeMem=Space(20000000) <This one is to clear 52 MB ram>