2008-09-16 8 views
1

私たちは10個のmongrel_clusterインスタンスを実行しているサーバを持っていて、その前にapache のapacheを持っています。 データベースにアクティビティがありません(activerecordセッションを使用しています)。 innodbテーブルを持つMysql。 show innodb statusにロックがないことを示します。 show processlistには何も表示されません。ルビー1.8.6(2008-03-03パッチレベル114)のi486-のLinux]100%CPU/EBADF(悪いファイル記述子)でMongrelがハングします

レールである:かなりレール1.1.2(はい、

サーバは、LinuxのDebian 4.0

Rubyがあります古い)

私たちは、 "PID -p straceの")(

を宝石MySQLをインストールし、ネイティブのMySQLコネクタを使用しているハング雑種 プロセスのループに次のようになります:

gettimeofday({1219834026, 235289}, NULL) = 0 
select(4, [3], [0], [], {0, 905241}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235477}, NULL) = 0 
select(4, [3], [0], [], {0, 905053}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235654}, NULL) = 0 
select(4, [3], [0], [], {0, 904875}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 235829}, NULL) = 0 
select(4, [3], [0], [], {0, 904700}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236017}, NULL) = 0 
select(4, [3], [0], [], {0, 904513}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236192}, NULL) = 0 
select(4, [3], [0], [], {0, 904338}) = -1 EBADF (Bad file descriptor) 
gettimeofday({1219834026, 236367}, NULL) = 0 
... 

私はlsofを使用して、プロセスが67のファイル記述子を使用することを見出した(-p PID lsofを|トイレ-lを)

私は例 のために決定することができるように、私は、これをデバッグすることができ、他の方法はありますどのファイル記述子が「不良」ですか? 他の情報や提案はありますか?他に誰もこれを見た?

このサイトはかなり使用されていますが、あまりにもそうではありません。負荷平均は通常約 0.3です。


追加情報私はmongrelproctitleをインストールして ハングプロセスが何をしていたのかを表示しました。そして、 のファイル_列/画像を使用して画像を表示する方法/ rmagickを使って画像をグレースケールにしています。

ここで問題があるのは間違いですが、疑問です。 明らかに次の点に間違いがありますか?メソッド は、オーダーに画像が含まれていない場合は静止画像を、それ以外の場合は の画像を表示します。キャッシュの内容は、毎回ブラウザで画像が に更新されるようにするためです。画像は通常の画像タグ付きの ページに挿入されます。

コード:誰もがそれですべての問題を見つけることができればここで

def preview_image 
    @order = session[:order] 
    if @order.image.nil? 
     @headers['Pragma'] = 'no-cache' 
     @headers['Cache-Control'] = 'no-cache, must-revalidate' 
     send_data(EMPTY_PIC.to_blob, :filename => "img.jpg", :type => 
"image/jpeg", :disposition => "inline") 
     else 
     @pic = Image.read(@order.image)[0] 
     if (@order.crop) 
     @pic.crop!(@order.crop[:x1].to_i, @order.crop[:y1].to_i, 
@order.crop[:width].to_i, @order.crop[:height].to_i, true) 
     end 
     @pic.resize!(103,130) 
     @pic = @pic.quantize(256, Magick::GRAYColorspace) 
     @headers['Pragma'] = 'no-cache' 
     @headers['Cache-Control'] = 'no-cache, must-revalidate' 
     send_data(@pic.to_blob, :filename => "img.jpg", :type => 
"image/jpeg", :disposition => "inline") 
    end 
    end 

はlsofの出力です。 は、私は、サーバーを監視するMONITをインストールしている

lsof: WARNING: can't stat() ext3 file system /dev/.static/dev 
     Output information may be incomplete. 
COMMAND  PID USER FD TYPE  DEVICE  SIZE  NODE NAME 
mongrel_r 11628 username cwd DIR  9,2  4096 1870688 
/home/domains/example.com/usernameOrder/releases/20080831121802 
mongrel_r 11628 username rtd DIR  9,1  4096  2/
mongrel_r 11628 username txt REG  9,1  3564 167172 
/usr/bin/ruby1.8 
mongrel_r 11628 username mem REG  0,0     0 
[heap] (stat: No such file or directory) 
mongrel_r 11628 username DEL REG  0,8   15560245 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560242 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560602 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560601 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560684 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560683 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560685 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560568 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560607 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560569 
/dev/zero 
mongrel_r 11628 username mem REG  9,1 1933648 456972 
/usr/lib/libmysqlclient.so.15.0.0 
mongrel_r 11628 username DEL REG  0,8   15442414 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560546 
/dev/zero 
mongrel_r 11628 username mem REG  9,1  67408 457393 
/lib/i686/cmov/libresolv-2.7.so 
mongrel_r 11628 username mem REG  9,1  17884 457386 
/lib/i686/cmov/libnss_dns-2.7.so 
mongrel_r 11628 username DEL REG  0,8   15560541 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560246 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560693 
/dev/zero 
mongrel_r 11628 username DEL REG  0,8   15560608 
/dev/zero 
mongrel_r 11628 username mem REG  9,1  25700 164963 
/usr/lib/gconv/gconv-modules.cache 
mongrel_r 11628 username mem REG  9,1  83708 457384 
/lib/i686/cmov/libnsl-2.7.so 
mongrel_r 11628 username mem REG  9,1 140602 506903 
/var/lib/gems/1.8/gems/mysql-2.7/lib/mysql.so 
mongrel_r 11628 username mem REG  9,1 1282816 180935 
... 
mongrel_r 11628 username 1w REG  9,2 462923 1575329 
/home/domains/example.com/usernameOrder/shared/log/mongrel.8001.log 
mongrel_r 11628 username 2w REG  9,2 462923 1575329 
/home/domains/example.com/usernameOrder/shared/log/mongrel.8001.log 
mongrel_r 11628 username 3u IPv4 15442350    TCP 
localhost:8001 (LISTEN) 
mongrel_r 11628 username 4w REG  9,2 118943548 1575355 
/home/domains/example.com/usernameOrder/shared/log/production.log 
mongrel_r 11628 username 5u REG  9,1 145306 234226 
/tmp/mongrel.11628.0 (deleted) 
mongrel_r 11628 username 7u unix 0xc3c12480   15442417 
socket 
mongrel_r 11628 username 11u REG  9,1  50 234180 
/tmp/CGI.11628.2 
mongrel_r 11628 username 12u REG  9,1  26228 234227 
/tmp/CGI.11628.3 

...それは、このメッセージにフォーマットする方法がわかりません。 PIDファイルの問題のために自動再起動はまだありませんが、古くなったPIDファイルの削除をサポートする最新版を入手することができます。
サーバーを常時再起動する必要がある場合(1日に10回)、誰かが切断などを受けるため、実際に問題を解決するのはいいでしょう。

mongrelプロセスには大きなこれが起こっているときのメモリ量と、マシンがスワップしていないことがあるので、おそらくメモリリークではありません。本展開のRailsアプリケーションでの

   total  used  free  shared buffers  cached 
Mem:  4152796 4083000  69796   0  616624 2613364 
-/+ buffers/cache:  853012 3299784 
Swap:  1999992   52 1999940 
+0

どのバージョンのImage Magickをお使いですか? –

答えて

1

章6.3(バイステップガイドステップ)のインストールおよびLinux上の監視ユーティリティMONITを設定し、あなたの雑種を監視するためにそれを使用しての良い部分を持っています。彼らはあなたの雑種が失敗したときに再起動することができます。

古いバージョンのMongrelは、ディスク上に重複するPIDファイルが存在するため、再起動に問題がありました。より新しいバージョンでは、--cleanオプションがサポートされています。このオプションは、残っているPIDファイルが存在する場合は削除します。したがって、Mongrelを古いPIDファイルの問題を回避するためにサポートするバージョンにアップグレードする必要があります.Monitだけではこれを行うことはできません。

2

ImageScienceを使用すると、RMagickは大量のメモリとロックを漏らすことが知られています。

+0

rmagickを置き換えることは、実際にはこのプロジェクトのオプションではありません。さらに、私は生産で稼働していない限り、これを再現することができないので、rmagickの開発者は助けられません(私は尋ねてみた)。メモリリークはありませんが、ロックのみ(これは他の何らかの原因による可能性があります) – Frontline