为最大请求/秒优化 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的主要内容,如果未能解决你的问题,请参考以下文章

IIS应用程序池最大进程数设置

优化IIS7.5支持10万个同时请求的配置方法_win服务器

优化IIS7.5支持10万个同时请求的配置方法

IIS 6“超出最大请求长度。”在 Global.asax 之前触发 [重复]

413 - 请求实体太大 IIS 和 SSL

IIS环境下解决Django大文件下载,只能持续90秒左右的问题