Performance ASP.NET核心web应用程序出现奇怪的性能问题(阻塞?)

Performance ASP.NET核心web应用程序出现奇怪的性能问题(阻塞?),performance,asp.net-core,.net-core,Performance,Asp.net Core,.net Core,我们正准备部署我们的第一个ASP.NET核心应用程序之一,并在我们的暂存web服务器上看到一些非常奇怪的性能问题。在开发机器上,无论是运行在iisexpress中,还是在常规IIS中设置的测试站点(该站点与web服务器上的配置密切相关),一切似乎都很好 代码似乎没有做任何不寻常的事情,但在web服务器上运行时,似乎不时会进入一种赋格状态/锁定。日志本身并没有指出任何问题,但在该机器上运行时,时间戳有一些非常长且意外的间隔 该应用程序是.NET Core 2.2,在IIS上运行进程内。本地计算机为

我们正准备部署我们的第一个ASP.NET核心应用程序之一,并在我们的暂存web服务器上看到一些非常奇怪的性能问题。在开发机器上,无论是运行在iisexpress中,还是在常规IIS中设置的测试站点(该站点与web服务器上的配置密切相关),一切似乎都很好

代码似乎没有做任何不寻常的事情,但在web服务器上运行时,似乎不时会进入一种赋格状态/锁定。日志本身并没有指出任何问题,但在该机器上运行时,时间戳有一些非常长且意外的间隔

该应用程序是.NET Core 2.2,在IIS上运行进程内。本地计算机为Windows 10,服务器为Windows server 2012r2。web服务器是一台共享计算机,在其上配置了其他站点,但此应用程序是一个独立的站点,是一个独立的应用程序池,与其他任何应用程序池都不同

下面是一段API控制器代码,它调用服务组件上的一个方法,根据外部系统对用户进行身份验证:

AuthenticationResult;
试一试{
_LogTrace(“将尝试对源{1}{2}”、source.Id、source.Name进行用户身份验证);
结果=等待system.AttemptUserAuthenticationAsync(模型);
if(null==结果?.ExternalKey){
返回UserInformationResult.Empty;
}
}
捕获(ValidationException ex){
_logger.LogTrace(例如,“源{1}{2}的身份验证提交失败”,source.Id,source.Name);
返回验证问题(例如ModelState);
}

以下是其中一个
AttemptUserAuthenticationAsync()
实现中的验证代码:

var validationResults=new List();
if(String.IsNullOrWhiteSpace(credentials.Username)){
添加(新的ValidationResult(_localizer[“请提供用户名”]、新的[{nameof(credentials.username)}));
}
if(String.IsNullOrEmpty(credentials.Password)){
添加(新的ValidationResult(_localizer[“请提供密码”]、新的[]{nameof(credentials.password)});
}
if(validationResults.Any()){
_LogTrace(“身份验证凭据无效;将引发ValidationException”);
抛出新模型。ValidationException(validationResults);
}
下面是在麻烦的web服务器上执行此代码时的日志,在异常即将抛出的位置和调用代码捕获的位置之间间隔三分钟。这一特定问题似乎相当一致。在团队工作站上,这里的日志间隔仅为几毫秒

2020-01-15 10:38:26.969 -05:00 [VRB] Authentication credentials invalid; will throw ValidationException
2020-01-15 10:41:29.859 -05:00 [VRB] Validation failed for authentication submission for source "b8c28eac-09e4-4a0c-82a1-b1b788c04467" Test Source

我有点不知道该怎么解决这个问题。是否有我们应该查看的设置?其他日志?什么可能导致这个应用程序像这样阻塞?

确实要考虑用后台服务处理长时间运行的请求或者用Azure函数处理进程。完成进程外工作对于CPU密集型任务尤其有益。


使用实时通信选项,如Simulalr,异步地与客户端通信。

< P>请考虑使用Azure函数处理与后台服务或进程无关的长时间运行请求。完成进程外工作对于CPU密集型任务尤其有益。
务必使用实时通信选项(如信号器)与客户端异步通信。

OK。但整个问题是,在模型验证失败的情况下,这不应该是一个长时间运行的请求。而且,在开发机器上,情况并非如此。但整个问题是,在模型验证失败的情况下,这不应该是一个长时间运行的请求。而且,在开发机器上并非如此。
AttemptUserAuthenticationAsync
是异步的,但您选择发布的代码段中没有任何异步的,甚至没有明显的变化。异步实际发生了什么?我没有包括它,因为在我所说的例子中,执行永远不会到达那里,而且它似乎不相关。但是,如果验证成功,我们将使用这些凭据调用外部API以获取有关用户的信息。
AttemptUserAuthenticationAsync
是异步的,但是您选择发布的代码段中没有任何异步的,甚至没有显着的变化。异步实际发生了什么?我没有包括它,因为在我所说的例子中,执行永远不会到达那里,而且它似乎不相关。但如果验证成功,我们将使用这些凭据调用外部API以获取有关用户的信息。