异步操作方法对IIS有什么影响?

时间:2016-10-18 06:20:13

标签: iis async-await asp.net-web-api2

我需要帮助了解异步操作方法如何提高IIS(以及最终的应用程序)的性能。

首先,我尝试使用以下代码和设置创建服务器不可用(503)

  • 应用队列长度:10
  • IIS - 每处理器限制的线程数:2
  • 处理器:4

enter image description here

使用SOAP UI发送了20个请求,当从浏览器尝试时,浏览器显示503,这是我的预期。

然后我在代码中进行了以下更改

enter image description here

使用SOAP UI再次发送了20个请求,当从浏览器尝试时,浏览器再次显示503,这是我没想到的。

async并不会释放线程接受新连接吗?

我的理解是否正确

  1. 服务器在任何给定时间可以接受的最大并发请求数是:(每个处理器限制的IIS线程数*处理器数+应用程序队列长度)18在我的情况下?
  2. 第19条请求在同步操作方法的情况下会得到503?

2 个答案:

答案 0 :(得分:3)

定义异步操作方法不会影响IIS可以为同一类型提供的请求数。当你说在Task.Delay调用期间释放线程本身时,你是正确的,但请求仍在队列中。

只有当您向异步TimeOnServer操作发送了一些请求时才会看到差异,并且可能会使用更多线程的其他类型的其他请求 - 例如,与PLINQ进行一些并行工作。在这种情况下,您的“其他”请求将以更高的费率提供。

这是一篇陈旧但非常有用的文章,它清楚地描述了这些好处:

Stephen Cleary的

Async Programming : Introduction to Async/Await on ASP.NET

答案 1 :(得分:2)

正如Miklós所指出的,异步请求会将其线程传递给ASP.NET线程池,但请求本身仍处于活动状态。因此,要查看异步操作的好处,您需要限制线程池,而限制队列。

另一个常见的错误 - 尤其是浏览器测试 - 是默认情况下,ASP.NET会话状态将序列化同一会话的请求。

我有一个要点here,它演示了异步调用如何产生线程。