我坚信投入硬件来解决软件问题并不是最好的政策。因此,当我们发现其中一个服务器(目前运行2个演出)时出现了几个内存问题时,我将其跟踪到使用System.Web.HttpRuntime.Cache。虽然对于几个站点来说,这是有意义的,抛出50个站点,所有站点都使用System.Web.HttpRuntime.Cache开始降低墙壁。
如果没有外部缓存服务器的选项,我考虑修改代码以使用静态类或单例来进行全局数据保留(另一种选择是进行额外的数据库请求)。
我还不完全清楚这是否会有任何变化,因为数据仍然在内存中#34;我们可能只需要在服务器上投入更多内存。
在单例或静态类上使用System.Web.HttpRuntime.Cache会有更多的开销,以及解决此问题的一些推荐方法是什么?
- 更新 -
在监控当前文件缓存内存使用情况时,我注意到这个数字激增,因为我点击了同一应用程序池中的某些网站。这个数字跃升至1,000,000(我假设的字节数)。我注意到,随着 Active Flushed Entries 的数量增加然后减少,这个数字最终开始减少。
如何更快地将其清除,因为当多个应用程序池中此数字很高时似乎会出现问题?
而不仅仅是剥离缓存(正如所建议的那样,可能不是最好的主意),只是为缓存对象设置更快的到期时间可能会产生更好的结果?
答案 0 :(得分:0)
更改代码与购买更多内存的成本是多少?
我认为只有2GB内存的Windows网络服务器是低估的。
您需要查看项目在缓存中保留多长时间,使用频率等等。如果您过早过期,您可能会进一步将瓶颈推向堆栈,例如:到文件系统或DB,它们都比RAM慢。
我首先添加更多内存,这是最便宜的选择,然后追踪性能问题,看看是否有优化。
答案 1 :(得分:0)
查看这些网站上的代码,我发现了以下内容:
HttpRuntime.Cache.Insert(
/* key */ "WebsiteConfiguration",
/* value */ website,
/* dependencies */ null,
/* absoluteExpiration */ Cache.NoAbsoluteExpiration,
/* slidingExpiration */ Cache.NoSlidingExpiration,
/* priority */ CacheItemPriority.NotRemovable,
/* onRemoveCallback */ null);
我认为主要问题可能出在NoSlidingExpiration
和NotRemovable
。
现在,如果我们设置30秒的缓存超时,这可能会解决此问题:
if (System.Web.HttpRuntime.Cache["WebsiteConfiguration"] == null)
.
.
.
HttpRuntime.Cache.Insert(
/* key */ "WebsiteConfiguration",
/* value */ website,
/* dependencies */ null,
/* absoluteExpiration */ Cache.NoAbsoluteExpiration,
/* slidingExpiration */ new TimeSpan(0,0,30), // zero timespan or not long enough will cause a null ref exception when used
/* priority */ CacheItemPriority.Normal,
/* onRemoveCallback */ null);
......我还没有证实这一点。