如何查找并修复 Rails 和 Couchbase 内存泄漏

How to find and fix a Rails and Couchbase memory leak

提问人:Lazarus Lazaridis 提问时间:11/3/2014 最后编辑:the Tin ManLazarus Lazaridis 更新时间:2/27/2023 访问量:1184

问:

我有以下测试代码:

def loop_bucket_gets
    bucket = Couchbase::Bucket.new({:node_list => ['xxx.xxx.xxx.xxx:8091', 'yyy.yyy.yyy.yyy:8091'],
                                    :bucket => 'Foo',
                                    :pool => 'default',
                                    :expires_in => 1.day,
                                    :default_format => :marshal,
                                    :key_prefix => '_foo'
                                   })

    i = 0
    loop do
      begin
        i += 1
        bucket.get "ABC#{i}"
      rescue ::Couchbase::Error::Base => e
        nil
      end
    end
  end

当我在 Rails 控制台中执行此操作时,内存泄漏。

我正在使用:

  • Couchbase 1.3.10 宝石
  • 库 2.4.3

我在 https://www.couchbase.com/issues/browse/RCBC-187 上创建了一个问题

Ruby-on-Rails Ruby 缓存 沙发底座

评论

4赞 Alejandro Babio 11/3/2014
我认为您需要循环的结束条件。
0赞 Lazarus Lazaridis 11/3/2014
@AlejandroBabio 这是测试代码,我用它来确认内存不断增长,因此我不能停止循环。
1赞 Dmitry Polushkin 7/19/2015
看这里:github.com/couchbase/couchbase-ruby-client/blob/...
9赞 Dmitry Polushkin 7/19/2015
简单,无需任何调试器或 IDE:github.com/couchbase/couchbase-ruby-client/blob/... ctx 已初始化、使用,但毕竟没有清除。
1赞 Pascal 1/15/2023
你怎么知道它泄漏内存?

答:

-1赞 Sachin Singh 2/27/2023 #1

您的循环中没有终止条件,因此它将永远运行并导致您提到的内存问题。您应该在循环中添加相关条件,并测试它是否解决了问题。break

def loop_bucket_gets
    bucket = Couchbase::Bucket.new({:node_list => ['xxx.xxx.xxx.xxx:8091', 'yyy.yyy.yyy.yyy:8091'],
                                    :bucket => 'Foo',
                                    :pool => 'default',
                                    :expires_in => 1.day,
                                    :default_format => :marshal,
                                    :key_prefix => '_foo'
                                   })

    i = 0
    loop do
      begin
        i += 1
        bucket.get "ABC#{i}"
        break if YOUR_TERMINATING_CONDITION
      rescue ::Couchbase::Error::Base => e
        nil
      end
    end
  end