总共为4330个请求提供服务后,超出的软内存限制为243 MB和307 MB。考虑在app.yaml

时间:2018-08-28 23:03:40

标签: google-app-engine

情况:

我的项目主要是自动化任务。 我的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'

问题:

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

我的错误想法?

  1. defer任务在后台运行,因为它不是用户访问网站时发送请求的东西。因此,它们不会被视为请求。

  2. 我将cronjobs_n分解为不同的小任务,因为我认为这可以减少每个cronjobs_n的运行时间,从而减少实例的内存消耗。

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

  1. 是否将延迟任务计为请求? 1分钟内有多少个请求?
    • mycronjob_n的40个请求 或
    • 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 USD。每月40美元,如果我选择Heroku,Digital Ocean,也许我可以获得更好的服务器?你这样认为吗?

1 个答案:

答案 0 :(得分:2)

  1. 是的,任务队列请求(包括延迟的)也是请求,它们可以比用户请求运行更长的时间。他们需要实例来为其服务,这算作实例时间。由于您每分钟至少有一个cron作业运行-您将没有15分钟的空闲时间间隔来关闭实例-因此,您至少需要一直 个实例运行。如果您使用F1 / B1以外的任何实例类-您将超出免费实例小时配额。请参阅Standard environment instances帐单。

  2. 您似乎给人一种印象,即请求数量是导致成本上升的原因。不是,至少不是直接。罪魁祸首很可能是正在运行的实例数。

  

如果3-4个实例不能处理4000个请求,为什么GAE不添加10个   最多增加20个F1实例,然后在闲置时关闭?

GAE最有可能做到这一点-产生多个实例。但是您每分钟都会不断地发送请求,它们不会足够长时间地进入空闲状态,因此它们不会关闭。哪个实例使您的工作时间延长了?

您可以执行以下两项操作:

您还应该仔细阅读How Instances are Managed

  1. 是的,无论实例类如何,您只需支付 exceeds 的免费配额。无论如何,帐单都以F1 / B1单位计费-通过上面的帐单链接:
  

重要:按实例小时数计费时,您在计费订单项中将看不到任何实例类。相反,您将   查看实例时间的适当倍数。例如,如果您   使用F4实例一小时,您不会看到列出的“ F4”,但是   请按F1费率查看四个实例小时的计费。

关于RAM的使用,将cron作业拆分为多个任务不一定有帮助,请参见App Engine Deferred: Tracking Down Memory Leaks

最后,将GAE与Heroku进行比较的成本,Digital Ocean并不是苹果对苹果的比较:GAE是PaaS,而不是IaaS,恕我直言,IMHO的价格会更高。选择一个或另一个完全取决于您。