Asp.net core Asp.net核心API与服务结构上的CORS 100%CPU瓶颈
我在.net Framework 4.5.2上有一个ASP.net核心,作为无状态服务托管在ServiceFabric上 该API是一个普通API,为空Asp.net core Asp.net核心API与服务结构上的CORS 100%CPU瓶颈,asp.net-core,azure-service-fabric,asp.net-core-webapi,asp.net-core-middleware,Asp.net Core,Azure Service Fabric,Asp.net Core Webapi,Asp.net Core Middleware,我在.net Framework 4.5.2上有一个ASP.net核心,作为无状态服务托管在ServiceFabric上 该API是一个普通API,为空 [Route("Test")] public class TestController : Controller { [HttpGet] public IActionResult Get() { return Ok("Done"); } } 这是我的启动代码 public class St
[Route("Test")]
public class TestController : Controller
{
[HttpGet]
public IActionResult Get()
{
return Ok("Done");
}
}
这是我的启动代码
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
services.AddResponseCompression();
services.AddMvc().AddJsonOptions(opts =>
{
// Force Camel Case to JSON
opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors("CorsPolicy");
app.UseResponseCompression();
app.UseMvc();
}
}
这是OpenAsync方法:
Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken)
{
var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName);
string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}";
//.UseWebListener()
_webHost = new WebHostBuilder().UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseUrls(serverUrl)
.Build();
_webHost.Start();
return Task.FromResult(serverUrl);
}
任务ICommunicationListener.OpenAsync(CancellationToken CancellationToken)
{
var endpoint=FabriRuntime.GetActivationContext().GetEndpoint(_endpointName);
字符串serverUrl=$“{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}”;
//.UseWebListener()
_webHost=新建WebHostBuilder().UseKestrel()
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.useURL(服务器URL)
.Build();
_webHost.Start();
返回Task.FromResult(服务器URL);
}
一切都简单明了,没有定制。
CORS呼叫正常,一切都很完美。
我用VisualStudioTeamServices做了一个测试,加载了15K个用户,这一切都非常有效,有14K个RPS顺便说一下,我认为VS的负载测试没有使用CORS中间件。
现在的问题是,当我在生产中完全使用空API时,接收大约100个同时用户的调用时,CPU在3分钟内跳到100%。呼叫被应答,直到CPU达到100%,然后开始发回错误。
似乎有15000个用户,没有COR,一切正常,而有100个用户+COR不工作,CPU将变为100%,并保持不变,直到我重新启动VM规模集。
如果我停止发送呼叫,5个节点的CPU将保持在99%的稳定,而不接收任何单个呼叫
这怎么可能?
我尝试了一切,项目简单明了,VS负载测试有效,只有当我在不同站点和不同IP地址的真正CORS调用中使用它时,才会发生这种情况
在向服务器发送流量之前,我在服务器中进行了性能跟踪,再次使用Visual studio中的负载测试,完全使用CORS头,一切都很快
对于真实世界的呼叫,这是我在探查器中看到的:
除了CORS中间件和通常的Kestrel流程之外,它什么都没有。
无状态服务占用了99%的CPU,即使我停止了通信,也会保留它。
这是另一个30秒跟踪,没有流量,但CPU为90%
我不知道还能做什么,CORS有点问题,我敢肯定,即使它能工作,不知何故还是出了问题
这是一个CORS呼叫,服务正确
Asp.net核心CORS中间件中是否存在缺陷?
更新:
我尝试了多种组合来隔离问题:
我几乎可以肯定这是一个Asp.net Core CORS bug,当您将其作为无状态服务托管在服务结构上并向其发送一些最小流量(而不仅仅是浏览器中的几次刷新)时,就会发生这种情况。我建议在此处发布此问题:有趣。。让我们知道你发现了什么。这可能是红隼的问题吗?我在响应头中看到IIS 8.5,所以我假设您正在执行反向代理?