在ASP.NET Core Web API项目中如何保持控制器的热启动

16
我注意到在一段时间后,我的ASP.NET Core Web API服务似乎会经历与首次启动时相同的初始化过程,即初始请求很慢,但随后的请求很快。
有没有一种常见的技术可以让控制器保持热身,以便这种情况不会发生?仅供参考,我没有使用IIS,这些服务在使用Microsoft的官方.NET Core docker镜像(非基于Alpine)时运行在Docker中。
我还应该指出,在这些服务中的控制器在启动时通过一个/ready端点进行预热,该端点由Kubernetes作为可读性检查调用。问题是这似乎并没有特别长时间地保持。

1
如果您能提供一个 [mcve],那就太棒了,这样我们就可以看到相关的控制器及其依赖项。 - mjwills
2
@mjwills 目前还没有,但是我仔细检查了 Npgsql 文档并注意到默认情况下它会在 5 分钟后关闭空闲连接,所以我认为这很可能是根本原因。需要进行分析以确认。 - user1282993
1
这不仅仅是因为本地的C# JIT编译器吗? - Dandy
在这种情况下,您可能还需要寻找线程饥饿类似的问题。如果线程池由于某种原因保持最小线程计数较低,则该应用程序无法有效响应大量请求。您可以尝试使用SetMinThreads()来确定问题,但在生产中使用时要小心。 https://learn.microsoft.com/en-Us/dotnet/api/system.threading.threadpool.setminthreads?view=netframework-4.8 - Sergey Nikitin
你是在使用内存缓存还是在/ready调用中创建了数据库连接?也许内存被清空或连接已达到最大空闲时间。有时这些情况会发生。 - Ori Refael
显示剩余5条评论
2个回答

1
这绝对不像是控制器的问题。控制器通常是每个请求的新实例。当您在评论中提到“慢 -> 8秒,快 -> 300毫秒”时,这绝对与Kestrel或控制器无关。
您的问题可能是许多问题之一,但以下是几个猜测:
- 如果您在Windows上运行应用程序(例如Azure应用程序服务),则它正在IIS下运行。您可能需要检查您的IIS和托管设置。某些主机会暂停您的Web服务,如果它是“便宜”的层次结构。 - “慢 -> 8秒”听起来像是您有一个缓慢的外部调用。可能是数据库、外部API或者重新认证等。

0

如果您的这种经验是在开发计算机/个人机器上,每次开始调试或运行应用程序时都会遇到这种情况,那么可能会有延迟。但在实时操作中,除了第一次运行或应用程序池被回收或服务实例重新启动之外,这种情况肯定不会发生。即使在服务器上,这种差异也应该非常小。对于 .net core,体验的延迟应该更小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接