【问题标题】:Cannot Create the Desired Throughput on the IIS Server无法在 IIS 服务器上创建所需的吞吐量
【发布时间】:2018-07-20 13:11:12
【问题描述】:

简而言之,我正在尝试进行负载测试。但我无法在 IIS 服务器(Windows Server 2016 Datacenter)上创建所需的吞吐量,即使在 cpu、内存、磁盘或网络方面似乎没有瓶颈。

这是我的配置:

  • IIS 服务器: 16 个 vCPU,32GB 内存
  • SQL Server: 4 个 vCPU,8GB 内存
  • 测试服务器(发送请求): 8 个 vCPU,16GB 内存

为了消除 IIS 服务器上的并发限制,我做了以下更改:

<serverRuntime appConcurrentRequestLimit="1000000" />

<applicationPool 
        maxConcurrentRequestsPerCPU="1000000"
        maxConcurrentThreadsPerCPU="0" 
        requestQueueLimit="1000000" />

Default Application Pool Queue Length: 65000

<processModel minWorkerThreads="5000">

我创建了一个 WPF 应用程序,它使用 HttpClient 向 IIS 服务器创建所需数量的并发请求,并将其部署在测试服务器上。 (我也将服务点默认连接限制更改为 1000000。)我测试了 5000 个请求,所有请求都返回 200 OK。

通常,一个请求会在 20 毫秒内返回。以下是我在 WPF 应用程序中获得的测试结果:

  • 从发送第一个请求到得到最后一个响应的总时间:9380ms
  • 平均响应时间:3919ms
  • 最大。响应时间:7243ms
  • 最小。响应时间:77ms

当我查看测试服务器上的性能计数器时,我看到 5000 个请求在大约 3 秒内完成。这是我从 perfmon 获得的图表:

但是当我查看 IIS 服务器上的性能计数器时,我发现在 9 秒的过程中不断地接收和执行请求。因此,观察到的平均吞吐量约为每秒 400 个请求。我还尝试了 10000 个请求的测试,但平均吞吐量始终在 400 个请求/秒左右。

为什么 ASP.NET 没有在前 3 秒结束时完成接收所有请求?如何将吞吐量提高到任何所需的值,以便进行适当的负载测试?

【问题讨论】:

  • 1) 尝试将maxWorkerThreads 设置为10000;如果minWorkerThreads 大于maxWorkerThreads,则可以忽略。 2) 确保没有使用会话状态。
  • 谢谢。我试过了,但请求接收行为没有改变。我也在监视 .NET CLR\Locks And Threads。在发送请求之前,物理和逻辑线程的数量似乎在 30 左右,并在 2 秒内上升到 60 左右。
  • @StephenCleary 我没有使用会话状态。我正在使用使用“无身份验证”选项启动的 Web Api 解决方案。并且 web.config 不包含任何与“会话”相关的内容。我还有什么需要做的吗?

标签: asp.net performance iis performance-testing perfmon


【解决方案1】:

经过大量试验,我发现minWorkerThreads 的任何值超过 2000 似乎都被忽略了。我使用ThreadPool.GetMinThreads 方法检查了它。我还按照@StephenCleary 的建议添加了maxWorkerThreads 值2100。有了这些值,问题就消失了。但奇怪的是,我在任何 MS 文档中都没有看到对 minWorkerThreads 值的这种限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多