題 OS X 10.7.1上的“系統中打開的文件太多”錯誤是否有問題?


我需要擺脫OS X 10.7.1中令人討厭的“系統中太多打開的文件”限制。

有辦法嗎?


156
2018-06-07 08:52


起源


你想解釋一下這發生的時間嗎?在哪種情況下? - slhck
@slhck - 我有同樣的問題。情況基本上是“隨意的”。我是開發人員,所以我使用我的Mac非常重要:一次運行一個或多個數據庫,一個Web服務器,測試工具,一個或多個瀏覽器和一個音樂播放器。谷歌瀏覽器似乎是一個打開了大量文件的程序。 - Nathan Long
實際上,我的“大量使用”不是問題;我對kernal和per-process的最大打開文件數的設置遠低於默認值。 - Nathan Long
如果你讀了Nathan的評論,並想知道為什麼他沒有提供關於默認值的任何細節,那是因為他在下面的答案中拼寫了這一切。 (很好的回答!:) - Olie
我和Nathan Long的使用情況相同,發現重啟Apache是​​解決問題的唯一步驟。我應用了所有下面的限制增加,但他們沒有立即幫助。我在同一個macbook上運行命令行phpUnit測試> selenium服務器> firefox> apache> php> mysql。過去工作正常,直到我升級為小牛。我得到的錯誤是在正在測試的webapp中,即它的php / apache用完了文件,所以可能不受shell設置的控制。 - scipilot


答案:


根據 這篇有用的文章 (我建議閱讀):

默認情況下,設置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.conf 喜歡 limit maxfiles 它會覆蓋你放在這裡的任何東西。

再次,從文章:

完成此操作後,內核本身將具有最大數量   文件,但shell可能不會。而且因為大多數流程都需要   這個很多文件將由shell發起   要增加那個。

對此的命令是:

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

這種變化也是暫時的;它只持續當前的shell會話。您可以將其添加到shell配置文件中(.bashrc.zshrc 或者等等)如果你想在每次打開shell時運行它。


202
2018-06-29 20:23



通過單擊啟動區域中的圖標啟動的進程有什麼限制?以及如何改變這個限制?當你說“shell”時,我假設你的意思是一個交互式終端shell。 - Cheeso
@Cheeso - 我 認為 整體系統限制(sysctl)或啟動限制(以較低者為準)控制著這一點。 - Nathan Long
創建一個內容限制為maxfiles 1000000 1000000的/etc/launchd.conf對我來說非常棒! (OSX 10.8.2) - Zugwalt
我放 kern.maxfiles=65000 kern.maxfilesperproc=65000 在/etc/sysctl.conf中重啟。 kern.maxfiles被忽略並保持默認值,但kern.maxfilesperproc設置為65000.我沒有/etc/launchd.conf所以這有什麼用呢? - pferrel
如果有人遇到max files文件沒有問題,那是因為maxfiles行後面有一個尾隨空格,需要刪除。 - jjathman


似乎有一種完全不同的方法來更改每個OS X版本的打開文件限制!

對於OS X Sierra (10.12.X)你需要:

1。 在。創建一個文件 /Library/LaunchDaemons/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>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

53
2018-01-24 14:56



工作得很好,謝謝!在我的情況下,錯誤表現在帶有消息的java進程中 IO Error: Bad file descriptor (Write failed) - agradl
也適用於El Capitan 10.11.6 - Troy Daniels
仍然無法改變shell的ulimit。無論我做什麼,最大停留1024 - DataGreed
在第2步運行:sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist - Hai Nguyen


您需要增加ulimit設置 - 這些天在OS X上相當低 - 默認為256。加 ulimit -n 4096 或類似於你的〜/ .profile或同等物,它將在你的本地環境中解決它。跑 ulimit -a 檢查你目前的水平

要查看系統設置,請運行以下命令:

launchctl limit maxfiles

Lion(10240)在每個進程的基礎上設置得比以前高出很多。但是如果你仍然在那裡擊中它,那麼你可以使用具有所需級別的相同命令將其設置得更高。要使更改永久保留/etc/launchd.conf,您需要添加相關行。


29
2018-06-07 11:09



256?它對我來說是2560個文件描述符,我從來沒有改變它。限制是266個過程(c.f。 ulimit -a)。 - slhck
對我來說,MacOS X Maverick上有256個文件 - Climbatize
在OS X優勝美地上也有256個 - Alexander
El Capitan上也有256個。 - TMN
優勝美地256。 - Jaec


其他選擇可能是找到罪魁禍首:

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

對於最後一個,您可以看到哪些文件是打開的:

sudo lsof -n | grep socketfil

如果需要,可以殺死進程

kill $pid

來自評論:

對於它的價值,您還可以使用最開放的文件獲取進程ID列表

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

19
2018-02-18 00:42



有用!但是在OS X上排序(10.11)不需要-h。 (也許-g?) - Robert Calhoun
對我來說,沒有 -h (OS X 10.12.3): sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail - vearutop
所以沒有 -h - sanmai
這是幫助我解決問題的唯一答案..謝謝:) - SgtPooki
對於它的價值,您還可以使用最開放的文件獲取進程ID列表 lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail。 - Chris Frederick


伙計們,小牛隊10.9.4

ulimit -n 2048 工作良好。您可能需要啟動新的登錄會話。


9
2017-09-04 16:19





你可以跑

lsof -n

哪個進程打開了太多文件。

然後殺了它。

要么

sysctl -w kern.maxfiles=20480

把它改成更大的一個。


1
2018-05-18 02:52



請解釋這個答案與已經給出的答案有何不同。 - Stephen Rauch


我在做一個chmod -R時遇到了它,所以我通過採取較小的步驟來解決它,例如

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

0
2017-12-14 18:50



雖然這可能是一種解決方法,但它似乎並沒有真正回答這個問題。也許解釋說你無法擺脫這個信息然後提出這個問題作為一種方法來減少問題,這將改善你的答案。 - music2myear