ASP.NET负载下的性能

时间:2014-05-14 13:46:19

标签: asp.net iis

我在弄清楚为什么我的ASP.NET应用程序无法维持大量并发用户时遇到了问题。我正在运行VS负载测试工具,我有很多有价值的数据,但很难筛选出来。我正在使用Step用户加载模式,逐渐增加虚拟用户的数量,直到达到大约500.测试似乎一直没有问题,直到应用程序中的一些未处理的异常导致它崩溃。直到崩溃,我监控的内存,CPU利用率和所有其他性能计数器都保持完全平稳。但是一旦崩溃发生,我会注意到以下几点:

  1. ASP.NET /请求当前的perf计数器峰值
  2. ASP.NET/Requests队列性能计数器上升了一点点,但保持不到10
  3. .NET CLR LocksAndThreads /当前队列长度峰值
  4. 此后,负载测试永远不会恢复。 (注意:我不是在寻求帮助,为什么应用程序崩溃,这是我正在单独处理并将修复的其他内容,但总会有新的应用程序崩溃,我不想要我的应用程序在负载下无法恢复)。如果我只是在负载测试过程中重新启动IIS,或者如果我在刚刚重新启动的IIS实例上启动负载测试而不让用户数量逐渐增加(我只需要用500个用户来支持它),我也可以重现这种行为一开始走)。

    所以我的问题是,为什么IIS在启动时无法正常处理大量用户?

    • .NET版本:4
    • IIS版本:7.5
    • 网站高级设置 - >最大带宽:2 ^ 32(~40亿)
    • 网站高级设置 - >最大并发连接数:2 ^ 32(~40亿)
    • 应用程序池高级设置 - >队列长度:1000
    • 应用程序池高级设置 - >最大工人流程:1

1 个答案:

答案 0 :(得分:1)

AFAIK,在IIS重新启动或应用程序池回收时,将发生以下情况:

  • 必须重新加载程序集
  • 页面将重新编译
  • 将关闭SQL连接

你可以:

  • 检查应用池高级设置的回收部分,看看回收是否可能触发内存限制,定期时间......
  • 在GAC中加载一些程序集
  • 检查web.config
  • 的编译元素中是否没有batch="false"属性
  • 提高SQL连接字符串中的最小和最大池大小(不要忘记会话连接字符串)
  • 检查启动时没有进行任何耗时的过程(如某些NHibernate动态映射)