我正在研究大型管理应用程序的基本运行时。正在执行的实际逻辑以及所显示的屏幕和操作的数据存储在中央数据库中。为了提高性能,运行时会在各种缓存中保存从数据库中查询的数据。
但是,并不总是清楚如何管理这些缓存。目前,只要运行时空闲,就会刷新一些高速缓存,而其他高速缓存从不刷新,或者只有在达到某些可配置但任意限制时才刷新。我们显然希望在内存中保留尽可能多的数据,但我不确定如何以与Citrix相关的方式执行此操作,这对我们的客户非常重要。
我一直在考虑使用资源通知(CreateMemoryResourceNotification()
)并刷新缓存,如果它发出内存不足的信号,但是我担心使用它会使得运行时的行为非常糟糕20 Citrix下的+实例,其中一个实例吞噬所有内存,其余实例不断刷新缓存。
我可以使用CreateJobObject()
和朋友设置高速缓存大小的硬限制,但如果实例需要大量内存,则可能导致运行时因内存不足错误而失败。
我可以通过为缓存数据使用单独的堆来防止此类问题,但缓存和非缓存数据之间没有明确的分离,因此看起来非常脆弱。
TL; DR :有人在Windows下管理内存缓存有什么好主意吗?
答案 0 :(得分:0)
我一直在考虑使用资源通知(CreateMemoryResourceNotification())并刷新缓存,如果它发出内存不足的信号,但我担心使用这样会导致在运行20多个实例时表现非常糟糕在Citrix下,有一个实例吞噬了所有内存,其余实例不断刷新缓存。 我可以使用CreateJobObject()和friends设置高速缓存大小的硬限制,但如果实例对大量内存有合法需求,则可能导致运行时因内存不足错误而失败。
你不能制作某种混合解决方案,以便运行时尝试将其缓存限制为固定大小,但如果有合法需要,可以增大,然后尝试如果场合存在,将缓存缩小到合理的大小?
通过在所有实例到达时将内存资源通知分发给所有实例,可以避免一个实例吞噬所有内存而其他实例反复刷新其缓存。通过这种方式,当一个实例收到通知时,他们都会仔细查看自己的缓存。
最后,当然有时需要在性能和内存使用之间进行权衡。同样,如果实例可以以某种方式进行通信,则它们可以根据实例的数量和它们运行的机器上可用的内存量来调整其最大高速缓存大小。这样,如果启动了更多实例,它们都会提供一点点容纳新手,而不会有服务器内存过载的风险。
您将使用什么策略来确定需要缓存的内容?你是否要保留最后一次使用的时间戳并在需要为新物品腾出空间时冲洗旧物品?