全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c# Kestrel 和 IIS 在处理高并发请求时的模型区别

Kestrel 是纯异步 I/O 模型,依赖线程池与操作系统异步机制处理高并发;IIS 是进程/线程代理模型,作为反向代理引入额外转发、缓冲和多层超时。

Kestrel 是纯异步 I/O 模型,IIS 是进程/线程代理模型

Kestrel 本身不创建新线程处理每个请求,而是依赖 ThreadPool 中的少量线程配合操作系统级别的异步 I/O(如 Linux 的 epoll、Windows 的 IOCP)完成大量并发连接的调度。它默认以单个 WebHost 实例运行,所有请求共享同一个事件循环上下文。

IIS 不直接执行 .NET 应用代码,它作为反向代理和进程管理器:接收 HTTP 请求 → 转发给后端的 w3wp.exe 进程(或 dotnet.exe,取决于托管模型)→ 由 ASP.NET Core 的 WebHost 处理。这意味着请求路径多了一层转发,也引入了额外缓冲和超时配置(如 requestTimeoutmaxAllowedContentLength)。

  • IIS 的 applicationPool 设置(如“启动模式=始终运行”、“空闲超时=0”)直接影响首次请求延迟和长连接保持能力
  • Kestrel 在 Linux 上可直连负载均衡器(如 Nginx),绕过 IIS;在 Windows 上若启用 InProcess 托管,IIS 仅做进程宿主,不参与 HTTP 解析
  • 高并发下,IIS 默认的 maxConcurrentRequestsPerCPU(旧版)或 dynamicTypes 配置可能成为瓶颈,而 Kestrel 的吞吐更取决于 CPU 和内存带宽,而非线程数

Kestrel 的连接队列和请求超时由代码层控制,IIS 有独立的中间层超时

Kestrel 的行为由 KestrelServerOptions 直接控制,比如 LimitMaxConcurrentConnectionsKeepAliveTimeoutRequestHeadersTimeout 等,这些都在应用启动时通过 ConfigureKestrel 设置。它们作用于原始 TCP 连接和 HTTP 头解析阶段,不经过任何中间代理。

IIS 则在多个层级叠加超时:客户端到 IIS 的 connectionTimeoutsystem.webServer/serverRuntime)、IIS 到后端的 requestTimeoutaspNetCore 元素)、以及后端 Kestrel 自身的超时。三者不一致时,最短的那个会先触发中断,且错误日志分散在不同位置(eventvwrstdoutLogEnabledApplication Insights)。

  • 常见现象:502.3 Bad Gateway 往往是 IIS 等待后端响应超时,但 Kestrel 其实还在处理;此时需比对 aspNetCore/@requestTimeoutKestrel.RequestHeadersTimeout
  • Linux + Kestrel 场景下,SO_BACKLOG(即 ListenBacklog)设太小会导致 SYN 包被丢弃,表现为连接拒绝而非超时——这在 IIS 下不会出现,因为 IIS 自己管理 accept 队列
  • KestrelServerOptions.Limits.MaxRequestBodySize 默认为 30MB,而 IIS 的 maxAllowedContentLength 默认仅 30MB(但单位是字节),数值相同却易因单位混淆导致上传失败

并发压测时线程池饥饿表现完全不同

当应用中存在同步阻塞调用(如 Task.Wait()Thread.Sleep()、未 await 的 HttpClient 调用),Kestrel 的线程池线程会被快速耗尽,后续请求在 ThreadPool 队列中等待,表现为延迟陡增、ThreadPool.GetAvailableThreads 返回值趋近于 0。此时 CPU 使用率可能并不高,但吞吐崩溃。

IIS 在 OutOfProcess 模式下,w3wp 进程有自己的线程池,与 Kestrel 所在的 dotnet.exe 进程隔离;而在 InProcess 模式下,两者共用同一进程和线程池,问题表现类似 Kestrel 单独运行,但多了 IIS 的健康检查重试逻辑(如自动重启卡死的 w3wp)。

  • 诊断方法:dotnet-dump collect -p + dumpheap -stat 查看 WaitHandleManualResetEvent 实例是否异常增多
  • IIS 的 applicationPool/@queueLength 是关键指标:超过默认 1000 表示请求在 IIS 层已排队,说明后端处理不过来或网络转发延迟大
  • Kestrel 日志中出现大量 Connection id "..." request timed out,但没有对应的应用层异常,大概率是底层 I/O 超时而非业务卡顿
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 1000;
    serverOptions.Limits.MaxRequestBodySize = 100 * 1024 * 1024; // 100MB
    serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});

真正难调的不是参数本身,而是 IIS 和 Kestrel 之间那几毫秒的转发延迟、缓冲区大小差异、以及超时链路里任意一环的静默截断。线上遇到偶发 502 或连接重置,先确认哪一层先超时,再查对应日志——别只盯着 Program.cs 里的配置。


# linux  # windows  # nginx  # 操作系统  # app  # 字节  # iis  # 后端  # ai  # win  # 区别  # c#  # 自动重启  # gateway  # 循环  # 线程  # Thread  # 并发  # 事件  # 异步  # http  # 负载均衡 


相关文章: 如何在云主机上快速搭建多站点网站?  如何续费美橙建站之星域名及服务?  c# 服务器GC和工作站GC的区别和设置  Python文件管理规范_工程实践说明【指导】  如何在阿里云购买域名并搭建网站?  如何快速搭建安全的FTP站点?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何快速搭建个人网站并优化SEO?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站主机是什么?如何选择适合的建站主机?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何高效利用亚马逊云主机搭建企业网站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  如何在景安服务器上快速搭建个人网站?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  如何通过FTP空间快速搭建安全高效网站?  如何彻底卸载建站之星软件?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何选择建站程序?包含哪些必备功能与类型?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  微信小程序 input输入框控件详解及实例(多种示例)  如何配置FTP站点权限与安全设置?  建站主机是否属于云主机类型?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站之星24小时客服电话如何获取?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  制作公司内部网站有哪些,内网如何建网站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何快速搭建二级域名独立网站?  营销式网站制作方案,销售哪个网站招聘效果最好?  电商网站制作价格怎么算,网上拍卖流程以及规则?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  定制建站哪家更专业可靠?推荐榜单揭晓  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  如何做网站制作流程,*游戏网站怎么搭建?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  高防服务器租用指南:配置选择与快速部署攻略  手机网站制作与建设方案,手机网站如何建设?  5种Android数据存储方式汇总  利用JavaScript实现拖拽改变元素大小  制作网站怎么制作,*游戏网站怎么搭建?  重庆市网站制作公司,重庆招聘网站哪个好?  建站之星云端配置指南:模板选择与SEO优化一键生成  如何用搬瓦工VPS快速搭建个人网站?  如何选择网络建站服务器?高效建站必看指南  北京专业网站制作设计师招聘,北京白云观官方网站?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  开心动漫网站制作软件下载,十分开心动画为何停播? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。