看起来我的 ASP.NET 设置没有使用超过 10 个工作线程。我已遵循本文的建议但无济于事:http://support.microsoft.com/kb/821268 。我了解异步 Controller ,但在我们的例子中使用它们是不现实的。
我有以下 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 个虚拟 session ,响应时间开始线性增加,也就是说,您可以清楚地观察到线程争用。如何强制 ASP.NET(或 .NET)使用更多线程池线程?
编辑:
当我将Thread.Sleep
更改为await WebClient.DownloadStringTaskAsync
(请求远程计算机http资源)后,情况变得更加有趣。现在,可用线程池线程的数量大多保持在 399 个(尽管一度达到 386 个)。这是预期的,因为 .NET 不需要进行计算。我还用 Stopwatch 包装了 action 方法,并发现该方法所花费的时间保持不变。
看起来这不是 .NET ThreadPool 问题,而是某些 IIS 或 ASP.NET 连接限制问题,尽管我在 Web.config 中看到以下内容:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
最佳答案
看来我已经找到答案了。 Windows 客户端操作系统存在限制(我的操作系统最多 10 个请求),这基本上与我观察到的相符: http://www.jpelectron.com/sample/WWW%20and%20HTML/IIS-%20OS%20Version%20Limits.htm
关于ASP.NET 不使用所有工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363855/