web-dev-qa-db-ja.com

ruby / Ruby on Railsメモリリーク検出

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

  • Ruby/railsのメモリリークを見つけるために使用できる優れたツールはありますか?
  • Rubyでメモリリークの原因となるコーディングパターンの種類は何ですか?
45
Josh Moore

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

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

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

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

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

39
Dave Nolan

各リクエストの前後にメモリ使用量を記録する非常にシンプルな方法(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

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

18

メモリリークは現在の問題ですRuby実装はこれについて始めるのに良い場所です: http://whytheluckystiff.net/articles/theFullyUpturnedBin.html なぜtheluckystiffウェブサイトはもう存在しませんが、元の記事はここにあります: https://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html

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

多分あなたは乗客(mod_Rails)を試してみることができます https://web.archive.org/web/20130901072209/http://nubyonrails.com/articles/ask-your-doctor-about-mod_Rails

6
Jean

Ruby-prof を見てください。

5
Vetal4eg

これで、次のコマンドを実行して、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

ナイスグラフを取得します。

Jrubyに切り替えて Eclipse Memory Analyzer を使用します。現在、Rubyに相当するツールはありません。

2
kohlerm

これらの宝石は私のために働きました:

MemoryLogic

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

インク

ログパーサーは、大幅に増加するアクションを特定しますVMヒープサイズ