为什么重新启动我的 Azure WebApps 实例会导致停机几个小时?

为什么重新启动我的 Azure WebApps 实例会导致停机几个小时?

我的 Azure WebApps 实例(在 Tomcat、Linux 上运行)已经运行良好 9 个月了。最近出现了几个小时的停机,据 Microsoft 支持工程师称,这是由以下原因造成的:

在这种情况下,存储文件服务器重新启动,并且 Web 应用程序无法启动,直到您手动重新启动,Web 应用程序才卡住。为了避免这类问题,您可以遵循最佳实践

  1. 始终使用 2 个实例
    这些实例位于不同的升级域中,因此不会同时升级。当一个工作实例正在升级时,另一个仍然处于活动状态以处理 Web 请求。Web 应用当前配置为仅在一个实例上运行。由于您只有一个实例,因此您可能会遇到停机,因为当应用服务平台升级时,运行 Web 应用的实例也将升级。因此,您的 Web 应用进程将重新启动并将经历停机。
  1. 使用健康检查
    此功能会自动从轮换中删除故障实例,从而提高可用性。此功能将每 2 分钟 ping 一次 Web 应用的所有实例上的指定健康检查路径。如果实例在 10 分钟内没有响应(5 次 ping),则该实例被确定为不健康,我们的服务将停止向其路由请求。强烈建议生产应用程序使用此功能,并尽量减少由于故障实例导致的任何潜在停机时间。注意:健康检查功能仅适用于托管在多个实例上的应用程序。有关更多信息,请查看以下文档。 https://github.com/projectkudu/kudu/wiki/Health-Check-(预览)

因此,我明白我可以通过遵循最佳实践来避免此类罕见事件。但是我想知道是否还有其他原因,因为问题是从那时起,每当我重新启动 WebApp(通过 Azure 门户)时,它都会停机 2 到 5 小时,然后它会自动修复。

微软支持工程师的回应是,这是由于临时目录已满。

临时文件空间使用量几乎耗尽。应用程序可能遇到稳定性和性能问题。

应用程序在内存处理、从 API 调用下载内容等过程中会使用临时文件。如果应用程序代码没有清理,临时空间就会被用完。

推荐的操作为了永久修复,请检查并分析此应用服务计划中托管的每个应用程序,并找出未执行正确清理例程的应用程序。

我查看了 \tmp 目录,发现它基本上是空的。此外,WebApp 重新启动应该会清除临时目录,所以我不明白为什么在重新启动后会遇到问题。

微软的支持请求仍处于开放状态。我希望探索解决问题的其他可能性 - 因为它已经持续了两周。

以下是可能相关的日志部分(当 WebApp 处于离线状态时),但识别细节已被混淆。

Docker

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 INFO - 从 Docker 中心拉取映像:mcr.microsoft.com/azure-app-service/tomcat:9.0-java11_200319054033 2020-09-22T16:14:53.687Z INFO - 9.0-java11_200319054033 从 azure-app-service/tomcat 拉取 2020-09-22T16:14:53.720Z INFO - 摘要:sha256:c2c5.......73d96 2020-09-22T16:14:53.722Z INFO - 状态:映像已更新mcr.microsoft.com/azure-app-service/tomcat:9.0-java11_200319054033 2020-09-22T16:14:53.726Z INFO - 成功提取映像,耗时:0 分钟 0 秒 2020-09-22T16:14:53.825Z INFO - 正在启动站点容器 2020-09-22T16:14:53.825Z INFO - docker run -d -p 6807:80 --name examplewebapp__aetete -e WEBSITE_SITE_NAME=exampleWebApp -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=examplewebapp.azurewebsites.net -e WEBSITE_INSTANCE_ID=dgsgdhs...sdshsd -e HTTP_LOGGING_ENABLED=1 mcr.microsoft.com/azure-app-service/tomcat:9.0-java11_200319054033

2020-09-22T16:14:56.980Z INFO - 为站点 examplewebapp__a81a 发起对容器 examplewebapp__aetete 的预热请求 2020-09-22T16:15:17.526Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。 耗时 = 20.5455075 秒 2020-09-22T16:15:33.144Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。 耗时 = 36.1635991 秒 2020-09-22T16:15:54.629Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。已用时间 = 57.6488951 秒 2020-09-22T16:16:09.914Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。已用时间 = 72.9343365 秒 2020-09-22T16:16:25.080Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。已用时间 = 88.1001723 秒 2020-09-22T16:16:40.281Z INFO - 等待对容器 examplewebapp__aetete 的预热请求的响应。已用时间 = 103.3011586 秒

默认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:45:17.432562008Z 文档:http://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.011688823Z * 缓存服务依赖项... [ 确定 ] 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 self | 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 _|__ /_____ _/ || ___ >

答案1

以下信息是从 Microsoft 支持电话中收集的。

发生这种情况的原因是临时文件存储空间已用完。对于 P1V2 Linux,您将获得 35GB 的临时文件存储空间,而对于 P2V2 Linux,您将获得 69GB 的临时文件存储空间。

您可以通过“诊断并解决问题”并选择“工作者上的临时文件使用情况”来检查应用程序的使用量

请注意,除了升级实例(例如从 P1V2 到 P2V2)、等待 15 分钟,然后降级之外,没有 Microsoft 支持的实际访问这些临时文件的方式,也无法删除它们。

请注意,必须等待 15 分钟,否则您可能会返回到预先存在的实例但尚未格式化。

请注意,Microsoft 支持工程师进行了以下额外更改(我不知道这些是否是解决问题所必需的)

  1. 停止我正在使用的部署槽

  2. 添加了应用程序槽配置参数WEBSITES_CONTAINER_START_TIME_LIMIT = 1800

  3. 将 Java Web 服务器版本从 9.0 更改为 9.0.20

  4. 通过转到 /home/deployments 并执行以下操作来删除部署

    rm -rf *

这个问题有关 Azure Temp 文件的更多信息。请注意,那里用于查看它们的解决方案似乎不适用于 Azure Web Apps for Linux

相关内容