使用 JMeter 进行负载测试时,Google App Engine Flex 中出现 502 服务器错误

Kay*_*Kay 3 performance google-app-engine jmeter spring-boot

我已经在 Google App EngineFlexible 中部署了一个简单的 Spring boot 应用程序。该应用程序。有两个API,一个用于将用户数据添加到数据库中(xxx.appspot.com/add),另一个用于从数据库中获取所有用户数据(xxx.appspot.com/all)。

我想了解 GAE 如何针对负载进行扩展,因此使用 JMeter 创建了一个 100 个用户并发的负载,在 10 秒内提升,并在半秒延迟内永远调用这两个 API。虽然它运行良好一段时间(仅一个实例),但在 30 秒左右后开始失败,并出现“java.net.SocketException”或“服务器响应状态为 502”。

发生此错误后,当我尝试从浏览器访问相同的 API 时,它会显示:

错误:服务器错误

服务器遇到临时错误,无法完成您的请求。请在 30 秒后重试。

大约 30 分钟后,服务恢复正常,并且每当进行负载测试时,它都会重复上述相同的行为。我希望 GAE 能够根据传入的负载自动扩展来处理它,而无需任何停机时间(使用多个实例),而它只是崩溃或阻止服务(日志中没有任何信息)。我的 app.yaml 配置是,

runtime: java
env: flex
service: hello-service
automatic_scaling:
  min_num_instances: 1
  max_num_instances: 10
Run Code Online (Sandbox Code Playgroud)

我对这个有点困惑,任何帮助将不胜感激。提前致谢。

Kay*_*Kay 5

解决办法是增加资源配置,详情如下。

鉴于我没有设置资源参数,它默认为 CPU 和内存的预定义值。在本例中,默认内存设置为 0.6GB。App Engine Flex 实例使用大约 0.4GB 的开销进程。鉴于 Java 众所周知会消耗较高的内存,因此开销进程消耗的内存很可能超过大约 0.4GB 的值。现在,App Engine 中的实例由于多种原因(包括内存使用优化)而重新启动。这解释了为什么您的实例关闭并显示 Tomcat 正在启动(它们已重新启动)并由于 nginx 无法完成请求而最终出现 502 错误。修复上述问题即使不能完全消除 502,也可能会减少。

在我指定了 resources 属性并增加了 app.yaml 中的配置后,502 错误似乎消失了。