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
Welche Version von Image Magick verwenden Sie? –