1

我有一个 ASP.NET MVC 4 站点在 64 位 Windows Server 2008 R2 标准上运行在 Xeon E7540 @ 2 GHz 2 核、8 GB Ram 上。

应用程序池使用具有集成托管管道模式的 .NET 4.0。

我用 OutputCaching 修饰了我的 Index 函数:

[OutputCache(CacheProfile = "ContentPageController.Index")]

以及 Web.config 中的以下内容

<add name="ContentPageController.Index" duration="60" varyByParam="none" location="Server" />

索引操作访问 MS SQL 数据库,我在数据库服务器上运行 SQL Profiler,我可以看到,如果我在 60 秒内从浏览器刷新同一页面,则数据库仅被命中一次,这表明 OutputCache 是跑步。

但是,当我对站点进行负载测试时,该站点在 60 秒内生成了 1-50 个用户(附图),OutputCache 在测试开始后几乎立即无法工作,我可以在 SQL Profiler 中看到查询命中数据库,而我本来可以只期望第一个请求访问数据库。

测试大约 15 秒后,Webserver CPU 开始在 85% 和 100% 之间波动,而工作进程的私有内存没有增加,保持在测试前从 147MB 开始的 149MB 标记以下。

我完全一无所知,知道我应该寻找什么吗?

非常感谢!

blitz.io 输出显示服务器在处理超过 18 个并发用户时开始超时

4

1 回答 1

0

如果您看到多个数据库命中并希望防止这种情况(例如只运行一次并缓存),您将必须同步此方法的访问(锁定线程)。

这确保只有第一个请求命中数据库,所有后续请求都可以使用缓存。

伪代码:

if(!cache)
    lock start
       if(cache)return cache; // this will be hit when the 2nd thread passed the first if...
       cache = access db...
    lock end
return cache;

如果这不能解决您的问题,您将不得不进一步调查......当响应时间下降时,站点返回的输出是什么?似乎返回错误?你也有几个超时......

命中数据库的代码是什么?

于 2013-09-23T17:20:13.623 回答