OS X 10.7.1の「システムで開いているファイルが多すぎます」エラーの修正はありますか?


191

OS X 10.7.1の厄介な「システム内の開いているファイルが多すぎます」という制限を取り除く必要があります。 

方法はありますか?


4
これがいつ発生するかについて詳しく説明しますか?どのような状況ですか?
-slhck

1
@slhck-私は同じ問題を抱えています。状況は基本的に「ランダム」です。私は開発者なので、Macをかなり頻繁に使用しています。1つ以上のデータベース、Webサーバー、テストツール、1つ以上のブラウザー、および音楽プレーヤーを一度に実行しています。Google Chromeは、多くのファイルを開いている1つのプログラムのようです。
ネイサンロング

実際、私の「大量使用」は問題ではありませんでした。カーネルお​​よびプロセスごとのオープンファイルの最大数の私の設定は、デフォルトの設定よりもはるかに低かった。
ネイサンロング

2
ネイサンのコメントを読んで、なぜデフォルトに関する詳細を含めなかったのか疑問に思ったのなら、それは彼が以下の答えですべてを綴ったからです。(いい答え!:)
オリー

私はNathan Longと同じ使用状況にあり、Apacheを再起動することが問題を「解決した」唯一のステップであることがわかりました。以下の制限の増加をすべて適用しましたが、すぐには解決しませんでした。私はコマンドラインでphpUnit tests> selenium server> firefox> apache> php> mysqlをすべて同じMacbookで実行しています。マーベリックにアップグレードするまでは正常に動作していました。私が受け取るエラーはテストされているwebappにあります。つまり、php / apacheがファイルを使い果たしているため、おそらくシェル設定によって制御されていません。
スキピロット14

回答:


225

この役立つ記事によると(これを読むことをお勧めします):

デフォルトでは、Mac OS Xで開くことができるファイルの最大数は12,288に設定され、特定のプロセスで開くことができるファイルの最大数は10,240です。

これらは次の方法で確認できます。

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

次の方法で制限を増やすことができます(自己責任で)。

  • sysctl -w kern.maxfiles=20480 (または選択した任意の数)
  • sysctl -w kern.maxfilesperproc=18000 (または選択した任意の数)

変更を永続的にするsudoには、を使用して、次のように設定/etc/sysctl.confを作成します(作成する必要があります)。

kern.maxfiles=20480
kern.maxfilesperproc=18000

注:OS X 10.10 以前では、/etc/launchd.conflike に設定を追加することができ、limit maxfilesここに入力したものはすべて上書きされます。

繰り返しますが、記事から:

これを実行すると、カーネル自体には最大数のファイルが含まれますが、シェルには含まれません。そして、この多くのファイルを使用するほとんどのプロセスはシェルによって開始されるため、これを増やしたいと考えています。

そのためのコマンドは次のとおりです。

ulimit -S -n 2048 # or whatever number you choose

この変更も一時的なものです。現在のシェルセッションの間のみ有効です。シェルを開くたびに実行したい場合は.bashrc、シェル構成ファイル(など.zshrc)に追加できます。


1
起動領域のアイコンをクリックして起動したプロセスに適用される制限は何ですか?そして、その制限を変更する方法は?あなたが「シェル」と言うとき、私はあなたがインタラクティブなターミナルシェルを意味すると仮定しています。
-Cheeso

@Cheeso -私が考える、システム全体の制限(sysctlの)またはlaunchdの限界は、低い方、それを制御します。
ネイサンロング

1
コンテンツ制限maxfiles 1000000 1000000で/etc/launchd.confを作成すると、私にとってはうまくいきました!(こちらOSX 10.8.2)
ズグワルト

1
kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf を入れてリブートしました。kern.maxfilesは無視され、デフォルトのままでしたが、kern.maxfilesperprocは65000に設定されていました。/etc/launchd.confがありません。
プフェレル14年

2
max files行の後に誰かがmaxファイルが貼り付かないという問題がある場合は、maxfiles行の後に末尾のスペースがあるため、削除する必要があります。
ジャスマン

62

OS Xの各バージョンのオープンファイルの制限を変更するためのまったく異なる方法があるようです!

OS X Sierra(10.12.X)の場合:

1.に ファイルを作成し/Library/LaunchDaemons/limit.maxfiles.plist、次の場所に貼り付けます(2つの数値(それぞれソフト制限とハード制限)を自由に変更できます)。

<?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>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. 新しいファイルの所有者を変更します。

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. これらの新しい設定をロードします。

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. 最後に、制限が正しいことを確認します。

launchctl limit maxfiles

完璧に機能しました、ありがとう!私の場合は、エラーメッセージとJavaプロセスで明らかにIO Error: Bad file descriptor (Write failed)
agradl

1
また、エル・キャピタン10.11.6上で動作します
トロイ・ダニエルズ

それでもシェルのulimitを変更することはできません。最大は1024のままです
-DataGreed

ステップ2で次を実行します。sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen

33

ulimit設定を増やす必要があります-最近のOS Xではかなり低い-デフォルトでは256です。ulimit -n 4096〜/ .profileまたは同等のものを追加または同様にして、ローカル環境で解決します。実行ulimit -aして現在のレベルを確認します

システム設定を確認するには、これを実行します:

launchctl limit maxfiles

Lion(10240)では、プロセスごとに以前よりもかなり高く設定されています。ただし、まだそこにヒットしている場合は、同じコマンドを使用して目的のレベルでより高く設定できます。変更を永続的にするには、/ etc / launchd.confに関連する行を追加する必要があります。


1
256?私にとっては2560個のファイル記述子であり、変更したことはありません。制限は266プロセスです(cfを参照ulimit -a)。
slhck

2
私も同じ、MacOS X Maverick上の256個のファイル
Climbatize 14

4
OS X Yosemiteでも
アレクサンダー

2
エルキャピタンでも256です。
TMN

1
ヨセミテで256。
Jaec

31

他のオプションは、犯人を見つけることです:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

最後の1つについては、開いているファイルを確認できます。

sudo lsof -n | grep socketfil

必要に応じてプロセスを強制終了します

kill $pid

コメントから:

価値のあるものについては、最も開いているファイルを使用してプロセスIDのリストを取得することもできます

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

役に立った!しかし、OS X(10.11)でのソートは-hを取りません。(たぶん-g?)
ロバートカルホーン

私にとっては-h(OS X 10.12.3)なしでうまく機能しました:sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

せずに-h
サンマイ

これは、問題の根本原因を
特定

1
lsof -n +c 0プロセス名の切り捨てを防ぐために使用します。
ヴォーン

10

人々、Mavericks 10.9.4で

ulimit -n 2048正常に動作します。新しいログインセッションを起動する必要がある場合があります。


3

最新のmacOS(執筆時点では10.14.1)では、使用できますsudo launchctl limit maxfiles 64000 524288(デフォルトでは256)が、現在のセッション内でのみ機能します。永続的な解決策としてlaunchctl、@ ninjaPixel(https://superuser.com/a/1171028/760235)のジョブを使用してください。


どのようにして524288という番号を思いついたのですか?以前の値は256で無制限でした。
チップロバーソン

1

走れます

lsof -n

どのプロセスが開いているファイルが多すぎます。

それを殺します。

または

sysctl -w kern.maxfiles=20480

より大きなものに変更します。


3
この答えが既に与えられたものとどのように異なるか説明してください。
スティーブンラウフ

1

上記のすべての変更の後、私のjavaは10000個以上のファイルを作成しませんでした。解決策は、このjvmフラグ-XX:-MaxFDLimitでした


0

chmod -Rを実行中に遭遇したので、小さなステップを踏んで回避しました。例えば

# for each directory
find . -type d -exec chmod 755 {} \;

1
これは回避策かもしれませんが、実際に質問に答えているようには見えません。おそらく、あなたはメッセージを取り除くことができないと説明し、それを問題の少ないものにするための一つの方法としてこれを提案することはあなたの答えを改善するでしょう。
music2myear

0

https://superuser.com/a/1171028/367819に類似

Mac OS Xシステムの現在の制限を確認するには、次を実行します。

launchctl limit maxfiles

最後の2列は、それぞれソフト制限とハード制限です。

Mac OS X Yosemiteでシステム全体でオープンファイルの制限を調整するには、2つの構成ファイルを作成する必要があります。1つ目は、/ Library / LaunchDaemons / limit.maxfiles.plistにあるプロパティリスト(別名plist)ファイルで、次のXML設定が含まれています。

<?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>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

これにより、オープンファイルの制限が200000に設定されます。2番目のplist構成ファイルは、次の内容で/Library/LaunchDaemons/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>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

両方のplistファイルはroot:wheelによって所有され、パーミッション-rw-r--r--が必要です。このパーミッションはデフォルトで適切に設定されているはずですが、sudo chmod 644を実行することで確実に設定できます。上記の手順により、システム全体のオープンファイル制限が再起動時に正しく設定されますが、launchctl limitを実行して手動で適用できます。

これらの制限をシステムレベルで設定することに加えて、bashrc、bashprofile、または類似のファイルに次の行を追加して、セッションレベルでも設定することをお勧めします。

ulimit -n 200000
ulimit -u 2048

plistファイルと同様に、bashrcまたは同様のファイルには-rw-r--r--パーミッションが必要です。この時点で、コンピューターを再起動し、ターミナルにulimit -nと入力できます。システムが正しく構成されている場合、maxfilesが200000に設定されていることがわかります。


詳細については、この記事を参照してください。

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


値を有効にするには、必ずMacを再起動してください。


回答が既にある場合は投稿を重複としてマークする必要があります。そうでない場合は、リンクが永久に有効ではない可能性があるため、リンクから関連情報を投稿してください。
zymhan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.