【问题标题】:What is the impact of async action method on IIS?异步操作方法对 IIS 有什么影响?
【发布时间】:2017-02-27 07:04:09
【问题描述】:

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

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

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

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

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

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

async 和 await 不会释放线程以接受新连接吗?

我的理解正确吗

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

【问题讨论】:

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


    【解决方案1】:

    定义异步操作方法不会影响 IIS 可以处理多少相同类型的请求。当您说线程本身在 Task.Delay 调用期间被释放时,您是正确的,但 request 仍在队列中。

    只有当您向异步 TimeOnServer 操作发送一些请求(例如这个),以及一些可能使用更多线程的不同类型的 其他请求 时,您才会看到差异 - 例如使用 PLINQ 执行一些并行工作。在这种情况下,您的“其他”请求将以更高的速度得到处理。

    这是一篇古老但非常有用的文章,清楚地描述了好处:

    Async Programming : Introduction to Async/Await on ASP.NET斯蒂芬·克利里

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-05
        • 2013-11-03
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2019-07-04
        • 2021-06-21
        • 2020-07-19
        • 1970-01-01
        相关资源
        最近更新 更多