2012-04-18 3 views
4

Je travaille dans cette base de code relativement grande où je vois une fuite de descripteur de fichier et les processus commencent à se plaindre qu'ils ne sont pas capables d'ouvrir des fichiers après avoir exécuté certains programmes.Déboguer le descripteur de fichier fuite (dans le noyau?)

Bien que cela se produit au bout de 6 jours, je suis en mesure de reproduire le problème en 3-4 heures en réduisant la valeur dans/proc/sys/fs/file-max à 9000.

Il y a beaucoup de processus en cours d'exécution à n'importe quel moment. J'ai été en mesure d'identifier quelques processus qui pourraient causer la fuite. Cependant, je ne vois aucune fuite de descripteur de fichier via lsof ou via/proc // fd.

Si je tue les processus (ils communiquent entre eux) que je suspecte de fuite, la fuite disparaît. FDs sont libérés.

cat/proc/sys/fs/fichier-nr dans une boucle while (1) montre la fuite. Cependant, je ne vois aucune fuite dans aucun processus.

Voici un script que j'ai écrit pour détecter cette fuite se produit:

#!/bin/bash 

if [ "$#" != "2" ];then 
    name=`basename $0` 
    echo "Usage : $name <threshold for number of pids> <check_interval>" 
    exit 1 
fi 


fd_threshold=$1 
check_interval=$2 
total_num_desc=0 
touch pid_monitor.txt 
nowdate=`date` 
echo "=================================================================================================================================" >> pid_monitor.txt 
echo "****************************************MONITORING STARTS AT $nowdate***************************************************" >> pid_monitor.txt 

while [ 1 ] 
do 
    for x in `ps -ef | awk '{ print $2 }'` 
    do 
     if [ "$x" != "PID" ];then 
      num_fd=`ls -l /proc/$x/fd 2>/dev/null | wc -l` 
      pname=`cat /proc/$x/cmdline 2> /dev/null` 
      total_num_desc=`expr $total_num_desc + $num_fd` 
      if [ $num_fd -gt $fd_threshold ]; then 
       echo "Proces name $pname($x) and number of open descriptor = $num_fd" >> pid_monitor.txt 
      fi 
     fi 
    done 
    total_nr_desc=`cat /proc/sys/fs/file-nr` 
    lsof_desc=`lsof | wc -l` 
    nowdate=`date` 
    echo "$nowdate : Total number of open file descriptor = $total_num_desc lsof desc: = $lsof_desc file-nr descriptor = $total_nr_desc" >> pid_monitor.txt 
    total_num_desc=0 
    sleep $2 
done 

./monitor.fd.sh 500 2 & de pid_monitor.txt de queue

Comme je l'ai mentionné plus tôt, Je ne vois aucune fuite dans/proc // fd pour tout, mais une fuite est en train de se produire et le système manque de descripteurs de fichiers.

Je soupçonne que quelque chose dans le noyau fuit. Version du noyau Linux 2.6.23.

Mes questions sont suivantes:

  1. Will 'ls/proc // fd descripteurs de liste Afficher pour toute bibliothèque liée au processus avec pid. Si non, comment puis-je déterminer quand il y a une fuite dans la bibliothèque que je suis lié à. Comment puis-je confirmer que la fuite est dans l'espace utilisateur par rapport au noyau.

  2. Si la fuite est dans le noyau, quels outils puis-je utiliser pour déboguer?

  3. Tout autre conseil que vous pouvez me donner.

Merci d'avoir parcouru la question patiemment.

J'apprécierais vraiment toute aide.

+0

1. Oui, il affichera tous les descripteurs, y compris ceux des bibliothèques liées. 2. Il est très peu probable que fd faille dans le noyau. 3. regardez 2. 4. On ne sait pas très bien quel est le problème, pourriez-vous fournir plus de détails? Quel syscall échoue, avec quelle erreur? – strkol

Répondre

0

Quels processus commencent à se plaindre? Et quelle est l'erreur que vous voyez? Quelle est la sortie de votre script de surveillance?

Pour ouvrir un fichier, vous avez besoin de deux choses, d'un descripteur de fichier et d'une description du fichier struct file. Le descripteur de fichier est ce que userspace utilise, à l'intérieur du noyau il est utilisé pour rechercher le struct file. Ce n'est pas clair pour moi que vous fuyez.

0

Trouvé la solution au problème.

Une connexion de mémoire partagée se produisait dans certaines fonctions et cette fonction était appelée toutes les 30 secondes. L'attachement à la mémoire partagée ne s'est jamais détaché, d'où la fuite du descripteur.Je suppose que/proc // fd n'affiche pas la mémoire partagée en tant que descripteur. Par conséquent, mon script n'a pas pu mettre en cache le processus qui fuit le descripteur.

Questions connexes