【发布时间】: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