【发布时间】:2011-03-02 11:44:35
【问题描述】:
如果这是更多的服务器故障与堆栈溢出,请原谅。它似乎在边界上。
我们有一个应用程序,它使用 ASP.NET 缓存为电子商务应用程序缓存大量产品数据。这是一个包含 65K 元素的字典对象,我们的计算使对象的大小约为 10GB。
问题:
对象消耗的内存量似乎远远超过我们计算的 10GB。
最大的担忧:我们似乎无法使用服务器中 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% 的值。 请参阅任务人的屏幕截图。
【问题讨论】:
-
一个有根据的猜测:服务器正在重新调整它的内存以适应你给它增加的工作量,使用更多的交换文件来补偿,或者更快地垃圾收集内存。类似的东西。当您增加负载时,Taskman 中的“性能”选项卡看起来像什么?交换文件的大小会增加吗?
-
@Robert:Swap 几乎保持不变(这是有道理的,因为它是一个内存缓存)。值得检查。 @all:我想知道单个对象的绝对大小是否是问题所在。 GC 是否需要一定数量的“松弛空间”来移动对象,而这个 one 对象超出了这个范围?
-
您是否在字典中交换对象?如果是这样,那可能会给 GC 带来压力,因为每次交换都会释放一个必须在某个时候释放的对象。 GC 在执行收集之前可能不会等待您耗尽内存。一些内存分析可能是有序的。
-
失败的内存使用点总是相同吗?死亡时事件日志中有什么内容吗?另一个随机猜测是内存碎片。如果您在调试器死亡之前附加了调试器,那么它死亡时会抛出任何东西吗? (例如 OOM)
-
@Robert Harvey:我们只是在应用程序启动时填充一次缓存。