【问题标题】:Scaling out GAE when memory utilization exceeds limit当内存利用率超过限制时横向扩展 GAE
【发布时间】:2018-10-13 11:07:49
【问题描述】:

我将 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

执行任务失败是“Exceeded soft memory limit”。 所以,为了解决这个错误,我认为横向扩展应该基于“内存利用率”而不是“cpu利用率”。

内存利用率超过限制时如何进行横向扩展?

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    动态实例调度程序的决策并非基于实例内存使用情况。来自Scaling dynamic instances

    App Engine 调度程序决定是否为每个新请求提供服务 使用现有实例(空闲或接受 并发请求),将请求放入待处理的请求队列中,或 为该请求启动一个新实例。该决定考虑到 可用实例的数量,应用程序的运行速度 一直在服务请求(它的延迟),以及启动一个请求需要多长时间 新实例。

    您收到的所有错误消息都显示在错误发生之前处理的请求数量非常少,这表明内存不足非常严重。

    不清楚的是,高内存使用量是来自单个请求还是与多个并发请求有关 - 即请求同时命中一个实例(或彼此太接近而无法释放内存机制,如果有的话,跟上)。但这可以通过实验确定。

    如果多个并发传入请求导致实例内存使用量超过阈值,您可以尝试通过控制target_throughput_utilization 和/或max_concurrent_requests 旋钮来处理它:

    Target Throughput Utilization

    设置并发请求数的吞吐量阈值 之后将启动更多实例来处理流量。

    Max Concurrent Requests

    设置实例可以接受的最大并发请求数 调度程序生成一个新实例。

    如果即使没有同时处理多个请求的实例也达到了内存限制(或者如果您希望能够同时服务更多实例 - 通常是为了降低成本),那么您可以解决它的唯一方法是使用 @987654324 @内存更多。你试过的F4B4类都是512M,试试F4_1G/B4_1G,都是1G。

    【讨论】:

    • ` > 不清楚的是高内存使用是来自单个请求还是与多个并发请求有关 高内存使用来自单个请求`一个http请求启动HEADLESS CHRONE木偶师,工作 1 小时。并且一小时后,如果多个请求到达一个实例,该实例无法处理其任务,则会发送响应,因此最好启动另一个实例。
    • 然后将max_concurrent_requests设置为1
    • max_concurrent_requests 仅适用于自动扩展,但为了保持实例运行,它必须是具有长idle_timeout的基本扩展。但是 Basic Sc​​aling 没有参数来调整扩展时间。如何使用 Basic Sc​​aling 添加新实例?
    • 你是对的。除了在内部跟踪请求并在已经处理的请求时拒绝其他请求之外,您无能为力。但是您不能真正动态扩展,您可能需要切换到手动扩展并构建一个单独的“调度程序”服务来跟踪外部请求,根据需要启动和关闭实例并将外部请求传递给它们以进行处理。
    • 你能详细说明吗?' > 在内部跟踪请求并在处理中拒绝其他请求。'
    猜你喜欢
    • 2021-11-22
    • 2013-02-08
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2017-10-31
    • 2019-09-05
    • 2019-07-10
    相关资源
    最近更新 更多