web-dev-qa-db-fra.com

Qui mange tous mes descripteurs de fichiers et donc de la mémoire?

mon système actuel: 14.04.4 LTS (GNU/Linux 3.13.0-85-generic x86_64)

$ free
             total       used       free     shared    buffers     cached 
Mem:      16366288   16090588     275700    4047472    1019652  5253144
-/+ buffers/cache:    9817792    6548496 Swap:      7813116    7308592     504524



$ cat /proc/sys/fs/file-nr
1196103  0   1624594

Pendant quelques mois (et plusieurs mises à jour), le problème est que soudainement, après quelques jours d'utilisation de ma boîte (et de suspension quotidienne), l'utilisation de la mémoire et le nombre de descripteurs de fichier attribués ont augmenté.

Soudain, la mémoire "engagée" augmente, atteignant 120 - 160 Go (!). Normalement, cette valeur se situe autour de ma RAM physique. Un autre symptôme est que tout mon RAM + swap est épuisé. Le résultat est un système inutilisable. Pour l'instant, je ne pourrais résoudre cette situation qu'en redémarrant. Tuer presque tous les processus après avoir arrêté X n'a ​​pas aidé à libérer la valeur engagée.

Un indicateur fort semble être la valeur déraisonnablement élevée du compteur de fichiers ouverts dans/proc/sys/fs/file-nr - elle dépasse 2 millions. Dernièrement, j'ai essayé de limiter ce nombre à 1624594, mais le seul résultat est que (bien sûr) je ne manque pas de mémoire, mais plutôt de FD.

Avec Munin en place, je peux voir une forte corrélation temporelle entre les FD et l'utilisation de la mémoire.

J'ai quelques partages CIFS montés et mon utilisateur a son gvfsd-Fuse. La racine FS est ext4.

Les résultats de lsof et de/proc/ne répertorient que 10% environ de/proc/sys/fs/fichier-nr.

Je soupçonnais que MTP en était la cause (lorsque je connectais mon téléphone Motorola), mais récemment, cela s'est produit sans avoir utilisé MTP depuis le dernier redémarrage.

Sidenote: J'ai des pilotes radeon pour la vidéo:

ii  libdrm-radeon1:AMD64                                        2.4.64-1~ubuntu14.04.1                        
ii  libdrm-radeon1:i386                                         2.4.64-1~ubuntu14.04.1                        
ii  radeontool                                                  1.6.3-1                                       
ii  xserver-xorg-video-radeon                                   1:7.3.0-1ubuntu3.1  

UPDATE

root:/proc$ (echo -n "0" ; for processid in [0-9]*; do echo -n "+$(ls /proc/$processid/fd/ | wc -l)"; done;echo)|bc
2597
root:/proc$ lsof -n|wc -l
lsof: WARNING: can't stat() Fuse.gvfsd-Fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
84504
root:/proc$ Sudo -u mdo lsof -n|wc -l
72170

Comment puis-je savoir ce qui mange tous ces FD et ma mémoire?

6
mdo

Cela montrera le nombre de fichiers ouverts par ID de processus:

cd /proc
for processid in [0-9]*
do
    echo "Process ID = $processid: $(ls /proc/$processid/fd/ | wc -l) file descriptors"
done

(enregistrer et exécuter avec Sudo).

Ensuite, vous pouvez localiser à quoi cet ID de processus appartient.

2
Rinzwind