【问题标题】:GCP Documentation - Task Queue bucket_size and rateGCP 文档 - 任务队列 bucket_size 和 rate
【发布时间】:2017-11-09 19:10:13
【问题描述】:

我在这里阅读了很多关于 Google Task 的文章和答案,我的疑问是“rate”和“bucket_size”行为。

我阅读了以下文档: https://cloud.google.com/appengine/docs/standard/java/configyaml/queue

sn-p 是:

配置最大并发请求数

如果使用默认的 max_concurrent_requests 设置不 足够了,您可以更改 max_concurrent_requests 的设置, 如下例所示:

如果您的应用程序队列的速率为 20/s 且存储桶大小为 40, 该队列中的任务以 20/s 的速率执行,并且可以达到 40/s 简要地。如果任务延迟相对较低,这些设置可以正常工作; 但是,如果延迟显着增加,您将最终处理 显着更多的并发任务。这种额外的处理负载可以 消耗额外的实例并减慢您的应用程序。

例如,假设您的正常任务延迟为 0.3 秒。在此延迟下,您最多将处理大约 40 个任务 同时地。但是如果你的任务延迟增加到 5 秒,你 一次可以轻松处理 100 多个任务。这种增加 强制您的应用程序消耗更多实例来处理额外的 任务,可能会减慢整个应用程序并干扰 与用户请求。

您可以通过将 max_concurrent_requests 设置为 较低的价值。例如,如果您将 max_concurrent_requests 设置为 10, 当延迟为 0.3 时,我们的示例队列保持大约 20 个任务/秒 秒。但是,当延迟增加超过 0.5 秒时,这 设置节流处理速率以确保不超过 10 任务同时运行。

队列:

# 设置最大并发请求数为50

- 名称:优化队列
速率:20/s
桶大小:40
max_concurrent_requests: 10

我知道队列是这样工作的:

存储桶是确定要执行的任务数量的单位。

速率是每个周期执行的桶的数量。

max_concurrent_requests 是可以同时执行的最大值。

这里的这个 sn-p 可能很奇怪:

但是,如果您的任务延迟增加到 5 秒,您可以轻松地 一次处理超过 100 个任务。这种增加迫使您 应用程序消耗更多实例来处理额外的任务, 可能会减慢整个应用程序并干扰 用户请求。

假设 max_concurrent_requests 没有设置。 对我来说,不可能执行超过 100 个任务,因为 bucket_size 是 40。对我来说,低任务会影响任务等待空桶的时间。

为什么文档说任务可以有超过 100 个?

如果bucket是40,40以上可以同时运行吗?

编辑

桶被填满只是所有的任务都被执行了,或者如果某个桶是空闲的,那么下一个速率会增加吗? 例子: 40 个桶正在执行。 1桶完成。 想象一下,每个桶花费的时间超过 0.5 秒,有些桶的时间超过 1 秒。 当 1 个存储桶空闲时,这将在下一秒填满,还是存储桶等待所有任务完成后再重新填满?

【问题讨论】:

  • 问题是延迟。如果队列以 20/s 的速度处理,但每个任务需要 10 秒,那么在 5 秒后(没有max_concurrent_requests 限制),它将处理 100 个任务。存储桶大小的定义更精确 in the doc 您链接但似乎起到了突发限制的作用。
  • 对我来说,这个过程是:想象有 200 个任务排队,每个任务有 10 秒执行(延迟)。 1 -> 桶是空的 2 -> 在第一秒 20 个任务(速率)将被放入桶中执行。 3 -> 在第二个更多的 20 个任务(速率)将被放入桶中执行。 4 -> 在第三秒,因为桶已满,所以不会将任何东西(速率)放入桶中。因此,在这种情况下,不要有 100 个任务,因为存储桶已满,其他任务正在等待。
  • 据我了解,如果您有 200 个任务排队并且存储桶大小为 40,则在第一秒 (t1) 将开始处理 40 个任务。同时 20 个令牌将被添加到存储桶中。因此,在 t2,20 个任务将准备好进行处理。如果没有max_concurrent_setting,则这 20 个任务将开始处理,并且将添加另外 20 个令牌。如果max_concurrent_setting 为 10,则不会发生任何事情,因为已经有超过 10 个进程在使用。
  • 嗨@klenwell,谢谢你的解释,我还是有点困惑。在这里,我觉得这个作者的想法和你一样:stackoverflow.com/questions/38754085/… 这里,我觉得这个作者的想法和你不同,这个概念就是当slots为空时使用token。 stackoverflow.com/questions/28033610/…
  • 嗨@klenwell,我做了一些测试,发现你说没问题。我无法将您的答案标记为正确。

标签: google-app-engine google-cloud-platform gcp


【解决方案1】:

存储桶大小的定义更精确 in the doc 您链接,但将其视为一种初始突发限制。

根据您在问题中提供的参数,我理解它的工作方式如下:

  • bucket_size:40
  • 速率:20/s
  • max_concurrent_requests: 10

在第一秒 (t1) 将开始处理 40 个任务。同时 20 个令牌(基于rate)将被添加到存储桶中。因此,在 t2,20 个任务将准备好进行处理,另外 20 个令牌将被添加到存储桶中。

如果没有max_concurrent_setting,这 20 个任务将开始处理。如果max_concurrent_setting 为 10,则不会发生任何事情,因为已经有超过 10 个进程在使用。

App Engine 将继续以 20/s 的速率向存储桶添加令牌,但前提是存储桶中有空间 (bucket_size)。一旦桶中有 40 个令牌,它将停止,直到一些正在运行的进程完成并且有更多空间。

40 个任务的初始突发完成后,一次执行的任务不应超过 10 个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多