点击上方蓝字关注“汪宇杰博客”

导语

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

结论

测试结果排名(从快到慢):

  1. Windows + Kestrel (18808)

  2. Linux + Kestrel (10667)

  3. Windows + IIS In Process (10089)

  4. Linux + Nginx (3509)

  5. Linux + Caddy (3485)

  6. 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

无广告,不卖课,做纯粹的技术公众号

喜欢本篇内容请点个在看

ASP.NET Core 5 在IIS,Nginx,Caddy下的性能测试相关推荐

  1. Asp.Net Core 发布到IIS

    一.Asp.Net Core 发布到IIS 1.许多时候在WindowsServer服务器上已经安装了IIS,监听80端口,那么Asp.Net Core应用的自宿主就没法监听80端口 2.也就是在Wi ...

  2. 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)

    一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...

  3. ASP.NET CORE 之 在IIS上部署MVC项目

    与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...

  4. 解决 ASP.NET Core 部署到 IIS,更新项目时文件夹正在使用错误

    前言 虽然 ASP.NET Core 应用程序是跨平台的,但我们还是经常将它部署到 Windows 的 IIS 下. 当 ASP.NET Core 站点运行时,它会锁定正在使用的程序集,如果这时向站点 ...

  5. 解决ASP.NET Core部署到IIS,更新项目另一个程序正在使用此文件,进程无法访问...

    问题 部署到IIS上的ASP.NET Core项目,在更新的时候会进程占用的错误 解决思路 初步解决方案: 1,关闭应用程序池 2,关闭网站 3,更新项目 缺点:网站没法访问,部署项目停的时间过长 答 ...

  6. ASP.NET Core 缓存技术 及 Nginx 缓存配置

    前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...

  7. Asp.net Core 打包发布 (Linux+Nginx)

    如果你觉得如下这些文章对你有帮助,请点击链接支持作者原创 http://www.cnblogs.com/savorboard/ .Net Core SDK 命令介绍 前言 本篇主要介绍 asp.net ...

  8. asp.net core部署到iis

    asp.net core项目部署到IIS稍微不同于之前,记录几个要点: 一.下载安装.NET Core 托管捆绑包,下载地址 ,这个链接或许不是最新的了,官方文档里面有这个链接,到下图所示位置即可找到 ...

  9. RoadFlow ASP.NET Core工作流引擎IIS部署

    RoadFlow最新版本采用ASP.NET CORE2.1开发,部署步骤和.NET CORE部署一样,具体可参数ASP.NET CORE的部署方式. 1. 获取代码     首先从RoadFlow官网 ...

最新文章

  1. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!
  2. C++编程进阶9(如何将构造函数和非成员函数虚化、无锁单例模式)
  3. pythonexcel表格教程_python对excel表格的操作
  4. mkcramfs 命令学习
  5. 测试丢包_入行游戏测试之弱网测试工具
  6. mongodb4简明笔记
  7. 这款Java性能调优工具,真的很强!
  8. Linux Shell编程笔记7 awk的应用
  9. 修改Launcher2欢迎页面字符重叠
  10. android studio计步,基于安卓Android平台的健康计步系统APP的设计(AndroidStudio)
  11. cass坡度土方计算案例_南方cass几种土石方计算方法分析.doc
  12. java中null字符串与字符串长度为0的区别
  13. 动作捕捉软件系统有那么重要吗?
  14. 华为发布八核处理器Kirin 920
  15. (转)Spark中对Dataframe的union 、unionAll和 unionByName方法说明
  16. web前端开发免费教程
  17. 苹果x重启方法_iPhone无法开机怎么办?三种快速维修方法
  18. 魔百盒CM311-1a免拆机卡刷固件加+刷armbian装docker运行青龙面板
  19. 嵌入式项目管理学习——001重点明确和心态转换
  20. 商用密码应用与安全性评估之(二)商用密码管理法律法规

热门文章

  1. WPF DataGrid根据内容设置行颜色
  2. css中图片有缩放和转动效果
  3. 第8章 java中的并发工具类
  4. springboot三种过滤功能的使用与比较
  5. Leetcode 动态规划 Trapping Rain Water
  6. js - flex布局测试案例:完美居中
  7. mysql常见监控项
  8. JavaScript基础学习(七)—BOM
  9. 用C++实现简单随机二元四则运算
  10. ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt