【问题标题】:Elastic Beanstalk environment degrading due to high CPU utilisation由于 CPU 利用率高,Elastic Beanstalk 环境降级
【发布时间】:2020-11-20 22:44:33
【问题描述】:

我正在尝试将一些谷歌广告帐户同步到我的系统中。

此过程从 2017 年 1 月 1 日到最后日期的谷歌广告帐户中提取数据。

查询单个日期,在 for 循环中处理它以生成正确的对象

正在插入数据库。

还尝试使用负载平衡器。但降级发生在一个实例中。

代码

查询谷歌广告数据

var difference = dateDiffInDays(new Date(2017, 0, 1), new Date());

// getting last N days
days = LastNDays(difference + 1) 

// making array of date ranges
var result = days.chunk(20); 

// querying google ads data 
    for (var value of result) {
        const list = await customer.report({
            entity: 'keyword_view',
            attributes: adAttributes,
            segments: ['segments.date'],
            from_date: value[0],
            to_date: value[value.length - 1]
        })
        await saveKeywordsData(list, value[value.length - 1])
    }

我认为问题在于以下功能。

因为上述查询的输出超过 5000 或 6000(对于单个日期。这里调用日期为 2017-01-01)。

因此,在一段时间内连续处理超过 5000 个数据时会导致 CPU 使用率很高。

函数 saveKeywordsData

async function saveKeywordsData(list, cronUntill) {
        let metricsArray = []
        for await (let element of list) {
            let metrics = element.metrics
            metrics.criterion_id = element.ad_group_criterion.criterion_id
            metrics.keyword = element.ad_group_criterion.keyword.text
            metrics.accId = accId
            metrics.agencyId = agencyId
            metrics.accountMId = accountMId
            metrics.date = element.segments.date
            metrics.dateTime = new Date(element.segments.date)
            metrics.createdAt = new Date()
            metricsArray.push(metrics);
        }

        // metricsArray length may be more than 5000 for each loop 
        await chunkInsertion(metricsArray, 'keywords')
        return 1;
    };

函数块插入

    async function chunkInsertion(metricsArray, type) {
    let model
    if (type == 'ads')
        model = app.models.googleAdsInsights
    else
        model = app.models.googleAdsAuctionInsights
    var data = metricsArray.chunk(50);
    for (let item of data) {
        await model.create(item)
    }
    return 1
}

【问题讨论】:

  • 你能把那些繁重的处理应用程序卸载到专用的工作环境吗?
  • 让我看看这个方法。 U的意思是,将web服务器环境更改为worker环境?
  • 您可以为您的应用程序的网站部分保留 Web 服务器环境。 Worker env 将用于处理那些长时间运行的 heave 查询。这将需要对您的架构进行一些更改,因为 Web 和工作环境需要交互。如果您经常运行如此繁重的查询,可能更容易转移到更好的实例并首先检查这是否有帮助?
  • 我认为这个 for 循环会导致这个问题。
  • @Marcin 你能解释一下怎么做吗?

标签: javascript node.js amazon-web-services amazon-elastic-beanstalk cpu-usage


【解决方案1】:

根据评论。

我只能提供关于如何使用工作环境的一般性描述。具体实现细节视具体情况而定。

EB worker environments 用于执行长时间运行的任务。对于您的用例,这可能是一个很好的解决方案,因为您可以将 Web 环境与那些提升 CPU 的繁重处理工作分离。

在这种情况下,您的 Web 环境将负责启动作业并收集结果。它不会执行实际的处理,这将由专用的工作环境处理。

工作环境公开了一个 SQS 队列。这与为您提供网站 URL 的网络环境不同。从工作环境中,您只能获得 SQS 队列端点。端点用于向工作人员提交作业。您的工作应用程序将从队列中接收作业并独立于 Web 环境执行查询。

可以通过多种方式处理结果。一种方法是让工人将结果写入,例如一个 DynamoDB。在这种情况下,Web 环境会不时向数据库查询结果以检查它们何时可用。另一种方法是让您的 Web 应用程序公开一个专用的 url 端点,该端点将由工作人员调用以发出作业完成的信号。

这就是您通常将 Web 环境与长时间运行的 CPU 或内存密集型任务分离的方式。但这需要更改您的应用程序的工作方式并开发要在 EB 工作程序环境中部署的工作程序应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2018-11-15
    • 2015-07-20
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多