如何解决从 App Engine 生成的 'Request was aborted after waiting too long to attempt to service your request error'
How do I solve 'Request was aborted after waiting too long to attempt to service your request error' generated from App Engine
一般来说,我们每秒大约有 2 个请求。然而,在我们向 3000 个用户推送通知后,我们突然达到了 120 个请求/秒。不幸的是,大约一半的用户遇到了 5XX 服务器错误,这意味着出现的用户中有一半得到的是空白页面。炒作结束后,服务器错误再也没有发生过。
我做了一些研究,似乎是因为启动时间,实例启动时间太长,因此中止。我查看了我的实例编号,创建了多达 90 个实例,但是活跃实例在一秒钟后从 40 个下降到 0 个。只有在请求突然增加时才会出现此问题,但我认为 App Engine 应该能够处理这种类型的增加。
我的问题是如何解决这个问题?或者我应该在哪里继续挖掘以找到问题的根源。提前致谢!
您看到了哪些 5XX 代码?
我遇到了实例在启动时神秘地挂起并死机的问题:
这是由于我使用的第 3 方库在实例化期间试图绑定到端口,我最终编辑了该库的源代码。
由于 python 的 ssl 库的 App 引擎版本中存在内存泄漏,实例向 APNS 发送它的第 20 次推送通知后,我也遇到过崩溃。
您的问题与这些问题略有不同,但查找问题的步骤是一样的:
- 通过将项目部署到不同的项目 ID 来设置沙箱并重现问题。制作一个脚本,在几分钟内从您的本地计算机发送数千个请求来访问这个沙箱应该可以做到。
- 注释掉你的代码,再次部署到沙箱,看看它是否仍然崩溃,重复直到你的脚本不再崩溃。
像这样继续进行排除过程应该会通过排除所有不会导致问题的因素来引导您找到导致问题的原因。
您也可以反其道而行之,从一个 'hello world' 类型的项目开始,系统地复制您的应用程序代码块,直到问题开始出现。
如果您遇到高流量,那么现在也许是您 运行 负载测试的好时机。尝试尽可能接近地模拟真实世界的流量,并尝试使用 Stackdriver Trace 或通过分析代码和数据库操作中的请求处理来查找瓶颈。
还要检查 yaml 文件中的项目缩放设置,尤其是这些参数:
automaticScaling:
coolDownPeriod: 120s
cpuUtilization:
targetUtilization: 0.5
maxTotalInstances: 8
minTotalInstances: 1
谢谢大家的帮助,我已经解决问题了。
感谢 Dan Cornilescu,他的评论给了我找到问题根源的线索,这是因为我没有足够的 min_idle_instances。一旦我在 app.yaml 的自动缩放部分设置了足够数量的 min_idle_instance,我就没有收到任何 5XX 服务器错误。
不一定是解决方案,但值得检查:确保您在 Google 提供的环境变量指定的端口上进行监听。这为我解决了。
一般来说,我们每秒大约有 2 个请求。然而,在我们向 3000 个用户推送通知后,我们突然达到了 120 个请求/秒。不幸的是,大约一半的用户遇到了 5XX 服务器错误,这意味着出现的用户中有一半得到的是空白页面。炒作结束后,服务器错误再也没有发生过。
我做了一些研究,似乎是因为启动时间,实例启动时间太长,因此中止。我查看了我的实例编号,创建了多达 90 个实例,但是活跃实例在一秒钟后从 40 个下降到 0 个。只有在请求突然增加时才会出现此问题,但我认为 App Engine 应该能够处理这种类型的增加。
我的问题是如何解决这个问题?或者我应该在哪里继续挖掘以找到问题的根源。提前致谢!
您看到了哪些 5XX 代码?
我遇到了实例在启动时神秘地挂起并死机的问题:
这是由于我使用的第 3 方库在实例化期间试图绑定到端口,我最终编辑了该库的源代码。
由于 python 的 ssl 库的 App 引擎版本中存在内存泄漏,实例向 APNS 发送它的第 20 次推送通知后,我也遇到过崩溃。
您的问题与这些问题略有不同,但查找问题的步骤是一样的:
- 通过将项目部署到不同的项目 ID 来设置沙箱并重现问题。制作一个脚本,在几分钟内从您的本地计算机发送数千个请求来访问这个沙箱应该可以做到。
- 注释掉你的代码,再次部署到沙箱,看看它是否仍然崩溃,重复直到你的脚本不再崩溃。
像这样继续进行排除过程应该会通过排除所有不会导致问题的因素来引导您找到导致问题的原因。
您也可以反其道而行之,从一个 'hello world' 类型的项目开始,系统地复制您的应用程序代码块,直到问题开始出现。
如果您遇到高流量,那么现在也许是您 运行 负载测试的好时机。尝试尽可能接近地模拟真实世界的流量,并尝试使用 Stackdriver Trace 或通过分析代码和数据库操作中的请求处理来查找瓶颈。
还要检查 yaml 文件中的项目缩放设置,尤其是这些参数:
automaticScaling:
coolDownPeriod: 120s
cpuUtilization:
targetUtilization: 0.5
maxTotalInstances: 8
minTotalInstances: 1
谢谢大家的帮助,我已经解决问题了。
感谢 Dan Cornilescu,他的评论给了我找到问题根源的线索,这是因为我没有足够的 min_idle_instances。一旦我在 app.yaml 的自动缩放部分设置了足够数量的 min_idle_instance,我就没有收到任何 5XX 服务器错误。
不一定是解决方案,但值得检查:确保您在 Google 提供的环境变量指定的端口上进行监听。这为我解决了。