为最大请求/秒优化 IIS 和 ASP.net
Posted
技术标签:
【中文标题】为最大请求/秒优化 IIS 和 ASP.net【英文标题】:Optimizing IIS and ASP.net for max Requests/Second 【发布时间】:2015-08-27 23:59:44 【问题描述】:我需要一个 Web 应用程序能够以每秒非常多的请求运行,同时保持相当短的响应时间(小于 ~70 毫秒)。
出于测试目的,我启动了 3 个 c4.xlarge ec2 实例并将它们放入弹性负载均衡器中。
我有一个看起来像这样的方法。
[HttpPost]
[Route("api/test/rps")]
public IHttpActionResult TestRequestsPerSecond(MediumSizedObject testObj)
return new StatusCodeResult(HttpStatusCode.NoContent, Request);
我希望其中一个实例能够每秒处理数千个请求(因为它基本上什么都不做)。令我惊讶的是,我在处理每秒 300 个请求时遇到了麻烦,而 CPU 却没有变高,并且请求开始排队。
以下是其中一个实例在每秒大约 240 个请求时的性能。
如您所见,我已经有 19 个排队请求,处理器占 78%。 (我的上下文切换也跳到了 8-9K 左右,这似乎很高)。
这发生在所有 3 台服务器上。
我在服务器上所做的更改
machine.config 相关行
<processModel autoConfig="true"
maxWorkerThreads="100"
maxIoThreads="100"
minWorkerThreads="50"
minIoThreads="50" />
<httpRuntime
minFreeThreads="176"
minLocalRequestFreeThreads="152"
/>
生产网络配置(可能)相关行
<system.web>
<sessionState mode="Off" />
<authentication mode="None" />
<compilation targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="PassportAuthentication" />
<remove name="Profile" />
<remove name="AnonymousIdentification" />
<remove name="WindowsAuthentication" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
我尝试使用默认的 machine.config,但结果稍差。
由于某种原因,每秒大约 130 个请求,我们只有 30% 的 CPU,几乎没有请求排队。
必须有一些我缺少的魔法设置。这是 IIS 课程的标准吗?这可能是 WebAPI 2 的罪魁祸首吗? (如果有人认为 Nancy 或 ServiceStack 会有所帮助,我将测试它们)。
我需要更大的实例吗?
任何要寻找的建议或东西,调整都会很棒。
(我让 WebApi Action 返回一个 Task 以查看它是否有任何不同,但它没有)
【问题讨论】:
我想除了返回任务之外,您还执行了async
的操作。你是否?结果没有变化吗?
@JotaBe 是的,我将它标记为异步(尽管我没有什么可等待的)。没有明显区别
这里有同样的问题。有什么解决办法吗?
@NormandBedard 我不需要 MVC 管道,我放弃了 MVC 并编写了一个简单的 HttpHandler。有了这个,我能够处理更多的 RPS。我不记得确切的数字..但它们非常高。我敢肯定,这些天的 asp.net 核心在提出问题期间可以比旧的 asp.net 做得更多
【参考方案1】:
您必须先将 processModel 元素中的 autoconfig 值设置为“false”,然后您在 processModel 元素中更改的其他属性才能生效。
【讨论】:
以上是关于为最大请求/秒优化 IIS 和 ASP.net的主要内容,如果未能解决你的问题,请参考以下文章
优化IIS7.5支持10万个同时请求的配置方法_win服务器