Java.io.FileNotFoundException (sistemde çok fazla açık dosya var) çözemiyor gibiyim


1

Yasal Uyarı. İlk önce SU değilim. Biraz tecrübeli, orta seviye bir bilgisayar kullanıcısıyım. Bazı temel kodları yazabilirim, bilgisayarları 20+ yıldır kullandım. MSDOS, yıllar boyunca Windows'a OS X'deyim. Şimdi birkaç hafta boyunca yüksek ve düşük aradım ve bu yüzden yardım almak için büyük silahlara gelmeye karar verdim. Umarım bu konuda iyisindir.

İlk önce ben varım OS X 10.11.6.

Crashplan yedekleme yazılımımla ilgili bir sorun yaşıyorum ve destek personeli ile birlikte çalışıyordum. Hepsi hataya düştü:

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

Hakkında okudum ve sistemimde izin verilen açık dosya sayısını artırmak zorunda kaldım. Bunu, içinde bulunan dosyaların değerlerini oluşturup değiştirdim /Library/LaunchDaemons.

Ben iki dosya oluşturulur: limit.maxfiles.plistvelimit.maxproc.plist

İçime limit.maxfiles.plistyerleştirdiğim:

    <?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>  

ve içinde limit.maxproc.plistyerleştirdim:

    <?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>

Yeniden başlattım ve launchctl limit maxfilesbunun terminalde çalışarak etkilendiğini kontrol ettim . Bu, yürürlükte olduğunu gösterdi.

Yine crashplan'ı başlattım ve aynı hatayı verdi. Kaza planı insanlarını kontrol ettim ve temel olarak sert dediler ki, sorun bu, düzeltmek için git (ki bence yeterince adil).

Bu yüzden 900000000’e ulaşana kadar açılmasına izin verilen dosya sayısını artırdım. Evet, bu toplam 900 milyon dosyanın açılmasına izin veriyor. Toplam sürüşümde olduğundan daha fazla. Hata hala devam ediyor. launchctl limit maxfilesBununla kontrol etmek, etkin olduğunu gösterir.

Bu beni güdük bıraktı. Daha sonra etrafa baktım ve böyle bir komutu çalıştırabilirim ulimit -S -n 900000, bu da sistemin başka bir bölümüne daha fazla dosya oynayacak. Nasıl çalıştığından emin değilim, ama kontrol ettim ulimit -ave etkili oldu. Crashplan ile aynı sorun olsa da.

Şimdi ne yapacağımdan emin değilim, bu yüzden işletim sistemi tanıyan insanlara daha iyi olduğunu sormaya geldim. Birileri bunu çözmek için ne deneyebileceğim konusunda bir rehberlik sunabilir mi?

Çok teşekkürler.


1
Öncelikle bu kadar çok dosyayı neyin açtığını bulmanız gerekir. Söylediklerinize göre, maksimum açık dosyaları arttırmak sadece kök nedenin üzerindeki bir sargıdır. Activity Monitor'a girmeye ve hafıza kullanımı sürekli büyüyen bir uygulama olup olmadığını görünmeye ne dersiniz? Belleğe Göre Sırala; en üstte ne olduğunu ve bellek kullanımının ne olduğunu not edin; bir süre uzaklaş ve büyümüş olup olmadığına bak. Bahse girerim CrashPlan değil. Bu Sorular ve Cevaplar ayrıca bazı ipuçları verebilir: stackoverflow.com/q/20974438
jwd630

Bunun için teşekkür ederim. Etkinlik izleyicisinin ekran görüntülerini içeren haftasonu birkaç test yaptım ve açık olan tüm uygulamalar için temelde çok az ya da hiç hafıza değişikliği yoktu. 16Gig RAM'im var ve sürekli olarak yaklaşık 10Gigim oldu.
17:17

O zaman biraz daha düşük seviyeli bir şeyler deneyebilirim. Bir terminal penceresinden while true; do ts=$(date +%H_%M); sudo lsof > open_files_${ts}; wc -l open_files_${ts}; sleep 60; done, dosyaları açık olan ve dakikada bir kaç tane olduğunu sayan işlemi yakalayacaktır. Sayı artıyorsa, sonuçları farklılaştırarak farkları görebilirsiniz, örneğin: diff open_files_13_13 open_files_13_14 Bazı farklılıklar olması gerektiğinden kanmayın; ancak bir süreç tutarlı bir şekilde göze çarpıyorsa, bir suçlu olabilir. Bu, siz kesene kadar her dakika yeni, büyük bir dosya oluşturur: Control-C
jwd630

Yanıtlar:


1

Belki bu aslında sizin için soruyu yanıtlıyor. Aşağıdakileri bir Terminal penceresine yapıştırın:

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

Bu ne yapacak:

  • gerçek iken - Kesinceye kadar, örneğin, Control-C
  • lsof - Sistemdeki tüm açık dosyaları ve bu dosyaları açmış olan işlemin (komut) adını listele
  • awk - Açık dosyaların sayısını işlemden sayma
  • sort - Bu listeyi açık dosya sayısına göre sıralayın
  • tail - En fazla dosya açık olan 10 işlemi rapor et
  • uyku - Bir dakika bekle ve her şeyi tekrar yap

Suçluyu hemen görmelisin, yoksa çok geçmeden listenin sonuna doğru hareket etmeye başlar.


Bunun için teşekkür ederim. Bu yardım olmadan, takılıp kalırdım ve hiçbir yedeğim olmazdı. Hala bir desteğim yok, ama umudum var! :-) Bu gerçekten bazı güzel terminal becerileri. Scriptinizi ilk çalıştırdıktan sonraki sonuç. Sonra Capsule arabirimini yükleyerek birkaç dakika oturmasını sağlayın: mdworker 158 AppleSpel 174 Resilio 177 Telegram 210 com.apple 245 Spotlight 248 Kullanıcı Sunucusu 278 CrashPlan 331 Dropbox 353 firefox 407 mdworker 151 AppleSpel 174 Resilio 177 Telegram 210 com.apple 245 Spotlight 246 UserEvent 278 Dropbox 354 firefox 389 CrashPlan 581
17:17

daha sonra ... mdworker 151 AppleSpel 174 Resilio 175 Telegram 210 com.apple 245 Spotlight 246 KullanıcısıEvent 278 Dropbox 354 firefox 377 CrashPlan 727 mdworker 163 AppleSpel 174 Resilio 175 Telegram 210 Spotlight 250 com.apple 269 Kullanıcısı 278 Dropbox 354 firefox 374 CrashPlan 580 AppleSpel 174 Resilio 175 Telgraf 210 Spotlight 250 com.apple 265 UserEvent 278 Dropbox 354 firefox 375 CrashPlan 574 Pardon, üzgünüm, bunu eklediğimde güzel bir dikey düzendeydi, ancak superuser.com arayüzü dağınık görünmek için değiştirdi.
17:17

Ben de burada daha kolay okuma için çıkışın başka 3 dakika pastebin versiyonunu ekledik pastebin.com/MEpE1FKQ
robster

Gördüğünüz gibi CrashPlan aslında son 3 dakikada açık dosya sayısını azaltıyor: 638'den başlıyor, 580'e, ardından 581'e gidiyor. Eğer / ne zaman CrashPlan bir sonraki hatayı alıyorsa, hangi süreçlerin gerçekte çok sayıda açık dosya tuttuğunu görün. Bunlar sıradışı sayılar değil.
jwd630

Tekrar teşekkürler. Ne yazık ki Crashplan, bu 3 dakikalık sürede yaklaşık 6 kez hata yaptı. Bu yüzden, günlükler oluşturulurken hata oluyordu. Sadakatimi her 10 saniyede bir arttırdım ve bu ne elde ettiğim pastebin.com/S0s5DHVT Yine de büyük rakamlar değil. Böylece gösterilen sürede, çarpışma planı birçok kez hata verdi.
17:17
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.