【问题标题】:Memory Leak Rails + Sidekiq + Heroku + jsonb内存泄漏 Rails + Sidekiq + Heroku + jsonb
【发布时间】:2018-03-08 23:14:15
【问题描述】:

我目前正在获取过去两年某个货币对的大量加密小时价格。我已经同时使用 Sidekiq 来处理多个硬币。

问题是当我使用 jsonb 来存储信息时,我怀疑它会导致大的内存泄漏。但我可能错了,我的 Active Record 查询没有优化。

结果是我的 Heroku Workers 不断超过配额并关闭。

def get_2_years_of_btc_data(coin_id)
        begin
            time_batches = [1451606400,1458810000,1466013600,1473217200,1480420800,1487624400,1494828000,1502031600,1509235200,1516438800,1523642400]
            time_batches.each do |time| 
                 sync_hourly_btc_data(coin_id,time)                 
            end
        rescue => e
            #ScrapeLog.create(error: e.message, process: "Cryptocompare - Sync Coin Prices", resource: "coin", resource_id: coin_id)
        end
    end

def sync_hourly_btc_data(coin_id,floored_timestamp)
    coin = Coin.find(coin_id)
    snap = coin.snap        
    response = HTTParty.get("https://min-api.cryptocompare.com/data/histohour?fsym=#{coin.ticker}&aggregate=1&tsym=BTC&limit=2000&toTs=#{floored_timestamp}")
    json = JSON.parse(response.body)
    data = json["Data"]
    if snap.btc_counter_cache < 1
        snap.to_btc = data
    else
        new_data = data.select {|data| data["time"] > snap.btc_to_ts} 
        snap.to_btc = snap.to_btc + new_data
    end
    snap.btc_from_ts = snap.to_btc.first["time"]
    snap.btc_to_ts = snap.to_btc.last["time"]
    snap.coin.real_price_btc = snap.to_btc.last["close"]
    snap.btc_counter_cache = snap.to_btc.size
    snap.save
end

Snaps是存储每个硬币价格信息的表,to_btc是存储所有数据的jsonb列。

我需要帮助了解这是否是一个常见的 jsonb 问题,当它变大或我的 Active Record 查询效率低下时。

谢谢!

【问题讨论】:

  • 嘿 T。您是否测量过响应返回需要多长时间,以及返回的数据实际有多大?还有,这是BG的工作吗?这个批量大小是 11 个不同的请求,Heroku 警告说所有花费超过 500 毫秒的请求都应该在 BG 作业中。

标签: ruby-on-rails json heroku memory-leaks sidekiq


【解决方案1】:

看起来 jsonb 不是这里的问题。我假设提供的代码是实际的工作人员,所以我在这里的第一遍是将工作人员 per 时间批处理排队。您当前执行此操作的方式似乎必须将所有 API 响应保存在内存中。

因此,如果您将每个时间批次的作业/工作人员排入队列,则可以单独处理每个响应 - 考虑到工作人员之间的一些退避(排入队列以 2 分钟或其他时间运行),您应该没问题。

我想是数据那么大,你正在做的选择遍历也相当昂贵

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2012-11-28
    • 2013-03-10
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多