Increase the maximum number of open file descriptors in Snow Leopard?
I am trying to do something that requires a large number of file descriptors
sudo ulimit -n 12288
is as high as Snow Leopard wants to go; beyond this results in
/usr/bin/ulimit: line 4: ulimit: open files: cannot modify limit: Invalid argument.
I want to raise the number much higher, say 100000. Is it possible?
Solution 1:
Using ulimit
command only changes the resource limits for the current shell and its children and sudo ulimit
creates a root shell, adjusts its limits, and then exits (thus having, as far as I can see, no real effect).
To exceed 12288, you need to adjust the kernel's kern.maxfiles
and kern.maxfilesperproc
parameters, and also (at least according to this blog entry, which is a summary of this discussion) a launchd limit. You can use launchctl limit
to adjust all of these at once:
sudo launchctl limit maxfiles 1000000 1000000
To make this permanent (i.e not reset when you reboot), create /etc/launchd.conf
containing:
limit maxfiles 1000000 1000000
Then you can use ulimit
(but without the sudo
) to adjust your process limit.
If this doesn't do it, you may be running into size limits in the kernel. If your model supports it, booting the kernel in 64-bit mode may help.
Solution 2:
The following should resolve most solutions (and are listed in order of their hierarchy):
echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile
Notes:
- You will need to restart for these changes to take effect.
- AFAIK you can no longer set limits to 'unlimited' under OS X
- launchctl maxfiles are bounded by sysctl maxfiles, and therefore cannot exceed them
- sysctl seems to inherit kern.maxfilesperproc from launchctl maxfiles
- ulimit seems to inherit it's 'open files' value from launchctl by default
- you can set a custom ulimit within /etc/profile, or ~/.profile ; while this isn't required I've provided an example
- Be cautious when setting any of these values to a very high number when compared with their default - the features exist stability/security. I've taken these example numbers that I believe to be reasonable, written on other websites.
Solution 3:
It seems like there is an entirely different method for changing the open files limit for each version of OS X!
For OS X Sierra (10.12.X) you need to:
1.
In Library/LaunchDaemons
create a file named limit.maxfiles.plist
and paste the following in (feel free to change the two numbers (which are the soft and hard limits, respectively):
<?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. Change the owner of your new file:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
3. Load these new settings:
sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist
4. Finally, check that the limits are correct:
launchctl limit maxfiles
Solution 4:
It seems that OS X Lion will not permit "unlimited" as a value:
% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.
Providing numerical values for both the soft and the hard limit does the job:
% sudo launchctl limit maxfiles 4096 8192
Solution 5:
On Mavericks its simple. As a regular user:
ulimit -n 8192
You can check the updated settings via
ulimit -a
On my machine:
ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kbytes) unlimited
-l: locked-in-memory size (kbytes) unlimited
-u: processes 709
-n: file descriptors 8192