web-dev-qa-db-ja.com

Java.io.FileNotFoundExceptionを解決できないようです(システムで開いているファイルが多すぎます)

免責事項。まず、私はSUではありません。私は少し経験のある中級レベルのコンピューターユーザーです。私はいくつかの基本的なコードを書くことができ、20年以上コンピューターを使用しています。 MSDOS、何年にもわたってWindowsに、私はOS Xを使用しています。私は数週間、高低を検索してきたので、助けを求めるために大砲に来ることにしました。これで大丈夫だといいのですが。

まず、私はOS X 10.11.6にいます。

私はCrashplanバックアップソフトウェアに問題があり、サポート担当者と協力して取り組んでいました。それはすべてエラーに帰着しました:

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

読んだところ、システムで許可されている開いているファイルの数を増やす必要があることがわかりました。 /Library/LaunchDaemonsにあるファイルの値を作成および変更しました。

limit.maxfiles.plistlimit.maxproc.plistの2つのファイルを作成しました

limit.maxfiles.plist内に配置しました:

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

limit.maxproc.plist内に配置しました:

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

再起動し、ターミナルでlaunchctl limit maxfilesを実行してこれが有効になっていることを確認しました。これは、それが有効であることを示しました。

クラッシュプランを再開しましたが、同じエラーが発生しました。私はクラッシュプランの人々に確認しました、そして彼らは基本的に難しいと言いました、それは問題です、それを直してください(それは私が思うに十分に公平です)。

そのため、900000000に達するまで、開くことができるファイルの数を増やし続けました。はい、合計9億個のファイルを開くことができます。私の総ドライブ数よりも多い。エラーは引き続き発生します。 launchctl limit maxfilesで確認すると、有効であることがわかります。

だから、それは私を困惑させたままにしました。次に、周りを見回して、ulimit -S -n 900000のようなコマンドを実行できることがわかりました。これにより、システムの他の部分で再生できるファイルが増えます。それがどのように機能するかはわかりませんが、ulimit -aを確認したところ、有効でした。ただし、Crashplanでも同じ問題が発生します。

だから今はどうしたらいいのかわからないので、OSを知っている人に聞いてみました。誰かが私がこれを解決するために何を試みることができるかについていくつかのガイダンスを提供できますか?

本当にありがとう。

1
robster

多分これは実際にあなたのための質問に答えます。以下をターミナルウィンドウに貼り付けます。

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

それが何をしようとしているのか:

  • trueの場合-中断するまで(例:Control-C)
  • lsof-システムで開いているすべてのファイルと、それらのファイルを開いているプロセス(コマンド)の名前を一覧表示します
  • awk-プロセスごとに開いているファイルの数を数えます
  • sort-開いているファイルの数でそのリストをソートします
  • tail-最も多くのファイルが開いている10個のプロセスを報告します
  • 睡眠-ちょっと待って、もう一度全部やりなさい

すぐに犯人を見るか、やがてリストの最後に向かって動き始めます。

1
jwd630