Nice link to increas the linux fd limit -
http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
The open file limit is one of the limits that can be tuned with the ulimit command. The command
The following is an example of the output of
http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
Tuning file descriptor limits on Linux
Linux limits the number of file descriptors that any one process may open; the default limits are 1024 per process. These limits can prevent optimum performance of both benchmarking clients (such as httperf and apachebench) and of the web servers themselves (Apache is not affected, since it uses a process per connection, but single process web servers such as Zeus use a file descriptor per connection, and so can easily fall foul of the default limit).The open file limit is one of the limits that can be tuned with the ulimit command. The command
ulimit -aS
displays the current limit, and ulimit -aH
displays the hard limit (above which the limit cannot be increased without tuning kernel parameters in /proc).The following is an example of the output of
ulimit -aH
. You can see that the current shell (and its children) is restricted to 1024 open file descriptors.core file size (blocks) unlimited data seg size (kbytes) unlimited file size (blocks) unlimited max locked memory (kbytes) unlimited max memory size (kbytes) unlimited open files 1024 pipe size (512 bytes) 8 stack size (kbytes) unlimited cpu time (seconds) unlimited max user processes 4094 virtual memory (kbytes) unlimited
Increasing the file descriptor limit
The file descriptor limit can be increased using the following procedure:- Edit
/etc/security/limits.conf
and add the lines:* soft nofile 1024 * hard nofile 65535
- Edit
/etc/pam.d/login
, adding the line:session required /lib/security/pam_limits.so
- The system file descriptor limit is set in
/proc/sys/fs/file-max
. The following command will increase the limit to 65535:echo 65535 > /proc/sys/fs/file-max
- You should then be able to increase the file descriptor limits using:
ulimit -n unlimited
The above command will set the limits to the hard limit specified in/etc/security/limits.conf
.
[Find out where __FD_SETSIZE is defined] % grep "#define __FD_SETSIZE" /usr/include/*.h /usr/include/*/*.h /usr/include/bits/types.h:#define __FD_SETSIZE 1024 /usr/include/linux/posix_types.h:#define __FD_SETSIZE 1024 Alternately your system may use tabs in which case something like this should do the trick: % grep -E "#define\W+__FD_SETSIZE" /usr/include/*.h /usr/include/*/*.h [Thanks to madRat for this tip]. [Make a local copy of these files] % cp /usr/include/bits/types.h include/bits/types.h % cp /usr/include/linux/posix_types.h include/linux/posix_types.h [Modify them so that they look something like #define __FD_SETSIZE 65535 [Recompile httperf and/or your server so that it uses a larger file descriptor set size by using -I include during compliation, this will allow the compiler/preprocessor to use the new include files rather than the default versions]
- To check and modify limits per shell.
[Using csh: openfiles and descriptors show that the limit here is 1024] % limit cputime unlimited filesize unlimited datasize unlimited stacksize 8192 kbytes coredumpsize 0 kbytes memoryuse unlimited descriptors 1024 memorylocked unlimited maxproc 8146 openfiles 1024 [To increase this to 65535 for all users (as root)] # vi /etc/security/limits.conf [Modify or add "nofile" (number of file) entries - note that a userid can be used in place of *] * soft nofile 65535 * hard nofile 65535