45

Ruby on Rails を使用して小さな Web アプリを作成しました。その主な目的は、xml (ファイルは最大数 MB になる可能性があります) からの結果をアップロード、保存、および表示することです。約 2 か月実行した後、mongrel プロセスが約 4GB のメモリを使用していることに気付きました。ruby のメモリ リークのデバッグについて調査しましたが、多くは見つかりませんでした。そこで、質問が 2 つあります。

  • Ruby/Rails でメモリ リークを見つけるために使用できる優れたツールはありますか?
  • Rubyでメモリリークを引き起こすコーディングパターンは何ですか?
4

7 に答える 7

39

Rails でメモリ リークを見つけるためのヒント:

1 つ目は、ObjectSpace 内のオブジェクトによるメモリ使用量のグラフィカルな調査です。

最後の 2 つは、メモリ使用量を増大させている特定の使用パターンを特定するのに役立ち、そこから作業を進めることができます。

特定のコーディング パターンに関しては、経験上、ファイル io、画像処理、大量の文字列の操作などを処理するものはすべて監視する必要があります。

最も適切な XML ライブラリを使用しているかどうかを確認します。ReXML は遅いことが知られており、漏れやすいと考えられています (その証拠はありません!)。また、コストのかかる操作をメモできるかどうかも確認してください。

于 2008-10-02T11:53:53.007 に答える
20

各リクエストの後または前にメモリ使用量をログに記録するための非常に簡単な方法 (Linux のみ)。

#Put this in applictation_controller.rb
before_filter :log_ram # or use after_filter
def log_ram
  logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
end

スクリプト/コンソールをロードし、最初にステートメントを試して、ボックスで動作することを確認することをお勧めします。

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

次に、トップを監視します。リクエストによってメモリ使用量が急増した場合は、ログを確認してください。もちろん、これは小さな増分ではなく大きなジャンプで発生するメモリ リークがある場合にのみ役立ちます。

于 2008-10-02T19:46:52.057 に答える
6

メモリ リークは、現在の ruby​​ 実装の問題です。これについて始めるのに適した場所は http://whytheluckystiff.net/articles/theFullyUpturnedBin.htmlです。 /viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

実行時間の長い Ruby プロセスの問題に関するより具体的な回答については、 https://just.do/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/を参照してください。

多分あなたはパッセンジャー(mod_rails)を試してみることができます

于 2008-10-02T10:35:02.197 に答える
5

ruby-profを見てください。

于 2012-08-31T06:42:55.653 に答える
2

jruby に切り替えて、Eclipse Memory Analyzerを使用します。現時点では、Ruby 用の同等のツールはありません。

于 2008-10-10T15:35:45.443 に答える
2

これで、次を実行して、R が読み取れる形式でメモリを取得できます。ログ行が次のようになっていると想定しています。

1234567890 RAM USAGE: 27456K

これを実行します (またはスイートに変更します):

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

次に、これを実行できます:

#!/bin/sh
rm -f mem.png
R --vanilla --no-save --slave <<RSCRIPT
    lst <- read.table("mem.log")
    attach(lst)
    m = memory / 1024.0
    summary(m)
    png(filename="mem.png", width=1024)
    plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory")
RSCRIPT

そして素敵なグラフを取得します。

于 2010-03-04T08:32:25.353 に答える
0

これらの宝石は私のために働いた:

メモリロジック

Rails ログにプロセス ID とメモリ使用量を追加します。メモリ リークの追跡に最適です。

オーインク

VM ヒープ サイズを大幅に増加させるアクションを識別するためのログ パーサー

于 2014-03-17T21:03:00.617 に答える