ASP.NET不使用所有工作线程

时间:2014-01-26 13:16:26

标签: asp.net threadpool

看起来我的ASP.NET设置不使用超过10个工作线程。我按照本文的建议无济于事:http://support.microsoft.com/kb/821268。我知道异步控制器,但在我们的例子中使用它们是不现实的。

我有以下ASP.NET MVC操作方法来测试线程争用:

public ActionResult Index()
{
    int workers;
    int io;

    ThreadPool.GetAvailableThreads(out workers, out io);

    Thread.Sleep(1000);

    return Content(workers.ToString());
}

默认返回399(线程池中399个未使用的线程 - 4个处理器* 100)。当我用jmeter加载这个方法时,我看到这个数字永远不会低于390.我还看到如果我有超过10个虚拟会话,响应时间开始线性增加,那就是你可以清楚地观察到线程争用。如何强制ASP.NET(或.NET)使用更多线程池线程?

编辑: 在我用Thread.Sleep更改await WebClient.DownloadStringTaskAsync(请求远程计算机http资源)后,情况变得更加有趣。现在,可用线程池线程的数量大多数仍为399(尽管它在一个点上达到386)。这是预期的,因为.NET没有计算。我还用秒表包装动作方法,看看在方法中花费的时间保持不变。 看起来它不是.NET ThreadPool问题,但是一些IIS或ASP.NET连接限制问题,虽然我在Web.config中看到以下内容:

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="100" />
    </connectionManagement>
  </system.net>

2 个答案:

答案 0 :(得分:2)

看起来我找到了答案。 Windows客户端操作系统有一个限制(我的操作系统最多10个请求),这基本上与我观察到的相符:http://www.jpelectron.com/sample/WWW%20and%20HTML/IIS-%20OS%20Version%20Limits.htm

答案 1 :(得分:0)

尝试将此添加到您的配置中(与您链接的设置不同)

<configuration>
    . . .
    <system.web>
        <applicationPool maxConcurrentRequestsPerCPU="24"
                     maxConcurrentThreadsPerCPU="100"
                     requestQueueLimit="5000" />
    </system.web>
</configuration>