我的 Azure WebApps 实例(在 Tomcat、Linux 上运行)已经运行了 9 个月。最近有几个小时的停机时间,根据 Microsoft 支持工程师的说法,这是由以下原因引起的:
在此实例上重新启动存储文件服务器,并且在您手动重新启动之前,Web 应用程序无法启动,Web 应用程序卡住了。为了避免这个孩子的问题,你可以坚持最佳实践
- 始终使用 2 个实例
这些实例位于不同的升级域中,因此不会同时升级。当一个工作实例正在升级时,另一个仍处于活动状态以服务 Web 请求。Web 应用程序当前配置为仅在一个实例上运行。由于您只有一个实例,因此您可能会遇到停机时间,因为升级应用服务平台时,运行 Web 应用的实例也会升级。因此,您的 Web 应用程序进程将重新启动并经历停机时间。
- 使用健康检查
此功能会自动从轮换中移除故障实例,从而提高可用性。此功能将每 2 分钟在您的 Web 应用程序的所有实例上 ping 指定的健康检查路径。如果一个实例在 10 分钟(5 次 ping)内没有响应,则该实例被确定为不健康,我们的服务将停止向其路由请求。强烈建议生产应用程序利用此功能并最大限度地减少由于故障实例导致的任何潜在停机时间。注意:健康检查功能仅适用于托管在多个实例上的应用程序。有关更多信息,请查看以下文档。 https://github.com/projectkudu/kudu/wiki/Health-Check-(预览)
所以我知道我可以通过遵循最佳实践来避免这类罕见事件。但是我想知道是否还有其他问题,因为问题是从那时起,每当我重新启动 WebApp(通过 Azure 门户)时,它都会遭受 2 到 5 小时的停机时间,然后它会自动修复。
Microsoft 支持工程师的回应是,这是由于临时目录已满。
临时文件空间使用几乎用尽。该应用程序可能会遇到稳定性和性能问题。
应用程序在内存处理期间使用临时文件,从 API 调用下载内容等。如果应用程序代码没有清理,临时空间就会被用完。
建议的操作要永久修复,请查看和分析此应用服务计划中托管的每个应用程序,并确定未执行正确清理例程的应用程序。
我查看了 \tmp 目录,它基本上是空的。WebApp 重启也应该清除临时目录,所以我不明白为什么我应该在重启后遇到问题。
与 Microsoft 的支持请求仍处于打开状态。我希望探索解决问题的其他可能性——因为它已经持续了两个星期。
以下是可能相关的部分日志(当 WebApp 离线时),其中的标识细节被混淆了。
码头工人
2020-09-22T16:09:57.514Z 错误 - 站点 examplewebapp__a81a 的容器 examplewebapp__ 未在预期的时间限制内启动。已用时间 = 600.9031978 秒 2020-09-22T16:09:57.515Z 错误 - 容器 examplewebapp__ 没有响应端口:80 上的 HTTP ping,站点启动失败。请参阅容器日志以进行调试。2020-09-22T16:09:57.544Z 信息 - 停止站点 examplewebapp__a81a,因为它在启动期间失败。2020-09-22T16:14:53.608Z 信息 - 从 Docker 中心拉取图像:mcr.microsoft.com/azure-app-service/tomcat:9.0-java11_200319054033 2020-09-22T16:14:53.687Z 信息 - 9.0-java11_200319054033从 azure-app-service/tomcat 2020-09-22T16:14:53.720Z 信息中提取 - 摘要:sha256:c2c5.......73d96 2020-09-22T16:14:53.722Z 信息 - 状态:图像是mcr.microsoft.com/azure-app-service/tomcat:9.0-java11_200319054033 2020-09-22T16 的最新版本:
2020-09-22T16:14:56.980Z 信息 - 为站点 examplewebapp__a81a 向容器 examplewebapp__aetete 发起预热请求 2020-09-22T16:15:17.526Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过的时间 = 20.5455075 秒 2020-09-22T16:15:33.144Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过时间 = 36.1635991 秒 2020-09-22T16:15:54.629Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过的时间 = 57.6488951 秒 2020-09-22T16:16:09.914Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过时间 = 72.9343365 秒 2020-09-22T16:16:25.080Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过时间 = 88.1001723 秒 2020-09-22T16:16:40。281Z 信息 - 等待对容器 examplewebapp__aetete 的预热请求的响应。经过时间 = 103.3011586 秒
Default_Docker
2020-09-22T11:45:17.432527708Z / | / /| | /| | /\ / 2020-09-22T11:45:17.432531708Z _ |__ /_____ __ / | | ___ > 2020-09-22T11:45:17.432535708Z // / 2020-09-22T11:45:17.432539208ZAPPSERVICEONLINUX 2020-09-22T11:45:17.432542708Z 2020-09-22T11:45Z8:17 文档:4 / /aka.ms/webapp-linux 2020-09-22T11:45:17.432565208Z 2020-09-22T11:45:17.432568708Z 注意:/home 之外的任何文件或系统更改都不会持续到您的应用程序的当前会话之外。/home 是您的应用程序的持久存储,并在所有服务器实例之间共享。2020-09-22T11:45:17.432573808Z 2020-09-22T11:45:17.432576808Z 2020-09-22T11:45:17.432836008Z 设置 openrc ... 2020-09-22T11:45:20.01168.8823 缓存服务依赖项.. [ ok ] 2020-09-22T11:45:20.040479470Z 更新 /etc/ssh/sshd_config 以使用 PORT 2222 2020-09-22T11:45:20.056556396Z 正在启动 ssh 服务... 2020-09-22T11:45: 23.318735610Z ssh-keygen:生成新主机密钥:RSA DSA ECDSA ED25519 2020-09-22T11:45:27.654655866Z * 正在启动 sshd ... [ ok ] 2020-09-22T11:45:27.675340497Z ## 打印构建信息。 .. 2020-09-22T11:45:27.685373113Z
包装 | 版本 | 提交 2020-09-22T11:45:27.685419013Z
Microsoft.AppService.EasyAuthExtensionsJava |
1.0.011720002-alpha-793ad718 | 793ad718 2020-09-22T11:45:27.685426413Z Microsoft.AppService.WebsitesExtensionsJava |
1.0.011730003-alpha-53ae38d3 | 53ae38d3 2020-09-22T11:45:27.685430813Z 自我 | 1.0.011730002-alpha-c6f00046 | c6f00046 2020-09-22T11:45:27.687085515Z ## 完成打印构建信息。2020-09-22T11:55:23.212406842Z _____
2020-09-22T11:55:23.212435742Z / _ \ __________ _________ ____
2020-09-22T11:55:23.212440842Z / / \ ___ / | _ __ _/ __ \ 2020-09-22T11:55:23.212444742Z / | / /| | /| | /\ / 2020-09-22T11:55:23.212448142Z _ |__ /_____ _ / | | ___ >
以下信息来自 Microsoft 支持电话。
发生这种情况的原因是临时文件存储已用完。对于 P1V2 Linux,您可以获得 35GB 的临时文件存储空间,对于 P2V2 Linux,您可以获得 69GB 的临时文件存储空间。
您可以通过转到“诊断和解决问题”然后选择“工作人员的临时文件使用情况”来检查您的应用程序使用了多少
请注意,除了升级您的实例(例如从 P1V2 到 P2V2)、等待 15 分钟然后降级之外,没有 Microsoft 支持的实际访问这些临时文件的方法,也没有删除它们的方法。
请注意,必须等待 15 分钟,否则您将面临返回到预先存在的实例但未对其进行格式化的风险。
请注意,Microsoft 支持工程师进行了以下附加更改(我不知道这些是否是解决问题所必需的)
停止了我正在使用的部署槽
添加了应用程序槽配置参数
WEBSITES_CONTAINER_START_TIME_LIMIT = 1800
将 Java Web 服务器版本从 9.0 更改为 9.0.20
通过转到 /home/deployments 并执行删除部署
rm -rf *
有关 Azure 临时文件的详细信息,请参阅此问题。请注意,那里用于查看它们的解决方案似乎不适用于适用于 Linux 的 Azure Web Apps