2008-09-16 5 views
1

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 
+0

Quelle version d'Image Magick utilisez-vous? –

Répondre

1

chapitre 6.3 dans le livre de déploiement d'applications Rails (Un guide étape par étape) a une bonne section sur l'installation et la configuration de l'utilitaire de surveillance Monit sur Linux et l'utiliser pour contrôler vos roquets. Il peut redémarrer vos bâtards quand ils échouent.

Les anciennes versions de Mongrel ont eu des problèmes de redémarrage en raison d'un fichier PID en double existant sur le disque. Les versions plus récentes prennent en charge l'option --clean qui supprimera les fichiers PID restants, s'ils existent. Donc, vous devez mettre à jour Mongrel vers une version qui supporte --clean pour contourner le problème de fichier PID périmé, Monit seul ne peut pas le faire.

2

Envisagez d'utiliser ImageScience, RMagick est connu pour ses fuites massives de mémoire et de verrouillage.

+0

Remplacer rmagick n'est pas vraiment une option pour ce projet. D'ailleurs, je ne peux pas reproduire ceci à moins que ce soit en cours de production, donc les développeurs de rmagick ne peuvent pas aider (j'ai essayé de demander). Et il n'y a pas de fuite de mémoire, mais uniquement le verrouillage (qui peut être dû à autre chose) – Frontline

Questions connexes