Ruby on Railsを使用して小さなWebアプリを作成しました。その主な目的は、xmlからの結果をアップロード、保存、および表示することです(ファイルは最大数MBになる場合があります)。約2実行した後数ヶ月間、雑種のプロセスが約4GBのメモリを使用していることに気づきました。デバッグについていくつかの調査を行いましたRubyメモリリークで多くを見つけることができませんでした。そのため、2つの質問があります。
Railsでメモリリークを見つけるためのヒント:
1つ目は、ObjectSpace内のオブジェクトによるメモリ使用量のグラフィカルな調査です。
最後の2つは、メモリ使用量を増大させている特定の使用パターンを特定するのに役立ち、そこから作業できます。
特定のコーディングパターンについては、経験から、ファイルIO、画像処理、大量の文字列の処理などを処理しているものをすべて監視する必要があります。
あなたが最も適切なXMLライブラリを使用しているかどうかを確認します-ReXMLは遅いことが知られており、リークしやすいと考えられています(その証拠はありません!)。また、高価な操作を メモ化 できるかどうかも確認してください。
各リクエストの前後にメモリ使用量を記録する非常にシンプルな方法(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
次に、上部を監視し、リクエストによってメモリ使用量が急増した場合は、ログを確認します。もちろん、これは小さなジャンプではなく大きなジャンプでメモリリークが発生する場合にのみ役立ちます。
メモリリークは現在の問題です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
Ruby-prof を見てください。
これで、次のコマンドを実行して、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に相当するツールはありません。
これらの宝石は私のために働きました:
RailsログにプロセスIDとメモリ使用量を追加します。メモリリークの追跡に最適です。
ログパーサーは、大幅に増加するアクションを特定しますVMヒープサイズ