使用 .NET Core 2.2 的 Kestrel 与 IIS+Kestrel 性能(吞吐量)

Ser*_*tin 5 iis jmeter amazon-ec2 kestrel asp.net-core

对于部署在单个 AWS EC2 主机上的 .NET Core 2.2 应用程序,我比较了 IIS 托管与普通 Kestrel 托管。

对于 IIS 配置,我遵循了 MS文档

对于 Kestrel,我只是使用了:

dotnet app.dll --server.urls http://*:5000
Run Code Online (Sandbox Code Playgroud)

我正在使用 JMeter 运行“压力”测试以比较吞吐量。这个测试只是用 100 个线程调用应用程序的端点,持续 10 秒(5 秒预热)。请注意,该端点基本上是在每次调用时从 MSSQL Server 数据库获取相同的数据,没有缓存等。

因此,Kestrel 会因套接字关闭/超时错误而失败 75% 的请求:

在此处输入图片说明

问题:什么样的配置错误会导致这种 Kestrel 行为?我尝试在 Kestrel 前面使用基本的 nginx 反向代理,但仍然得到相同的结果。

Ser*_*tin 1

事实证明,在测试同步端点的性能时会发生所描述的行为。

通过遵循线程注入算法,CLR 将只有 minWorkerThreads/minIoThreads 来处理请求,并且由于“压力”测试使用的线程数量多于我们等待新线程时创建的线程数量,这导致响应时间几乎呈线性增长。

切换到异步消除了性能差异,请参阅: 在此输入图像描述

参考: