C# 如何在ASP.NET缓存应用程序中超过IIS7的60%内存限制
如果这比stackoverflow更严重,请原谅。它似乎在边界上 我们有一个应用程序,它使用ASP.NET缓存为电子商务应用程序缓存大量产品数据。这是一个包含65K元素的dictionary对象,我们的计算将该对象的大小设置为~10GB。C# 如何在ASP.NET缓存应用程序中超过IIS7的60%内存限制,c#,asp.net,iis-7,caching,C#,Asp.net,Iis 7,Caching,如果这比stackoverflow更严重,请原谅。它似乎在边界上 我们有一个应用程序,它使用ASP.NET缓存为电子商务应用程序缓存大量产品数据。这是一个包含65K元素的dictionary对象,我们的计算将该对象的大小设置为~10GB。 问题: 对象消耗的内存量似乎远远超过了我们的10GB计算 最大的担忧:我们似乎无法在服务器中使用超过60%的32GB容量 我们迄今为止所做的尝试: 在machine.config/system.web中(sf不允许标记,请原谅格式): 在web.config/
问题:
您是否考虑过使用不同的缓存策略?内置缓存的功能并不丰富,您将很难让它做更多的工作(除非一些IIS专家有一些聪明的工作) 我们在这方面花了很多时间,然后放弃了。实际上,我们使用更小的对象存储在缓存中,并根据需要获取更完整的对象 当我们需要考虑这一点时,我们调查了Memcached和Velocity,但还没有部署它们。不过,它们的功能更加丰富
另外,如何通过代码将项目存储在缓存中?您是在应用程序启动时还是在每个应用程序的第一个请求之后将它们放在那里?我询问的原因是您的缓存密钥是否有效,并且实际上您正在一次又一次地填充缓存,而没有检索任何内容(这可能只是一种对象类型的情况)。例如,我们通过将时间附加到特定于日期的缓存键来实现这一点。有点晚,但我遇到了几乎相同的问题。processModel上的
MemoryLit
设置的问题在于,尽管有文档记录,但它似乎没有任何效果
percentagePhysicalMemoryUsedLimit
类似地,它看起来应该做些什么,但没有效果
privateBytesLimit=“20000000”
确实有效。我去调试了这个过程,找到了CacheMemorySizePressure对象,它成功地获取了这个值并将其设置为_memoryLit。我会再检查一遍
另一个选项是在IIS应用程序池上设置专用内存使用率回收阈值。这也应该得到重视,并覆盖默认的60%限制
第三个选项是使用新类,并在其上设置
PhysicalMemoryLimit
。一个有根据的猜测:服务器正在重新调整其内存,以适应您增加的工作负载,使用更多的交换文件进行补偿,或者更快地进行垃圾收集内存。差不多吧。当您增加负载时,Taskman中的性能选项卡是什么样子的?交换文件的大小增加了吗?@Robert:swap几乎保持不变(这是有道理的,因为它是内存缓存)。不过值得一查@所有人:我想知道一个物体的绝对尺寸是否是问题所在。GC是否需要一定数量的“空闲空间”来移动对象,而这一个对象超过了这个范围?您是否在字典中交换对象?如果是的话,这可能会给GC带来压力,因为每次交换都会释放出一个必须在某个点上处理的对象。GC在执行收集之前可能不会等待内存耗尽。某些内存分析可能是正确的。它失败的内存使用点是否总是相同的?死亡前后的事件日志中有什么吗?另一个随机猜测是内存碎片。如果在调试程序死之前附加了调试程序,那么在它死后是否会抛出任何东西?(比如OOM)@robertharvey:我们只是在应用程序启动时填充一次缓存。我们肯定在探索其他缓存。我们只是在应用程序启动时填充一次缓存,它不会改变。除nCache外,我们一直在研究上述内容。谢谢+1、asp.net缓存在这里确实是错误的——您可能需要其他东西,而不是进程。
processModel autoConfig="true" memoryLimit="80"
privateBytesLimit = "20000000000" (and 0, the default of course)
percentagePhysicalMemoryUsedLimit = "90"