2010-10-04 99 views
0

我正在處理大型管理應用程序本質上的運行時。正在執行的實際邏輯以及顯示的屏幕和操作的數據存儲在中央數據庫中。爲了提高性能,運行時會將數據庫中的數據保存在各種緩存中。Windows終端用戶應用程序的緩存策略?

然而,這並不總是很清楚這些緩存應該如何管理。目前,只要運行時空閒,某些緩存就會刷新,而其他緩存永遠不會刷新,或者只有在達到可配置的任意限制時才刷新緩存。我們顯然希望儘可能在內存中保留儘可能多的數據,但我不確定如何以與Citrix良好搭配的方式來完成此操作,這對我們的客戶非常重要。

我一直在尋找使用資源通知(CreateMemoryResourceNotification())和刷新緩存,如果它表示內存運行低,但恐怕只有這樣做會使事情表現非常糟糕,當運行20 +實例下思傑,有一個實例吞噬了所有的內存,其餘的則不斷沖刷着他們的緩存。

我可以用CreateJobObject()和朋友設置對高速緩存大小的硬性限制,但如果實例有合理需要大量內存,那麼可能會導致運行時失敗並出現內存不足錯誤。

我可以防止此類問題通過使用單獨的堆緩存數據,但有沒有緩存和非緩存數據之間的明確分離,所以這似乎非常脆弱。

TL; DR:任何人在Windows下管理內存緩存都有什麼好主意?

+0

我們在這裏談論的數據量是多少?是否有數據對於運行時的所有實例都是共同的,還是都是唯一的? – Emiel 2010-10-04 15:06:28

+0

大多數數據實際上可以在實例之間緩存,並且如果從不更改也很少更改。然而,問題在於我不能假設實例可以相互通信,因爲它們所運行的環境通常是非常嚴格的。 – Tabsels 2010-10-04 15:35:14

回答

0

我一直在尋找到使用資源的通知(CreateMemoryResourceNotification()),並刷新緩存,如果它預示着內存不足,但在運行時,恐怕只使用,這將使事情非常惡劣在Citrix下有20多個實例,其中一個實例吞噬所有內存,其餘實例不斷刷新其緩存。 我可以用CreateJobObject()和好友設置對高速緩存大小的硬性限制,但是如果實例有合理需要大量內存,那麼可能會導致運行時失敗並出現內存不足錯誤。

你不能讓某種形式的混合解決方案,以便運行時試圖保持其高速緩存受限於固定的大小,但做大,如果有正當理由需要這樣做的可能性,那麼如果場合在那裏,嘗試將緩存縮小到合理的大小?

從佔用所有的內存,而其他被反覆刷新其緩存也許可以通過,當到達內存資源通知分發到所有的情況下避免防止一個實例。通過這種方式,當一個實例獲得通知時,他們都會仔細查看緩存。

而上,當然有時性能和內存使用量之間的權衡已經作出。在這裏,如果實例可以以某種方式進行通信,則它們可以根據實例的數量以及它們運行的​​計算機上可用的內存量來調整它們的最大高速緩存大小。這樣,如果有更多的實例啓動,它們都會稍微給予新人一些幫助,而不會造成服務器內存過載的風險。你打算

什麼策略,用於確定需要緩存什麼?當需要爲新房間製作房間時,你是否要保留最後使用的時間戳和沖洗舊物品?

+0

不幸的是,將低內存通知分發給所有實例可能不會成爲一種選擇。我們的軟件運行的Citrix環境通常非常有限。然而,我想我可以通過在接收到與該實例使用的內存量成比例的信號時刷新內存量來實現同樣的目的。這樣,最大的內存管理器可以清除大部分緩存。 – Tabsels 2010-10-04 15:32:23