优化IIS和ASP.net以获得最大请求数/秒

Kyl*_*bel 7 asp.net iis amazon-ec2 asp.net-web-api

我需要一个Web应用程序,能够以每秒非常多的请求进行操作,同时保持响应时间非常短(小于~70ms).

出于测试目的,我启动了3个c4.xlarge ec2实例并将它们放入弹性负载平衡器中.

我有一个看起来像这样的方法.

[HttpPost]
[Route("api/test/rps")]
public IHttpActionResult TestRequestsPerSecond(MediumSizedObject testObj)
{
    return new StatusCodeResult(HttpStatusCode.NoContent, Request);
}
Run Code Online (Sandbox Code Playgroud)

我希望其中一个实例能够每秒处理数千个请求(因为它基本上什么都不做).令我惊讶的是,我无法在没有CPU变高的情况下每秒处理300个请求,并且请求开始排队.

以下是每秒240个请求的实例之一的性能.

性能监视器

正如您所看到的,我已经有19个排队请求,处理器是78%.(另外我的上下文切换到8-9K左右,看起来很高).

这发生在所有3台服务器上.

我在服务器上改变了一些事情

machine.config相关行

 <processModel autoConfig="true"
                   maxWorkerThreads="100"
                   maxIoThreads="100"
                   minWorkerThreads="50"
                   minIoThreads="50" />
    <httpRuntime
        minFreeThreads="176"
        minLocalRequestFreeThreads="152"
        />
Run Code Online (Sandbox Code Playgroud)

生产web配置(可能)相关的行

<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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用默认的machine.config,但只是有点糟糕.

由于某种原因,每秒约130个请求,我们只有30%的CPU,几乎没有请求排队.

我必须要有一些神奇的设置.这与IIS的课程相提并论吗?这可能是WebAPI 2的责任吗?(如果有人认为那些会有所帮助的话,我会去测试Nancy或ServiceStack).

我需要更大的实例吗?

任何建议或要寻找的东西,调整都会很棒.

(我让WebApi Action返回一个Task来查看它是否有任何区别,但它没有)

小智 0

您必须将 processModel 元素中的 autoconfig 值设置为“false”,然后您在 processModel 元素中更改的其他属性才能生效。