ASP.NET Core 8 在 Windows 上各种部署模型的性能测试
ASP.NET Core 8 在 Windows 上各种部署模型的性能测试
我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多。这些部署方案对性能的影响一直以来都是靠经验。比如如果是部署在 IIS 下,那么 In Process 会比 Out Process 快;如果是 Self Host 那么使用 HttpSys 服务器会比 Kestrel 快。
那么真实结果是否如我们想象的那样呢?接下来就让我们来做一次 benchmarks 吧。
托管模型
在开始 benchmark 测试之前,我们再来来介绍一下这 4 种托管模型:
1. InProcess 模式
InProcess 模式将 ASP.NET Core 应用程序直接部署在 IIS 中,与 IIS 工作进程相同的进程中运行。理论上,这种模式的性能应该相对较高,因为请求无需经过额外的进程通信。
2. OutProcess 模式
OutProcess 模式下,ASP.NET Core 应用程序在独立于 IIS 工作进程的进程中运行。这种模式通过进程间通信与 IIS 进行通信,理论上可能引入一些性能开销。
3. SelfHost HttpSys 模式
HttpSys 模式是一种自承载方式,利用 Windows 操作系统内核级的 HTTP 服务器。通常认为在处理大量并发连接时具有优势,因为它与操作系统集成。
4. SelfHost Kestrel 模式
Kestrel 模式是 ASP.NET Core 的内置 Web 服务器,可以独立运行而无需依赖其他外部服务器。Kestrel 是轻量级、跨平台的选择,专为处理大量并发连接而设计。
压测平台
- 操作系统: Windows Server 2012 R2 Datacenter
- 硬件配置: Intel E3 1260L CPU, 16GB 内存
- 网络: 家庭内网,TP-LINK 家用 1000M 交换机
因为本人没啥高性能的服务器,家里只有一台老旧的 HP Gen8 服务器。安装 windows server 2012 R2 datacenter,CPU 为 E3 1260L。E3 同样是古董,大概是 intel 10年前的产品。内存为 16G 1333 服务器专用内存。
整个测试平台可以说是相当拉跨。凑合用用吧,反正不是彪极限性能,横向对比的话问题不大。

压测过程
新建一个 ASP.NET Core 默认项目。采用 VS2022 自带的模板,使用 miniapi 对 '/' 路径直接输出 'Hello World!' 字符串。
using System.Diagnostics;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var app = builder.Build();
// Configure the HTTP request pipeline.
app.MapGet("/", () =>
{
return "Hello World!";
});
app.Run();
如果使用 HttpSys 服务器则多加一行代码:
builder.WebHost.UseHttpSys();
- 测试工具: 使用 Netling 进行压力测试,模拟真实用户请求。
- 测试流程: 在对每个场景进行测试前先进行 60s 的预热,等待大概 10s 再后进行 4 次持续的压力测试(8个线程,持续30s),记录结果(RPS)。
Benchmark 测试结果
以下是测试结果:
| 托管模型 | Requests Per Second (RPS) |
|---|---|
| InProcess | 7266 |
| OutProcess | 7960 |
| SelfHost HttpSys | 26300 |
| SelfHost Kestrel | 27199 |

性能分析与总结
测试结果大大的出乎了我的预料,特别是 OutProcess 模式的性能略高于 InProcess 模式,与我的认知出现了比较大的偏差。同时,SelfHost Kestrel 模式的性能优于 SelfHost HttpSys 模式,这也与一般的预期不同,因为 HttpSys 是运行在内核态的服务器。
这样的差异可能受多种因素影响,包括硬件配置、操作系统版本、IIS的版本等,毕竟这些产品都是10年前的产物,而 ASP.NET Core8 是 2023 年的全新产品。测试结果受到多种因素的影响,大家不要较真,就图一乐吧。
不过从结果上横向来看,至少可以得出以下结论:
- Self Host 比 IIS Host 性能上要快上好几倍。在追求极限性能的场景,应该选择 Self Host。
- IIS Host 不管是 In Process 还是 Out Process 性能也不差。就测试平台这种老古董也能跑个 7000+ RPS。这还不是极限,因为 7000 RPS 的时候 CPU 才到 50%+ 。如果我再多加一些线程,相信轻松可以过万。
- 以上最差的结果也有 7000 多的 RPS。这表明对于一般的信息系统而言,ASP.NET Core 本身的性能一般不会是瓶颈。瓶颈最早出现一定是在其他 IO 模块,比如数据库。
ASP.NET Core 8 在 Windows 上各种部署模型的性能测试的更多相关文章
- 发布到ASP.NET CORE项目到 Windows server 2012
原文: https://github.com/zeusro/MarkdownBlog/blob/master/2018/2018-01-17-01.md 发布到ASP.NET CORE项目到 Wind ...
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- ASP.NET Core MVC 在linux上的创建及发布
前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...
- ASP.NET Core 中的文件上传
ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...
- ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新建项目(Windows) 对于任何语言和框架,都 ...
- 腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践
腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践.md 开通腾讯云服务器和Mysql 知识点: ASP.NET Core和 Entity Framework Core的使用 L ...
- Asp.net Core Jenkins Docker 实现一键化部署
写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...
- ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试. 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的 ...
随机推荐
- centos7.X安装mysql5.7 – 东凭渭水流
1.下载mysql5.7 可以使用windows下载好后上传至Linux.网络条件好的推荐使用 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/m ...
- [ABC150E] Change a Little Bit
2023-03-10 题目 题目传送门 翻译 翻译 难度&重要性(1~10):7 题目来源 AtCoder 题目算法 数学,贪心 解题思路 显然 \(C_i\) 越小的位越早被修改越好.所以我 ...
- 详情讲解canvas实现电子签名
签名的实现功能 我们要实现签名: 1.我们首先要鼠标按下,移动,抬起.经过这三个步骤. 我们可以实现一笔或者连笔. 按下的时候我们需要移动画笔,可以使用 moveTo 来移动画笔. e.pageX,e ...
- typora使用教程&高级用法&Markdown
typora使用教程&高级用法&Markdown typora介绍 哇啦哇啦哇啦哇,,,,,,,,,,,,, 提示:小白看不懂的话,建议哔哩哔哩搜索"遇见狂神说", ...
- 2023-10-04:用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edge
2023-10-04:用go语言,现有一棵无向.无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edge ...
- Linux系列教程——Linux文件编辑、Linux用户管理
@ 目录 1 Linux基本权限 1.权限基本概述 1.什么是权限? 2.为什么要有权限? 3.权限与用户之间的关系? 4.权限中的rwx分别代表什么含义? 2.权限设置示例 1.为什么要设定权限,我 ...
- 前端三件套系例之JQuery——JQuery基础、JQuery选择器、JQuery文本属性样式操作、JQuery操作DOM
文章目录 1 JQuery基础 1. 了解jQuery 1.1 什么是jQuery 1.2 什么事JS类库 1.3 常见JS类库 1.4 jQuery的优势 1.5 jQuery的版本 1.6 jQu ...
- 产品代码都给你看了,可别再说不会DDD(七):实体与值对象
这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...
- C#经典十大排序算法(完结)
C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法,它的实现原理比较简单.核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾. 详细文章描述 ...
- 一篇了解springboot3请求参数种类及接口测试
SpringBoot3数据请求: 原始数据请求: //原始方式 @RequestMapping("/simpleParam") public String simpleParam( ...