在为4330个请求提供服务之后,超过了307 MB的软内存限制超过了243 MB。考虑在app.yaml中设置更大的实例类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (72)

情况:

我的项目主要是自动化任务。我的GAE(标准环境)应用程序有40个这样的作业,都在默认模块(前端)上运行:

- description: My cron job Nth
  url: /mycronjob_n/ ###### Please note n is the nth cron job. 
  schedule: every 1 minutes

每个cron工作

@app.route('/mycronjob_n/')
def mycronjob_n():

    for i in (0,100):
         pram = prams[i]
         options = TaskRetryOptions(task_retry_limit=0,task_age_limit=0)
         deferred.defer(mytask,pram)

哪里mytask

def mytask(pram):
   #Do some loops, read and write datastore, call api, which I guesss taking less than 30 seconds.
   return 'Task finish'

问题:

作为问题的标题,我的RAM用完了。前端实例小时数增加到100小时。

我的错误想法?

  1. 延迟任务在后台运行,因为它不是用户在访问网站时发送请求的内容。因此,它们不会被视为请求。
  2. 我将我的cronjobs_n分解成不同的小任务,因为我认为它可以帮助减少每个cronjobs_n的运行时间,以便REDUCE实例的ram消耗。

我的问题:(目的:保持前端/后端实例的时间尽可能低,我接受延迟)

  1. 延期任务是否被视为请求?我在1分钟内有多少要求?
    • 40请求mycronjob_n或
    • mycronjob_n的40个请求x 100 mytask = 4000

如果3-4个实例无法处理4000个请求,为什么GAE不会再添加10到20个F1实例,然后在空闲时关闭?我在app.yaml中设置了自动缩放功能。我没有在广告中看到GAE自动缩放的含义。

  1. 优化我的应用的最佳方法是什么?如果将延迟任务计为请求,将mycronjob_n分成不同的小任务是没有意义的,对吧?我的意思是,我目前的方法与: @ app.route('/ mycronjob_n /')def mycronjob_n(): for i in (0,100): pram = prams[i] options = TaskRetryOptions(task_retry_limit=0,task_age_limit=0) mytask(pram) #Call function mytask 在这里,我的应用程序每分钟有40个请求,每个请求运行100 x 30s = 3000s吗?那么这种方法也会失去记忆吗?我应该创建在F1实例上运行的后端服务并将所有cron作业放在该后端服务上吗?我听说请求可以运行24小时。
  2. 如果我将默认服务实例从F1更改为F2,F3,我仍然可以免费获得28小时吗?我听说免费等级适用于F1。如果它在B2而不是B1上运行,我的后端服务是否可以免费使用9小时?

我很遗憾: - 我很遗憾我为这个项目选择了GAE。我选择它是因为它有免费等级。但我意识到免费套餐只是为了爱好/测试目的。如果我运行一个真正的应用程序,成本将会非常快地增加,这让我认为GAE很昂贵。即使我尽力优化它们,数据存储区的读/写也是如此昂贵。前端时间也很高。我每个月为GAE支付40美元。每月40美元,如果我选择Heroku,Digital Ocean,我可以获得更好的服务器吗?你这么认为吗?

提问于
用户回答回答于
  1. 是的,任务队列请求(包括延迟)也是请求,它们只能运行比用户请求更长的时间。他们需要实例来为他们服务,这些实例计为实例小时数。由于您每分钟至少运行一个cron作业 - 您将不会有任何15分钟的空闲间隔,从而允许您的实例关闭 - 因此您至少需要一个实例运行。如果您使用F1 / B1以外的任何实例类 - 您将超过免费实例小时配额。请参阅标准环境实例计费。
  2. 您似乎认为请求数量会增加您的成本。它不是,至少不是直接的。罪魁祸首很可能是运行的实例数。

如果3-4个实例无法处理4000个请求,为什么GAE不会再添加10到20个F1实例,然后在空闲时关闭?

最有可能GAE确实如此 - 产生了几个实例。但是你每分钟都在提出请求,他们没有达到空闲状态足够长的时间,因此他们不会关闭。这会推动你的实例小时数。

你可以做两件事:

您还应该仔细阅读如何管理实例

  1. 是的,无论实例类如何,您只需支付超过免费配额的费用。无论如何,结算都是F1 / B1单位 - 从上面的结算链接:

重要提示:如果您在几小时内结算,则不会在结算行项目中看到任何实例类。相反,您将看到适当的实例小时数。例如,如果您使用F4实例一小时,则不会看到列出的“F4”,但您会看到以F1费率计算四个实例小时的结算。

关于RAM使用情况,在多个任务中拆分cron作业并不一定有帮助,请参阅App Engine Deferred:追踪内存泄漏

最后,将GAE与Heroku,Digital Ocean进行比较的成本并不是苹果对苹果的比较:GAE是PaaS,而不是IaaS,恕我直言预计会更昂贵。选择一个或另一个真的取决于你。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励