点击上方蓝字关注“汪宇杰博客”
导语
ASP.NET Core 从 2.2 版本起,在 IIS 下可以使用 InProcess 模式提高性能,国外大神 Rick Strahl 对此有一片详细的文章。3年过去了,现在 ASP.NET Core 已经到了 5.0 版本,不同服务器之间的性能有什么变化呢?我们来一起看一下吧。
曾经的结论
Rick Strahl 在 原文* 中测试了 Windows 下 ASP.NET Core 2.2 在 Kestrel、IIS InProcess、IIS Out of Process 中的性能,metric 为 request per second。结论是 IIS InProcess > Kestrel > IIS Out of Process。测试方法、工具和结论可以查看 Rick 的文章:
* https://weblog.west-wind.com/posts/2019/Mar/16/ASPNET-Core-Hosting-on-IIS-with-ASPNET-Core-22
今天的实验
Rick 没有测试相同配置的 Linux 服务器跑 ASP.NET Core 与 Windows 服务器的区别。很多朋友想知道,在 2021年跑 ASP.NET Core 5.0 到底用 Windows 还是 Linux 性能好,因此我决定用类似的方法在相同配置的服务器上重新跑一下 ASP.NET Core 5.0 在 Windows 及 Linux 上的 Request per Second 数据,方便大家参考。
测试环境
由于 Windows 10、Ubuntu Desktop 等桌面版系统并不能真实代表服务器环境,因此我均选择服务器版系统进行测试。所有系统均为全新安装,并打了最新 patch,并且均多喝了热水,并重启试试了一次。
Windows 服务器
供应商:Microsoft Azure 国际版 East Asia 数据中心
系统:Windows Server 2019
配置:2 vCPU, 4GB RAM, Premium SSD
安装环境:IIS (启用静态、动态压缩,不含 ASP.NET 3.5, 4.X),ASP.NET Core Runtime 5.0.2
Linux 服务器
供应商:Microsoft Azure 国际版 East Asia 数据中心
系统:Ubuntu Server 20.04 LTS
配置:2 vCPU, 4GB RAM, Premium SSD
安装环境:启用BBR,安装 Nginx,Caddy,ASP.NET Core Runtime 5.0.2
测试工具
Rick 使用的是他自主研发的 West Wind Web Surge,但是这个工具只有 Windows 平台,没法满足我们的需求,因此我使用了一个开源、跨平台的测试工具 bombardier,该工具也曾经在微软官方 .NET 博客上有所用到。
版本:v1.2.5
下载地址:https://github.com/codesenberg/bombardier
测试工程
一个新建的 ASP.NET Core 5.0 Web API 项目,唯一的方法是:
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
[HttpGet]
public string Get()
{
return $"Test {DateTime.UtcNow}";
}
}
为了简单,本次我不测试 Json 序列化等操作,有兴趣的朋友可以自行实验。
该工程使用 Release 编译,FDD发布,日志配置留默认,即:
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
测试方法
分别使用 Kestrel、IIS In Process、IIS Out of Process、Nginx 反代、Caddy 反代运行测试工程,随后使用 bombardier 访问服务器本机的测试地址,启用2个连接,10秒钟DPS,预热一轮后连续跑3轮,取 Request per Second 平均值。
注意,在理想环境下,最好不要使用性能测试工具测试localhost地址,因为操作系统本身分配调度测试工具和Web服务器之间网络资源会有一定的影响。但是由于云端的网络大家都懂的,所以为了尽可能排除网络影响,我不得不访问localhost测试。
测试结果
Windows + Kestrel
RPS 平均值:18808
Windows + IIS In Process
RPS 平均值:10089
Windows + IIS Out of Process
RPS 平均值:2820
Linux + Kestrel
RPS 平均值:10667
Linux + Nginx
RPS 平均值:3509
Linux + Caddy
RPS 平均值:3485
结论
测试结果排名(从快到慢):
Windows + Kestrel (18808)
Linux + Kestrel (10667)
Windows + IIS In Process (10089)
Linux + Nginx (3509)
Linux + Caddy (3485)
Windows + IIS Out of Process (2820)
结果和 Rick 当年对 ASP.NET Core 2.2 的测试有所不同。Rick 的测试中,IIS In Process 的性能竟然能超越 Kestrel,他曾经表示意外。今天 IIS In Process 还是被 Kestrel 吊打了,这好像还挺合理的。
但是我没想到的是,同样用 Kestrel,Windows 服务器的性能竟然能吊打 Linux,我表示意外,毕竟说好的 Windows 性能差,说句政治正确的话,这一定不是 Linux 的问题,很可能是 ASP.NET Core Runtime 对于 Linux 的优化没有 Windows 版的好。
在反代模式下,Nginx 和 Caddy 的性能基本相同,并且都能吊打 IIS Out of Process,这非常政治正确,毕竟说好的 IIS 性能差。
当然了,光一个输出字符串的测试,并不能代表 ASP.NET Core 5.0 及各服务器性能表现的全部,在实际项目中,影响性能的因素非常多。本次实验的设计并不覆盖所有场景,肯定有所纰漏,欢迎大家留言指出。
汪宇杰博客
Azure | .NET | 微软 MVP
无广告,不卖课,做纯粹的技术公众号
喜欢本篇内容请点个在看