2010-10-04 59 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