0

我使用 IIS 7.5 托管的测试 WCF Web 服务在一段时间不活动后(即每天的第一次调用)响应调用的速度一直很慢。

通过研究这个主题,我了解到在使用 IIS 时通常会遇到“应用程序预热”的问题(例如,请参见此处)。

我已采取建议的通常步骤来尝试缓解此问题:

  • 安装了应用程序初始化模块
  • 禁用应用程序池空闲超时和常规回收时间间隔(即设置为“0”)。
  • 为必要的应用程序池和我的应用程序编辑了applicationhost.config文件。autoStart=TruestartMode="alwaysRunning"preloadEnabled="true"

通过这些设置,我希望应用程序池在 IIS 启动时立即启动一个工作进程,并在现有的退出时启动一个新的工作进程。此外,我希望应用程序能够在工作进程中加载​​。

但是,对于每天的第一个呼叫,日志显示客户端发出呼叫与 Web 服务接收呼叫之间的时间差可能长达 10 秒。随后的呼叫通常在 2 秒内处理完毕。

奇怪的是,长响应时间并不能通过在命令后进行调用来重现iisreset。我希望如此严厉的操作会使 Web 服务处于类似的“冷”境地,但情况似乎并非如此。

我想知道:

  • 什么仍然可能导致应用程序“预热”的延迟?
  • iisresetwebservice 的状态跟随和长时间不活动有什么区别?
  • 我应该诉诸“心跳”解决方案来定期 ping 服务以使其保持活力吗?

在此先感谢您提供任何提示或见解。

4

1 回答 1

0

我会尽力帮助您解决问题:

什么仍然可能导致应用程序“预热”的延迟?

预热应用程序并不意味着预热其资源。例如,如果您在 WCF 应用程序 ( https://msdn.microsoft.com/en-us/library/ee677260(v=azure.10).aspx ) 中配置使用 Application Fabric 自动启动,并且此应用程序访问数据库使用 EF,它不会启动您的 DBContext。如果您希望在应用程序预热后初始化这些资源,您需要实现一个方法来初始化您的资源,如缓存、DBContext 等。

iisreset 和长时间不活动后 web 服务的状态有何不同?

当应用程序长时间处于不活动状态时,应用程序池可能会关闭,并在收到任何请求时重新启动,就像回收一样。此链接包含有关 iisreset 和应用程序池回收之间差异的兴趣信息,它可以帮助回答您的问题:https ://fullsocrates.wordpress.com/2012/07/25/iisreset-vs-recycling-application-pools/

我应该诉诸“心跳”解决方案来定期 ping 服务以使其保持活力吗?

如果您继续访问您的服务,它可能会将其资源初始化在内存中,因此可能是一个好方法。无论如何,如果您的应用程序池被配置为在某个时间间隔内回收,它将被回收并且您在内存中的资源会丢失。如果您觉得有问题,只需关闭此功能即可进入 IIS -> 应用程序池 -> 高级设置并设置常规时间间隔=0 对于此问题,只是一些建议,您需要进行一些测试并找出更好的解决方案。

于 2015-07-20T22:34:46.667 回答