【问题标题】:Spring Boot app deployed in Google Cloud App Engine not starting up because of memory limit由于内存限制,部署在 Google Cloud App Engine 中的 Spring Boot 应用程序无法启动
【发布时间】:2020-08-19 04:07:06
【问题描述】:

我在使用 Google Cloud App Engine 中部署的 Spring Boot 应用程序时遇到问题。该应用是一个使用 JPA 和 JWT 的 API,并连接到存储在 Google Cloud SQL 中的 MySQL 数据库。

问题是由于内存限制,应用程序被卡住了。每次请求后,我都会在日志中收到以下消息:

  • 服务 0 个请求后,超过 298 MB 的软内存限制 256 MB。考虑在 app.yaml 中设置更大的实例类。
  • 此请求导致为您的应用程序启动一个新进程,从而导致您的应用程序代码首次加载。因此,与您的应用程序的典型请求相比,此请求可能需要更长的时间并使用更多的 CPU。
  • 在处理此请求时,发现处理此请求的进程使用了​​太多内存并被终止。这可能会导致一个新进程被用于对您的应用程序的下一个请求。如果您经常看到此消息,则您的应用程序中可能存在内存泄漏,或者可能正在使用内存不足的实例。考虑在 app.yaml 中设置更大的实例类。

我尝试修改文件 src/main/appengine/app.yaml 文件以设置不同的配置(具有更多内存),但每次更改后我都看不到任何差异。好像这个文件被忽略了。

这是我当前的 app.yaml

runtime: java
env: flex
runtime_config:
  jdk: openjdk8
env_variables:
  SPRING_PROFILES_ACTIVE: "gcp,mysql"
  # JAVA_GC_OPTS: -XX:+UseSerialGC
  # JAVA_USER_OPTS: -XX:MaxRAM=200m

# With -XX:+UseSerialGC This will perform garbage collection inline with the thread allocating the heap memory instead of a dedicated GC thread(s)
# With -Xss512k This will limit each threads stack memory to 512KB instead of the default 1MB
# With -XX:MaxRAM=72m

handlers:
- url: /.*
  script: this field is required, but ignored
beta_settings:
  cloud_sql_instances: guitar-tab-manager-api:europe-west3:guitar-tab-manager-db

# manual_scaling:
#   instances: 1

# instance_class: F4
# manual_scaling:
#   instances: 1

# instance_class: F2
# basic_scaling:
#   max_instances: 5
#   idle_timeout: 10m

instance_class: F2
# automatic_scaling:
#   target_cpu_utilization: 0.65
#   min_instances: 5
#   max_instances: 100
#   min_pending_latency: 30ms  # default value
#   max_pending_latency: automatic
#   max_concurrent_requests: 50

我尝试应用不同的配置,但似乎没有任何效果。也许有人可以帮忙。提前致谢。

【问题讨论】:

  • 在您的本地环境中,您的应用程序占用了多少内存?我意识到在应用程序引擎上使用 spring-boot 的“hello world”代码需要将近 1GB 的内存才能启动,您是否尝试使用实例类型“F4_1G”这有 2GB 内存
  • 是的,似乎基于 Spring Boot 的应用程序消耗了大量内存,无论如何我让它在不同的环境中工作。我没有使用 flex,而是按照 here 解释的配置使用 java8 将环境更改为标准。奇怪的是,现在该应用程序消耗的内存比以前更多(大约 300Mb),但现在它可以正常工作了。请注意 app.yaml 不再使用,现在应用程序部署为 WAR。谢谢
  • 请写下您的评论作为帮助他人的答案
  • 好的,谢谢@JAHDZP

标签: java spring-boot google-app-engine google-cloud-platform


【解决方案1】:

对于任何来这里的人:

我让它在不同的环境中工作。我没有使用 flex,而是按照 here 解释的配置使用 java8 将环境更改为标准。奇怪的是,现在该应用程序消耗的内存比以前更多(大约 300Mb),但现在它可以正常工作了。请注意 app.yaml 不再使用,现在应用程序部署为 WAR。

谢谢

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2014-04-08
    • 2020-05-15
    • 2020-02-19
    • 2018-06-12
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多