PostgreSQL查询吞噬了VM

时间:2012-07-12 07:34:37

标签: ruby ruby-on-rails-3 memory-leaks delayed-job rails-postgresql

[Prescript:我知道这里没有什么特别针对Delayed :: Job。但它有助于建立背景。]

更新

我认为SQL查询不是垃圾回收。我的应用程序生成许多大型SQL插入/更新操作(每个160K字节,大约每秒1个)并通过以下方式将它们发送到PostgreSQL:

ActiveRecord::Base.connection.execute(my_large_query)

当我执行这些数据库操作时,我的应用程序会慢慢增长而不受限制。当我删除数据库操作(但在我的应用程序中执行所有其他功能)时,膨胀停止。

那么:关于为什么会发生这种情况,如何确定它,或者如何让它停止的任何想法?

原始问题

我延迟了从网上篡改数据并在PostgreSQL数据库中创建记录的任务。他们似乎工作正常,但他们从vmemsize = 100M开始,并在十分钟内批量达到vmemsize = 500M并且不断增长。当VM耗尽时,带有8G RAM的MacBook Pro开始抖动。

如何找到记忆的去向?

在您推荐我关于该主题的其他SO帖子之前:

我已将以下内容添加到我的#after(作业)方法中:

def after(job)
  clss = [Object, String, Array, Hash, ActiveRecord::Base, ActiveRecord::Relation]
  clss.each {|cls| object_report(cls, " pre-gc")}
  ObjectSpace.each_object(ActiveRecord::Relation).each(&:reset)
  GC.start
  clss.each {|cls| object_report(cls, "post-gc")}
end

def object_report(cls, msg)
  log(sprintf("%s: %9d %s", msg, ObjectSpace.each_object(cls).count, cls))
end

它报告基本类的用法,显式重置ActiveRecord :: Relation对象(由this SO post建议),显式执行GC(由this SO post建议),并报告有多少对象/字符串/数组/哈希等(如this SO post所示)。值得一提的是,这些课程都没有显着增长。 (还有其他课程我应该看一下吗?但是这不会反映在对象的数量上吗?)

我无法使用memprof,因为我正在运行Ruby 1.9。

如果我在Linux上运行,还有其他工具可供我考虑,但我使用的是OS X.

1 个答案:

答案 0 :(得分:1)

更新

我担心这一切都是红色的鲱鱼:跑得足够长,每个红宝石的工作都增长到大约1.2GB的vmsize(是的,那么大,但按今天的标准来说并不大),然后收缩回来低至850MB,然后在这两个值之间徘徊而不会继续变大。

我真正的问题是我试图在我的机器上运行超过四个这样的进程,内存为8GB,这填补了所有可用内存,然后进行了交换缺氧。仅运行四个进程几乎会填满可用内存,因此系统无法开始交换。

更新2

没有,仍然是一个问题 - 我没有让工作运行得足够长:工作岗位不断增长(虽然缓慢)。即使只运行两个外部作业,最终也会占用所有VM,我的机器也会开始抖动。

我尝试运行处于生产模式(认为开发模式可能会缓存未被释放的内容),但它没有产生任何明显的差异。