看起来我的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>
答案 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>