Je n'arrive pas à résoudre java.io.FileNotFoundException (trop de fichiers ouverts dans le système)

1

Avertissement. D'abord je ne suis pas un SU. Je suis un utilisateur d'ordinateur de niveau intermédiaire avec un peu d'expérience. Je peux écrire du code de base, utiliser des ordinateurs depuis plus de 20 ans. MSDOS, sous Windows au fil des années, je suis sous OS X. J'ai cherché haut et bas pendant quelques semaines maintenant et j'ai donc décidé de faire appel aux gros bras pour demander de l'aide. J'espère que ça vous va.

Tout d'abord je suis sur OS X 10.11.6.

J'avais un problème avec mon logiciel de sauvegarde Crashplan et je le travaillais avec ses collaborateurs. Tout se résumait à l'erreur:

java.io.FileNotFoundException (Too many open files in system)

J'ai lu et découvert que je devais augmenter le nombre de fichiers ouverts autorisés sur mon système. Je l’ai fait en créant et en modifiant les valeurs des fichiers situés dans /Library/LaunchDaemons.

J'ai créé deux fichiers: limit.maxfiles.plist et limit.maxproc.plist

Dans limit.maxfiles.plist J'ai placé:

    <?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">  
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>54000</string>
      <string>54000</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>  

et à l'intérieur limit.maxproc.plist J'ai placé:

    <?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>4096</string>
          <string>4096</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

J'ai redémarré et vérifié que cela avait eu un effet en exécutant launchctl limit maxfiles au terminal. Cela a montré que c'était en effet.

J'ai recommencé crashplan et cela a donné la même erreur. J'ai vérifié auprès des responsables du crashplan et ils m'ont dit en gros que c'était le problème, corrigez-le (ce qui est assez juste, je pense).

Donc, j'ai continué à augmenter le nombre de fichiers autorisés jusqu'à ce que je sois arrivé à 900000000). Oui, 900 millions de fichiers sont autorisés. Plus que j'ai sur mon lecteur total. L'erreur persiste toujours. Vérification avec launchctl limit maxfiles cela montre que c'est en vigueur.

Donc, ça m'a laissé perplexe. J'ai ensuite regardé autour de moi et découvert que je pouvais exécuter une commande comme celle-ci. ulimit -S -n 900000 ce qui donnera à une autre partie du système plus de fichiers à jouer. Je ne sais pas comment ça marche, mais j'ai vérifié ulimit -a et c'était en effet. Même problème avec Crashplan cependant.

Alors maintenant, je ne sais pas quoi faire, alors je suis venu demander aux personnes qui connaissent mieux que la plupart les systèmes d'exploitation. Quelqu'un peut-il offrir des conseils sur ce que je peux essayer de résoudre?

Merci beaucoup.

robster
la source
1
Vous devez d’abord déterminer ce qui ouvre autant de fichiers. D'après ce que vous avez dit, augmenter le nombre maximum de fichiers ouverts n'est qu'un pansement sur la cause première. Pourquoi ne pas aller dans Activity Monitor et voir s’il existe une application dont l’utilisation de la mémoire augmente constamment? Trier par mémoire; notez ce qui est au sommet et quelle est l'utilisation de la mémoire; va-t'en pour un moment et regarde si ça a grandi. Je parie que ce n'est pas CrashPlan. Ce Q & A pourrait également donner quelques indices: stackoverflow.com/q/20974438
jwd630
Merci pour ça. Durant le week-end, j'ai effectué quelques tests avec des captures d'écran du moniteur d'activité. Il n'y a pratiquement pas de changement de mémoire, voire aucun, pour toutes les applications ouvertes. J'ai 16Gig de RAM et j'ai toujours eu environ 10Gig libre tout le temps.
robster
Ensuite, j'essayerais quelque chose d'un peu plus bas. Depuis une fenêtre de terminal while true; do ts=$(date +%H_%M); sudo lsof > open_files_${ts}; wc -l open_files_${ts}; sleep 60; done va capturer les processus qui ont des fichiers ouverts et en compter le nombre une fois par minute. Si le nombre augmente, vous pouvez voir les différences en différant les résultats, par exemple: diff open_files_13_13 open_files_13_14 Ne vous laissez pas berner, car il y a forcément des différences; mais si un processus se démarque régulièrement, vous pouvez avoir un coupable. Cela créera un nouveau fichier volumineux toutes les minutes jusqu'à ce que vous l'interrompiez: Control-C
jwd630

Réponses:

1

Peut-être que cela répond à la question pour vous. Collez les éléments suivants dans une fenêtre de terminal:

while true; do
    sudo lsof |
       awk '{ files[$1]++ } END { for (key in files) { print key, files[key] } }' |
       sort -n -k 2 | tail -10 
    sleep 60;
done

Qu'est-ce que ça va faire:

  • while true - Jusqu'à ce que vous l'interrompiez, par exemple, Control-C
  • lsof - Liste tous les fichiers ouverts sur le système et le nom du fichier processus (commande) qui a ces fichiers ouverts
  • awk - Compter le nombre de fichiers ouverts par processus
  • sort - Triez cette liste par nombre de fichiers ouverts
  • tail - Rapporte les 10 processus avec le plus de fichiers ouverts
  • dormir - Attends une minute et refais le tout

Vous devriez soit voir le coupable immédiatement ou il va commencer à se déplacer vers la fin de la liste avant trop longtemps.

jwd630
la source
Merci pour ça. Sans cette aide, je serais coincé et je n’aurais aucune sauvegarde. Eh bien, je n'ai toujours pas de sauvegarde, mais j'ai de l'espoir! :-) Ce sont de belles compétences terminales. Voici le résultat après la première exécution de votre script. Chargez ensuite l'interface Capsule, puis laissez-la reposer pendant quelques minutes: mdworker 158 AppleSpel 174 Resilio 177 Telegram 210 com.apple 245 Spotlight 248 UserEvent 278 CrashPlan 331 Dropbox 353 firefox 407 mdworker 151 AppleSpel 174 Resilio 177 Telegram 210 Telegram 210 com.apple 245 UserEvent 278 Dropbox 354 firefox 389 CrashPlan 581
robster
alors ... mdworker 151 AppleSpel 174 Resilio 175 Telegram 210 com.apple 245 Spotlight 246 Evènements 278 Dropbox 354 firefox 377 CrashPlan 727 mdworker 163 AppleSpel 174 Resilio 175 Telegram 210 Spotlight 250 com. AppleSpel 174 Resilio 175 Telegram 210 Spotlight 250 com.apple 265 UserEvent 278 Dropbox 354 firefox 375 CrashPlan 574 Désolé pour la mise en page, lorsque j’y ai ajouté une belle présentation verticale, mais l’interface de superuser.com l’a changé.
robster
J'ai également ajouté une version pastebin de 3 autres minutes de sortie ici pour faciliter la lecture. pastebin.com/MEpE1FKQ
robster
Comme vous pouvez le constater, CrashPlan réduit en fait le nombre de fichiers ouverts au cours des 3 dernières minutes: commence à 638, diminue à 580, puis à 581. Je suggère de laisser ce script s'exécuter pendant que vous vous occupez de votre entreprise. Si / quand CrashPlan a ensuite son erreur, voyez quels processus gardent beaucoup de fichiers ouverts à ce stade. Ce ne sont pas des nombres inhabituels.
jwd630
Merci encore. Malheureusement, Crashplan a eu son erreur environ 6 fois au cours de cette période de 3 minutes. Donc, l'erreur se produisait pendant la création des journaux. J'ai augmenté la fidélité toutes les 10 secondes et voici ce que j'ai obtenu pastebin.com/S0s5DHVT Ce n'est toujours pas des chiffres massifs cependant. Donc, dans ce temps, crashplan a donné l'erreur plusieurs fois.
robster