2

我坚信用硬件来解决软件问题并不是最好的策略。因此,当注意到我们的一台服务器(当前运行 2 个演出)存在一些内存问题时,我将其归结为 System.Web.HttpRuntime.Cache 的使用。虽然对于几个站点来说,这是有道理的,抛出 50 个都使用 System.Web.HttpRuntime.Cache 的站点开始拆除墙壁。

如果没有外部缓存服务器的选项,我正在考虑修改代码以使用静态类或单例来保留全局数据(另一个选项是发出额外的数据库请求)。

我不完全清楚这是否会有任何变化,因为数据仍然“在内存中”,我们可能只需要在服务器上投入更多内存。

在单例或静态类上使用 System.Web.HttpRuntime.Cache 是否有更多的开销,有哪些推荐的方法来解决这个问题?

- 更新 -

在监视当前文件缓存内存使用情况时,我注意到当我在同一个应用程序池上访问一些站点时这个数字出现了峰值。这个数字跃升至 1,000,000(我假设的字节数)。我注意到随着 活动刷新条目的数量增加然后减少,这个数字最终开始减少。

我怎样才能更快地清除它,因为当多个应用程序池中的这个数字很高时,问题似乎就开始了?

而不是仅仅撕掉缓存(正如建议的那样,这可能不是最好的主意),简单地为缓存的对象设置一个更快的到期时间可能会产生更好的结果?

4

2 回答 2

0

更改代码与购买更多内存的成本是多少?

我会说只有 2GB 内存的 Windows 网络服务器规格不足。

您需要查看项目在缓存中的停留时间、使用频率等。如果您过早地使它们过期,您可能会将瓶颈推向堆栈的下方,例如文件系统或数据库,这两者都是比内存慢。

作为第一步,我会添加更多 RAM,这是最便宜的选择,然后跟踪性能问题以查看是否需要优化。

于 2012-03-23T10:30:04.490 回答
0

浏览这些网站上的代码,我发现以下内容:

                    HttpRuntime.Cache.Insert(
                        /* key */                "WebsiteConfiguration",
                        /* value */              website,
                        /* dependencies */       null,
                        /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
                        /* slidingExpiration */  Cache.NoSlidingExpiration,
                        /* priority */           CacheItemPriority.NotRemovable,
                        /* onRemoveCallback */   null); 

我认为一个主要问题可能与NoSlidingExpirationand有关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);     

...我还没有确认这一点。

于 2012-03-23T14:13:47.087 回答