我需要一个Web应用程序,能够以每秒非常多的请求进行操作,同时保持响应时间非常短(小于~70ms)。
出于测试目的,我启动了3个c4.xlarge ec2实例并将它们放入弹性负载平衡器中。
我有一个看起来像这样的方法。
expectPOST
我希望其中一个实例能够每秒处理数千个请求(因为它基本上什么都不做)。令我惊讶的是,我在每秒处理300个请求时遇到问题,而CPU没有达到高位,并且请求开始排队。
此处查看其中一个实例的性能,每秒约240个请求。
正如您所看到的,我已经有19个排队请求,而处理器是78%。 (此外,我的上下文切换到8-9K左右,看起来很高)。
所有3台服务器都会发生这种情况。
我在服务器上更改的内容
machine.config相关行
[HttpPost]
[Route("api/test/rps")]
public IHttpActionResult TestRequestsPerSecond(MediumSizedObject testObj)
{
return new StatusCodeResult(HttpStatusCode.NoContent, Request);
}
生产网络配置(可能)相关行
<processModel autoConfig="true"
maxWorkerThreads="100"
maxIoThreads="100"
minWorkerThreads="50"
minIoThreads="50" />
<httpRuntime
minFreeThreads="176"
minLocalRequestFreeThreads="152"
/>
我尝试使用默认的machine.config,但情况稍差。
出于某种原因,每秒大约130个请求,我们只有30%的CPU,几乎没有请求排队。
我必须要有一些神奇的设置。这与IIS的课程相提并论吗?这可能是WebAPI 2的罪魁祸首吗? (如果有人认为那些会有所帮助的话,我可以测试Nancy或ServiceStack。)
我需要更大的实例吗?
任何建议或要寻找的事情,调整都会很棒。
(我让WebApi Action返回一个Task来查看它是否有任何区别,但它并没有)
答案 0 :(得分:0)
您必须在processModel元素中更改的其他属性生效之前,将processModel元素中autoconfig的值设置为“false”。