69 votes

Cochez la case ouvrir FD limite pour un processus donné dans Linux

J'ai récemment eu un Linux processus de "fuite" des descripteurs de fichiers: Il a ouvert et de ne pas fermer correctement certains d'entre eux.

Si j'avais suivi ce, je pourrais dire - à l'avance - que le processus a atteint sa limite.

Est-il gentil, Bash\Python moyen de vérifier le FD utilisation de ratio pour un processus donné dans un système Linux Ubuntu?

EDIT:

Je sais maintenant comment vérifier le nombre de descripteurs de fichiers ouverts sont là; j'ai seulement besoin de savoir combien de descripteurs de fichiers sont autorisés pour un processus. Certains systèmes (comme Amazon EC2) n'ont pas l' /proc/pid/limits le fichier.

Merci,

Udi

136voto

caf Points 114951

Compter les entrées en /proc/<pid>/fd/. Les durs et mous et les limites de l'application de la procédure peut être trouvé, en /proc/<pid>/limits.

34voto

mark4o Points 20472

La seule interfaces fournies par le noyau Linux pour obtenir les limites de ressources sont getrlimit() et /proc/pid/limits. getrlimit() ne peut obtenir les limites des ressources du processus appelant. /proc/pid/limits vous permet d'obtenir les limites des ressources de tout processus avec le même id d'utilisateur, et est disponible sur RHEL 5.2, RHEL 4.7, Ubuntu 9.04, et toute distribution avec un 2.6.24 ou plus tard noyau.

Si vous avez besoin de soutenir les anciens systèmes Linux, alors vous aurez à faire le processus lui-même à l'appel getrlimit(). Bien sûr, la façon la plus simple de le faire est par la modification du programme ou d'une bibliothèque qu'il utilise. Si vous exécutez le programme, vous pourriez utiliser LD_PRELOAD à la charge de votre propre code dans le programme. Si rien de cela n'est possible, alors vous pouvez joindre au processus à l'aide de gdb et exécuter l'appel dans le processus. Vous pouvez également faire la même chose vous-même à l'aide de ptrace() à joindre au processus, insérer l'appel à sa mémoire, etc, cependant, c'est très compliqué à obtenir le droit et n'est pas recommandé.

Avec les privilèges appropriés, les autres manières de faire ceci impliquerait en regardant à travers la mémoire du noyau, le chargement d'un module du noyau, ou autrement modifier le noyau, mais je suis en supposant qu'ils sont hors de question.

3voto

johnjamesmiller Points 375

pour voir le top 20 descripteur de fichier à l'aide de procédés:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

la sortie est dans le format de fichier de gérer le nombre, pid, cmndline pour le processus de

exemple de sortie

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

2voto

Victor Sorokin Points 7429

Vous pouvez essayer d'écrire un script qui régulièrement appel 'lsof' sur des pid.

2voto

bwalton Points 76

Vous avez demandé bash/python méthodes. ulimit serait le meilleur bash approche (à court de munging via /proc/$pid/fd et la comme par la main). Pour python, vous pouvez utiliser le module de ressources.

import resource

print resource.getrlimit(resource.RLIMIT_NOFILE)

$ python test.py

(1024, 1024)

de la ressource.getrlimit correspond à la getrlimit appeler dans un programme C. Les résultats représentent le courant et les valeurs maximales pour la ressource demandée. Dans l'exemple ci-dessus, le courant (soft) de la limite est de 1024. Les valeurs sont typiques par défaut sur les systèmes Linux, ces jours-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X