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