4 votes

Déterminer l'application qui ouvre trop de fichiers

Il arrive que mon Mac se comporte bizarrement. Un symptôme typique est que je ne peux plus ouvrir certaines applications qui fonctionnaient très bien il y a peu. C'est ce qui vient de se produire et j'ai constaté que ce problème était dû à un excès de fichiers ouverts dans le système. Par exemple :

$ man lsof
sh: pipe error: Too many open files in system
Error executing formatting or display command.
System command (cd '/usr/share/man' && (echo ".ll 24.1i"; echo ".nr LL 24.1i"; /bin/cat '/usr/share/man/man8/lsof.8') | /usr/bin/tbl | /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c | (/usr/bin/less -is || true)) exited with status 33024.
Man page /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/share/man/man8/lsof.8 is identical to /usr/share/man/man8/lsof.8
No manual entry for lsof

En outre :

$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome 
dlopen /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: dlopen(/Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework, 261): no suitable image found.  Did find:
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: open() failed with errno=23
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Helpers/Google Chrome Helper.app/Contents/MacOS/../../../../Google Chrome Framework: stat() failed with errno=3
    /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Google Chrome Framework: open() failed with errno=23
[0822/142149.543101:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/142149.543447:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffee8237000, 0x2000): (os/kern) invalid address (1)
[92085:775:0822/112149.554485:FATAL:process_singleton_posix.cc(236)] : Too many open files in system (23)
[0822/142149.557563:ERROR:file_io_posix.cc(140)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/settings.dat: Too many open files in system (23)
[0822/142149.557717:ERROR:file_io_posix.cc(148)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/new/85472cbe-1c22-4598-94bf-a964bf67b0c5.dmp: Too many open files in system (23)
[0822/142149.558108:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/112149.558599:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffeef5d5000, 0x2000): (os/kern) invalid address (1)
[92089:775:0822/112149.643059:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/chrome_100_percent.pak
Some features may not be available.
[92089:775:0822/112149.643114:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/chrome_200_percent.pak
Some features may not be available.
[92089:775:0822/112149.643192:ERROR:resource_bundle.cc(363)] failed to load locale.pak
[92089:775:0822/112149.643221:ERROR:resource_bundle.cc(803)] Failed to load /Applications/Google Chrome.app/Contents/Frameworks/Google Chrome Framework.framework/Versions/76.0.3809.100/Resources/resources.pak
Some features may not be available.
[0822/112149.648315:ERROR:file_io_posix.cc(140)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/settings.dat: Too many open files in system (23)
[0822/112149.648369:ERROR:file_io_posix.cc(148)] open /Users/decio/Library/Application Support/Google/Chrome/Crashpad/new/f3454bf7-4dc1-4a39-9b23-112edbf9565b.dmp: Too many open files in system (23)
[0822/112149.649774:ERROR:mac_util.cc(204)] _CFCopySystemVersionDictionary failed
[0822/112149.649989:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffee426c000, 0x2000): (os/kern) invalid address (1)
Trace/BPT trap: 5
[0822/112149.746121:WARNING:system_snapshot_mac.cc(42)] sysctlbyname kern.nx: No such file or directory (2)

J'ai redémarré quelques applications et j'ai réussi à repasser sous la limite et à exécuter de nouvelles applications.

Cependant, j'aimerais être plus systématique. Pour autant, les quelques applications que j'ai redémarrées étaient tout juste suffisantes pour passer sous la limite, et je serai bientôt confronté au même problème. Plutôt que de fermer des applications au hasard qui peuvent ou non contribuer à ce problème, j'aimerais localiser l'application spécifique qui accumule les poignées de fichiers et la fermer.

Je pensais que lsof m'aiderait à identifier l'application problématique, mais l'analyse manuelle de sa sortie par défaut est irréalisable. Je pourrais écrire un shell script ou un programme Python pour regrouper les gestionnaires de fichiers par application, mais je pense qu'il pourrait y avoir un commutateur pour lsof qui effectue ce regroupement automatiquement, ou peut-être une application similaire à Activity Monitor mais qui affiche le nombre de gestionnaires de fichiers ouverts par processus.

Ma question est donc la suivante : Comment puis-je afficher le nombre de handles de fichiers ouverts groupés par processus ?

Je travaille sous MacOS 10.14.5, si cela fait une différence. En outre, bien que je sache que je peux augmenter la limite des fichiers ouverts, je pense que le vrai problème est que l'une de mes applications fuit des ressources, un peu comme une fuite de mémoire, et qu'il est préférable pour les performances du système de redémarrer l'application concernée plutôt que d'augmenter aveuglément les limites et de permettre à l'application de continuer à accumuler des ressources.

6voto

Fedaykin Points 61

Avez-vous essayé ?

lsof -n | awk '{print $1}' | uniq -c | sort -rn | head -n $LINES

Il devrait imprimer une liste de processus triés par le nombre de fichiers ouverts.

4voto

Darrell Root Points 159

Il est temps de faire appel à la puissance des pipes, du sort et de l'awk d'Unix. Mais comme lsof prend beaucoup de temps à s'exécuter, je vais sauvegarder la sortie et l'analyser, plutôt que d'envoyer lsof directement dans le tuyau.

Pour référence, voici le format de sortie de lsof :

[iMac:~] droot% head /tmp/a
COMMAND    PID  USER   FD      TYPE             DEVICE   SIZE/OFF     NODE NAME
loginwind   94 droot  cwd       DIR                1,7        896        2 /
loginwind   94 droot  txt       REG                1,7    1237152 18011104 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow
loginwind   94 droot  txt       REG                1,7      21024 18566026 /Library/Preferences/Logging/.plist-cache.HrVraTtH
loginwind   94 droot  txt       REG                1,7   27154336 18044520 /usr/share/icu/icudt62l.dat

Et mon analyse :

lsof > /tmp/a
cat /tmp/a | awk '{print $2}' | sort | uniq -c | sort -r -n | head

 511 724
 469 2790
 384 2791
 360 2793
 350 2798
 227 286
 224 658
 210 3833
 197 655
 190 698

Explication des lignes non évidentes :

  1. awk '{print $2}' affiche le deuxième champ de chaque ligne (le PID dans ce cas). C'est à peu près tout l'awk dont je me souviens. Très utile !
  2. uniq -c Prend une liste triée de PID et élimine les lignes adjacentes en double, avec le modificateur -c il ajoute un compte du nombre de lignes trouvées (dans notre cas, il s'agit d'une ligne par fichier ouvert de ce processus).
  3. "sort -r -n" permet de trier les données numériques dans l'ordre inverse (le plus grand nombre en haut).
  4. "head" affiche les 10 premières lignes (10 processus avec le plus grand nombre de fichiers ouverts).

Cela montre que le PID 724 a 511 fichiers ouverts sur mon système. Pour plus de détails :

cat /tmp/a | grep " 724 "

Dans mon cas, ce processus était Dropbox, ce qui est "intéressant", mais je peux voir que ce processus pourrait avoir besoin de nombreux fichiers ouverts. Je passe donc au suivant :

cat /tmp/a | grep " 2790 "

Et ainsi de suite. Avec un peu de chance, votre "délinquant" est évident à partir de la sortie de lsof triée par nombre de fichiers ouverts par PID.

Pour le nombre total de fichiers ouverts, utilisez "wc" (wordcount) :

[iMac:~] droot% cat /tmp/a | wc
9777   90500 1445558

Dans mon cas, cela signifie 9776 fichiers ouverts (il faut soustraire la ligne d'en-tête).

1voto

swineone Points 2031

Je viens de trouver le Paresseux app. Il s'agit essentiellement d'une interface graphique pour lsof Il est capable de regrouper et de trier les processus par nombre de fichiers, ce qui est exactement ce dont j'ai besoin. La seule chose que je pourrais demander et qui manque est un décompte du nombre total de fichiers ouverts dans le système.

1voto

awy Points 500

Je ne connais que le niveau utilitaire lsof Mais le moniteur d'activité peut-il être utilisé d'une manière ou d'une autre ? Il peut en résulter un pic d'utilisation du CPU pendant un certain temps, mais il montre les ports, les threads et les fichiers ouverts par processus après avoir double-cliqué sur le processus. Et comme vous voyez, beaucoup de fichiers sont ouverts, je soupçonne que l'utilisation de la mémoire est également élevée, de sorte que les applications peuvent être triées et vérifiées de la manière illustrée ci-dessous. Il s'agit d'une version générique de ce que fait, je pense, l'application Sloth que vous avez mentionnée.

enter image description here

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X