【问题标题】:How can I exceed the 60% Memory Limit of IIS7 in ASP.NET Caching application如何在 ASP.NET 缓存应用程序中超过 IIS7 的 60% 内存限制
【发布时间】:2011-03-02 11:44:35
【问题描述】:

如果这是更多的服务器故障与堆栈溢出,请原谅。它似乎在边界上。

我们有一个应用程序,它使用 ASP.NET 缓存为电子商务应用程序缓存大量产品数据。这是一个包含 65K 元素的字典对象,我们的计算使对象的大小约为 10GB。
问题:

  1. 对象消耗的内存量似乎远远超过我们计算的 10GB。

  2. 最大的担忧:我们似乎无法使用服务器中 32GB 的 60% 以上。

到目前为止我们所做的尝试:

在 machine.config/system.web 中(sf 不允许标签,请原谅格式):

processModel autoConfig="true" memoryLimit="80"

在 web.config/system.web/caching/cache 中(sf 不允许标签,请原谅格式):

 privateBytesLimit = "20000000000" (and 0, the default of course)
 percentagePhysicalMemoryUsedLimit = "90" 

环境: 视窗 2008R2 x64 32GB 内存 IIS7

似乎没有什么能让我们超过 60% 的值。 请参阅任务人的屏幕截图。

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

【问题讨论】:

  • 一个有根据的猜测:服务器正在重新调整它的内存以适应你给它增加的工作量,使用更多的交换文件来补偿,或者更快地垃圾收集内存。类似的东西。当您增加负载时,Taskman 中的“性能”选项卡看起来像什么?交换文件的大小会增加吗?
  • @Robert:Swap 几乎保持不变(这是有道理的,因为它是一个内存缓存)。值得检查。 @all:我想知道单个对象的绝对大小是否是问题所在。 GC 是否需要一定数量的“松弛空间”来移动对象,而这个 one 对象超出了这个范围?
  • 您是否在字典中交换对象?如果是这样,那可能会给 GC 带来压力,因为每次交换都会释放一个必须在某个时候释放的对象。 GC 在执行收集之前可能不会等待您耗尽内存。一些内存分析可能是有序的。
  • 失败的内存使用点总是相同吗?死亡时事件日志中有什么内容吗?另一个随机猜测是内存碎片。如果您在调试器死亡之前附加了调试器,那么它死亡时会抛出任何东西吗? (例如 OOM)
  • @Robert Harvey:我们只是在应用程序启动时填充一次缓存。

标签: c# asp.net iis-7 caching


【解决方案1】:

有点晚了,但我遇到了几乎同样的问题。 processModel 上的memoryLimit 设置的问题在于,尽管被记录在案,但它似乎没有任何效果。

percentagePhysicalMemoryUsedLimit 同样看起来应该做点什么但没有效果。

privateBytesLimit="20000000000" 确实工作。我去调试了这个过程,发现了 CacheMemorySizePressure 对象,它成功地获取了值并将其设置为 _memoryLimit。我会仔细检查。

另一个选项是在 IIS 应用程序池上设置专用内存使用回收阈值。这也应该被采纳并覆盖默认的 60% 限制。

第三种选择是使用新的MemoryCache 类并在其上设置PhysicalMemoryLimit

【讨论】:

    【解决方案2】:

    您是否考虑过使用不同的缓存策略?内置的缓存功能并不丰富,您将很难让它做更多的事情(除非某些 IIS 专家有一些聪明的工作)。

    我们花了很多时间来解决这个问题并放弃了。我们实际上使用更苗条的对象来存储在缓存中,并根据需要获取更完整的对象。

    当我们需要考虑这一点时,我们研究了 Memcached 和 Velocity,但尚未部署它们。不过它们的功能更丰富。

    另外,您如何通过代码将项目存储在缓存中?您是在应用程序开始时还是在每个请求的第一个请求之后将它们放在那里?我问的原因是你的缓存键是否有效,实际上你一遍又一遍地填充缓存而不检索任何东西(这可能只是一种对象类型的情况)。例如,我们通过将时间附加到特定于日期的缓存键来设法做到这一点。

    【讨论】:

    • 我们肯定在探索其他缓存。我们只是在应用程序启动时填充缓存一次,它不会改变。除了 nCache,我们一直在研究上述内容。谢谢!
    • +1,asp.net 缓存在这里真的错了——你可能想要别的东西并且不在进程中。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 2012-11-10
    • 2016-02-20
    • 1970-01-01
    • 2012-11-11
    • 2011-11-29
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多