Nous avons un serveur avec 10 instances mongrel_cluster en cours d'exécution avec apache en face d'eux, et de temps en temps un ou plusieurs d'entre eux se bloquer. Aucune activité n'est visible dans la base de données (nous utilisons des sessions activerecord). Mysql avec des tables innodb. Le statut show innodb ne montre aucun verrou. show liste de processus ne montre rien.Mongrel se bloque avec 100% CPU/EBADF (descripteur de fichier Bad)
Le serveur est linux debian 4.0
Ruby est: Ruby 1.8.6 (2008-03-03 patchlevel 114) [i486-linux]
Rails est: Rails 1.1.2 (oui, tout à fait vieux)
Nous utilisons le connecteur natif MySQL (gem install mysql)
"strace -p PID" donne ce qui suit dans une boucle pour le processus bâtarde accroché:
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
...
J'utilisé lsof et a constaté que le processus utilisé 67 descripteurs de fichiers (lsof -p PID | wc -l)
est-il une autre façon que je peux déboguer ce, afin que je puisse par exemple déterminer quel descripteur de fichier est "mauvais"? D'autres informations ou suggestions? Quelqu'un d'autre a vu ça?
Le site est assez utilisé, mais pas trop, les charges moyennes sont généralement autour de 0,3.
Quelques informations supplémentaires. J'ai installé mongrelproctitle pour montrer ce que les processus bloqués faisaient, et il semble qu'ils sont suspendus sur une méthode qui affiche des images en utilisant file_column/images de la base de données/ rmagick pour redimensionner et rendre les images en niveaux de gris.
Non concluant le problème est ici, mais c'est un soupçon. Y at-il quelque chose qui cloche manifestement avec ce qui suit? La méthode affiche une image statique si la commande ne contient pas d'image, sinon l'image est redimensionnée à partir de la commande. Le contenu du cache est tel que l'image est mise à jour dans le navigateur à chaque fois. L'image est insérée dans la page avec une étiquette d'image normale.
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
est ici la sortie lsof si quelqu'un peut trouver des problèmes en elle. Ne pas savoir comment il formate dans ce message ...
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
J'ai installé Monit pour surveiller le serveur. Il n'y a pas encore de redémarrage automatique en raison du problème de fichier PID, mais peut-être que je vais obtenir la dernière version qui supporte la suppression des fichiers PID périmés.
Ce serait bien que pour réellement résoudre le problème, parce que quelqu'un va se déconnecte etc si le serveur doit être redémarré tout le temps (~ 10 fois par jour)
Les batards-processus ne prennent pas grand quantité de mémoire lorsque cela se produit, et la machine n'échange même pas, donc ce n'est probablement pas une fuite de mémoire.
total used free shared buffers cached
Mem: 4152796 4083000 69796 0 616624 2613364
-/+ buffers/cache: 853012 3299784
Swap: 1999992 52 1999940
Quelle version d'Image Magick utilisez-vous? –