ASP.NET 6应用程序在WebApplication之后延迟很长时间,请在IIS中承载时运行

8ulbf1ek  于 2023-01-26  发布在  .NET
关注(0)|答案(1)|浏览(864)

我们刚刚将一个ASP.NET应用程序转换为.NET 6.0,并将其托管在IIS 10中。自从转换之后,每次启动应用程序时,部署都会在大约5分钟内无响应。
以下是基本设置:

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.ConfigureDefaults(args);
    builder.Services.AddControllersWithViews(ConfigureMvcOptions)
    
    var app = builder.Build();
    Log.Info("Begin Configuration"); 
    app.UseRouting();
    app.MapControllers();
    app.UseStaticFiles();
    app.Lifetime.ApplicationStarted.Register(Started);
    ConfigureSomeOtherIrrelevantSutff();
    Log.Info("Configuration Complete");
    app.Run(); //Delay happens after this
}

private static void Started()
{
    Log.Info($"Application Started");
}

日志指示以下内容:

2023-01-17 12:27:50.470: Begin Configuration
2023-01-17 12:28:25.498: Configuration Complete
2023-01-17 12:28:25.580: Application Started
2023-01-17 12:32:57.700: First Request

另请注意,IIS AspNetCore Module V2会在事件查看器中记录“应用程序'C:\IIS\MyApp'已成功启动”。
之后,在第一个请求被服务之前会有~4分钟的延迟。在这段时间里,Web应用程序完全没有响应,浏览器只是无限期地旋转。
一些可能相关的注意事项:

  • 我们有<handlerSetting name="experimentalEnableShadowCopy" value="true" />,因为我们在部署时遇到了锁定文件的问题。我不认为这是问题所在,因为应用程序复制后延迟很长时间。
  • 在延迟期间,IIS辅助进程的CPU使用率为0%,应用程序完全不执行任何操作
  • 在IIS中启用了DisableOverlappedRecycle,因此不会与旧进程争用资源--在新进程启动时,旧进程将完全终止
  • 我们在部署所有文件后回收应用程序池,它不会在配置/文件更改时自动回收

我不知道从哪里开始诊断这个问题,因为它似乎完全发生在我们的代码之外。我可以做些什么来进一步调试延迟?
编辑:更多注解:

  • 无法在本地或没有负载的服务器上重现
  • 我有时在关机时也会遇到这个问题。注册ApplicationStopped显示应用程序已关闭,然后IIS在启动新版本之前只会在那里旋转X分钟
hc8w905p

hc8w905p1#

我相信我找到了问题。似乎有未完成的连接导致进程在关闭期间挂起。我还在IIS中禁用了重叠回收,所以我认为新的工作线程必须等待前一个终止后才能启动。
此时,我不知道为什么没有以更及时的方式完成连接,所以我只是通过将AppPool上的“Shutdown Time Limit”设置为10秒来更快地终止工作进程。

相关问题