我将GAE用于需要大量内存的繁重任务。我收到以下错误:
Exceeded soft memory limit of 512 MB with 561 MB
after servicing 3 requests total.
Consider setting a larger instance class in app.yaml.
由于任务很昂贵,我假设两个应用程序可以在一个实例中工作。但这不适用于以下三个应用程序:
While handling this request,
the process that handled this request was found to be using
too much memory and was terminated.
This is likely to cause a new process to be used
for the next request to your application.
If you see this message frequently,
you may have a memory leak in your application or may be
using an instance with insufficient memory.
Consider setting a larger instance class in app.yaml.
我当前的设置:
runtime: nodejs8
instance_class: B4
basic_scaling:
max_instances: 10
idle_timeout: 1m
我也尝试了以下设置:
runtime: nodejs8
instance_class: F4
automatic_scaling:
target_cpu_utilization: 0.5
max_instances: 10
执行任务失败是“ 超出了软内存限制”。 因此,为解决此错误,我认为横向扩展应基于“内存利用率”而不是“ cpu利用率”。
当内存利用率超过限制时,如何进行横向扩展?
答案 0 :(得分:1)
动态实例调度程序的决定不是基于实例内存使用情况。来自Scaling dynamic instances:
App Engine计划程序决定是否满足每个新请求 与现有实例(空闲或接受的实例 并发请求),将请求放入待处理的请求队列中,或者 为该请求启动一个新实例。该决定考虑了 可用实例的数量,应用程序的运行速度 一直在处理请求(其延迟),以及启动请求所需的时间 新实例。
您收到的所有错误消息显示在错误发生之前正在处理的请求数量很少,这表明内存不足非常严重。
目前尚不清楚的是,高内存使用是来自单个请求还是与多个并发请求相关-即,请求同时命中一个实例(或者彼此之间距离太近,无法释放内存)机制(如果有的话)。但这可以通过实验确定。
如果多个并发传入请求导致实例内存使用率超过阈值,则可以尝试通过控制target_throughput_utilization
和/或max_concurrent_requests
旋钮来处理它:
设置并发请求数的吞吐量阈值 之后将启动更多实例来处理流量。
设置实例可以接受的最大并发请求数 调度程序会产生一个新实例。
如果即使实例没有同时处理多个请求(或者您希望能够同时处理更多实例,通常是为了降低成本)也要达到内存限制,则唯一可以解决的方法是使用{{ 3}}具有更多的内存。您尝试过的F4
和B4
类都具有512M,请尝试F4_1G
/ B4_1G
,它们都具有1G。