我有一个托管在 Windows Azure 共享网站上的站点。它刚刚因超过 512MB/小时的内存使用限制而被暂停。
我确实大量使用 .net 缓存(以防止多次调用数据库/外部 API 等...)。
在 Windows Azure 上的共享网站中缓存是否是禁忌?
我有一个托管在 Windows Azure 共享网站上的站点。它刚刚因超过 512MB/小时的内存使用限制而被暂停。
我确实大量使用 .net 缓存(以防止多次调用数据库/外部 API 等...)。
在 Windows Azure 上的共享网站中缓存是否是禁忌?
你使用 System.Runtime.Cache 吗?您应该能够限制缓存的数量,例如 memorycache 对象使用。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/dd941874.aspx。
即使您将停止使用缓存,框架/库仍然可以使用它。我也有同样的问题(有趣的是,在免费模式下内存限制为 1024MB,但共享内存限制为 512)。
如我所见,Azure 在门户上显示的内存量似乎非常接近 System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize 值。
此时我正在尝试使用缓存设置来设置最大内存:
<system.web>
<caching>
<cache privateBytesLimit="250000000" privateBytesPollTime="00:00:15"/>
</caching>
</system.web>
几天前我设置了 300MB,但几分钟前又被暂停了 :(,所以降低到 250MB。
但无论如何,这是非常不清楚,奇怪和“错误”的解决方案恕我直言。
更新
今天早上又停了。暂时转换为小型实例(1.7 GB RAM)的标准模式。
我的 WorkingSet 计数器现在约为 200 兆(PeakWorkingSet 为 330 兆)。但!GC 的 CollectionCount 增加了大约 8 倍(Gen0 是 1800 次,而不是一天的 250 次)。
我目前的理论是,在“共享”模式下,网站运行在具有大量内存的“大”虚拟机中,而垃圾收集器不需要经常运行,从而导致更长的“垃圾寿命”和更多的内存消耗。
目前无法访问我的开发人员计算机进行一些验证,但计划尽快将站点转换为云服务中的 Web 角色 - 使用额外的小实例(成本与共享网站成本相当)......
可能值得在本地计算机上使用 perfmon 检查配置文件,看看它是否首先正常达到限制,然后查看可能在 Azure 上配置日志记录并再次挖掘它。
还要确保所有内容都已预编译,并且您不需要的不加载和模块等会真正影响 Azure 上的性能等。
我认为您可能想在这里尝试的是扩大我们的规模而不是扩大规模。如果您添加第二个实例,这将使您的资源限制加倍。