2008-09-16 7 views
1

Wir haben einen Server mit 10 laufenden mongrel_cluster Instanzen mit Apache vor ihnen, und hin und wieder eine oder einige von ihnen hängen. In der Datenbank wird keine Aktivität angezeigt (wir verwenden ActiveRecord-Sitzungen). Mysql mit innodb Tabellen. show innodb status zeigt keine Sperren. zeigen Prozessliste zeigt nichts.Mongrel hängt mit 100% CPU/EBADF (Bad Dateideskriptor)

Der Server ist Linux Debian 4.0

Ruby ist: Rubin 1.8.6 (2008-03-03 Patchlevel 114) [i486-linux]

Rails ist: Rails 1.1.2 (ja, ganz alt)

Wir die native mySQL Connector verwenden (gem mysql)

"strace -p PID" gibt die folgende in einer Schleife für die hung Mischlings Prozess installieren:

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 
... 

I verwendet lsof und stellte fest, dass der Prozess 67 Filedeskriptoren verwendet (lsof -p PID | wc -l)

Gibt es irgendeine andere Weise, die ich diese debuggen können, so dass ich zum Beispiel könnte bestimmen Welcher Dateideskriptor ist "schlecht"? Weitere Informationen oder Vorschläge? Hat sonst jemand das gesehen?

Die Website ist ziemlich verwendet, aber nicht übermäßig so, laden Sie durchschnittlich um 0,3.


Einige zusätzliche Informationen. Ich installierte mongrelproctitle, um zu zeigen, was die hungrigen Prozesse taten, und es scheint, sie hängen an einer Methode , die Bilder mit file_column/Bilder aus der Datenbank/ rmagick zeigt, um die Größe zu ändern und die Bilder Graustufen zu machen.

Nicht schlüssig das Problem ist hier, aber es ist ein Verdacht. Gibt es etwas offensichtlich falsch mit dem folgenden? Die Methode zeigt ein statisches Bild an, wenn die Bestellung kein Bild enthält, ansonsten wird das Bild aus der Bestellung angepasst. Das Cache-Zeug ist so, dass das Bild jedes Mal im Browser aktualisiert wird. Das Bild wird in die Seite mit einem normalen Bild-Tag eingefügt.

Code:

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 

Hier ist die lsof ausgegeben, wenn jemand irgendwelche Probleme in ihm finden können. Nicht wissen, wie es in dieser Nachricht formatiert ...

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 

I monit installiert haben, den Server zu überwachen. Es gibt wegen des PID-Dateiproblems noch keine automatischen Neustarts, aber vielleicht bekomme ich die neueste Version, die das Löschen veralteter PID-Dateien unterstützt.
Es wäre allerdings tatsächlich das Problem zu beheben schön, weil jemand trennt usw. erhalten wird, wenn der Server die ganze Zeit neu gestartet werden müssen (~ 10 mal am Tag)

Die Mischlings-Prozesse übernehmen keine große Speichermenge, wenn dies geschieht, und die Maschine nicht einmal austauscht, so ist es wahrscheinlich kein Speicherleck.

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

Welche Version von Image Magick verwenden Sie? –

Antwort

1

Kapitel 6.3 in dem Buch Bereitstellen von Rails-Anwendungen (A Step by Step Guide) haben einen guten Abschnitt über die Installation und die Überwachung Dienstprogramm Monit unter Linux Konfiguration und Verwendung es Ihren Bastard zu überwachen. Es kann deine Mischlinge neu starten, wenn sie versagen.

Ältere Versionen von Mongrel hatten Schwierigkeiten, wegen einer doppelten PID-Datei, die auf der Festplatte vorhanden ist, neu zu starten. Neuere Versionen unterstützen die Option --clean, die die übrig gebliebenen PID-Dateien löscht, falls sie existieren. Du musst also Mongrel auf eine Version upgraden, die --clean unterstützt, um das veraltete PID-Dateiproblem zu umgehen, Monit alleine kann das nicht.

2

Betrachten Sie ImageScience, RMagick ist bekannt, dass große Mengen an Speicher und Sperren auslaufen.

+0

Ersetzen rmagick ist nicht wirklich eine Option für dieses Projekt. Außerdem kann ich das nicht reproduzieren, außer wenn es in der Produktion läuft, also können die rmagick Entwickler nicht helfen (ich versuchte zu fragen). Und es gibt kein Speicherleck, sondern nur Sperren (was an etwas anderem liegen kann) – Frontline

Verwandte Themen