如何解决IIS 10托管的ASP.NET Core Web API超时并提升并发请求数
解决ASP.NET Core Web API在IIS 10下的超时与并发性能问题
一、IIS 10 配置优化
- 调整应用程序池参数
- 打开IIS管理器,找到对应应用池的「高级设置」:
- 将「队列长度」从默认1000调高到2000-3000(根据服务器CPU核心数调整,核心越多可适当加量)
- 「进程模型」里把「闲置超时(分钟)」设为0(防止应用池自动回收中断请求),「最大工作进程数」设为CPU核心数的1-2倍(比如8核服务器设8-16)
- 打开IIS管理器,找到对应应用池的「高级设置」:
- 放宽网站连接限制
- 进入网站「高级设置」,「连接限制」中的「最大连接数」设为0(无限制),「连接超时」调至600秒(根据业务需求调整,避免过短超时截断正常请求)
- 启用HTTP/2
- 在网站「绑定」中勾选「HTTP/2」,利用其多路复用特性减少TCP连接开销,提升并发处理效率
二、ASP.NET Core 应用内部配置
- 优化Kestrel服务器参数
- 在
Program.cs里配置Kestrel的并发与超时:builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxConcurrentConnections = 1000; options.Limits.MaxConcurrentUpgradedConnections = 1000; options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(5); });
- 在
- 调整全局请求设置
- 在
appsettings.json中添加或修改:"Kestrel": { "Limits": { "MaxConcurrentConnections": 1000, "RequestTimeout": "00:05:00" } }, "Hosting": { "MaxConcurrentRequests": 1000 }
- 在
- 清理冗余中间件
- 检查
Program.cs的中间件管道,移除开发环境的Swagger、不需要的静态文件中间件等,减少请求处理的额外开销
- 检查
三、代码层面性能优化
- 全异步IO操作
- 数据库查询、HTTP调用、文件读写等IO密集型操作必须用
async/await,别让线程阻塞,这样线程能处理更多并发请求 - 错误写法:
var data = dbContext.Users.ToList(); - 正确写法:
var data = await dbContext.Users.ToListAsync();
- 数据库查询、HTTP调用、文件读写等IO密集型操作必须用
- 优化数据库访问
- 给常用查询字段加索引;用批量操作替代循环单条操作;用Include/投影查询避免N+1问题
- 缓存高频数据
- 对访问频繁、更新少的数据,用
IMemoryCache或Redis缓存结果,避免重复执行耗时操作
- 对访问频繁、更新少的数据,用
- 杜绝同步阻塞
- 绝对不要在异步方法里用
.Result、.Wait()这类同步阻塞代码,会耗尽线程池,导致请求排队超时
- 绝对不要在异步方法里用
四、服务器资源与监控
- 排查硬件瓶颈
- 实时监控CPU、内存、磁盘IO、带宽使用率:
- CPU持续超80%就优化代码或升级CPU;内存不足就加内存,避免GC频繁拖慢性能;磁盘IO高就换SSD或优化数据库读写
- 实时监控CPU、内存、磁盘IO、带宽使用率:
- 开启日志追踪
- 启用IIS的失败请求跟踪,定位超时请求的具体路径和耗时环节;在ASP.NET Core里加健康检查或性能监控,跟踪接口响应时间和错误率
五、进阶优化方案
- 部署负载均衡
- 单台服务器扛不住的话,多部署几台API服务器,用IIS ARR做负载均衡,分散请求压力
- 调整TCP/IP参数
- 管理员权限打开命令提示符,执行以下命令提升TCP连接能力:
netsh int tcp set global autotuninglevel=normal netsh int tcp set global maxsynretries=2 netsh int ipv4 set dynamicport tcp start=1024 num=64511
- 管理员权限打开命令提示符,执行以下命令提升TCP连接能力:
内容的提问来源于stack exchange,提问作者wiki
相关产品推荐
相关产品推荐

