【发布时间】: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