As of 10.10, the maximum allowed number of simultaneous open files, or maximum number of file descriptors,
has been raised from 2048 to 60000 per process.
This value is specified by the constant MAXFUPLIM (and
the equivalents _MAXFUPLIM and FD_SETSIZE).
This feature is optional because
it will not be often used and to minimize
the impact on existing code. An application requiring more than 2048 file
descriptors must be recompiled with the new symbol _USE_BIG_FDS
defined. To do this, add the
flag D_USE_BIG_FDS to the compile command in the application's
makefile. Or, the symbol can be defined at the beginning of every
application source file (via #define _USE_BIG_FDS).
As in previous releases, there are also per-application resource
limits, independent of the MAXFUPLIM limit. To use a large
amount of file descriptors, your application might need to
modify its RLIMIT_NOFILE resource limits with
getrlimit(2) and setrlimit(2). See
the manpages for these system calls for more information.
Alternatively, the system-wide RLIMIT_NOFILE defaults can be changed
(as in previous releases) by modifying the kernel tunables maxfiles
and maxfiles_lim; see the SAM on-line kernel configuration help for
more information.
Any machine running an application that uses a large amount of file
descriptors might need to be reconfigured with a larger value for the
kernel tunable nfile. This tunable specifies the per-machine (as
opposed to per-process) maximum number of simultaneous open files
and is by default much less than 60000. See the SAM online kernel
configuration help for more information.
Use of this new feature is not compatible with all libraries. Users
need to review the libraries used by their application to
determine if they can use this feature. See the section "Impacts"
below for more information.
You can use SAM to implement this feature. The kernel tunables
table reflect new maximum values for the tunables maxfiles and
maxfiles_lim, from 2048 to 60000.
Impacts |
 |
This new functionality might have three possible affects:
For all user-space code (commands, libraries,
applications, and user code):
User-space code that raises its RLIMIT_NOFILE resource limit with
setrlimit (see above) beyond MAXFUPLIM might fail.
The RLIMIT_NOFILE resource limit cannot exceed MAXFUPLIM.
In previous releases, the kernel and user space MAXFUPLIM values
were the same. To support 60K file descriptors, the kernel
MAXFUPLIM is now
60000. However, to maintain compatibility with previous releases,
user applications by default will still use a MAXFUPLIM of 2048.
If an application with a small MAXFUPLIM "succeeds" in raising
its resource limit above 2048, subsequent failures might occur. For
example, you can now open more than 2048 files (assuming that
the kernel tunable nfile is sufficiently large),
though select(2) data structures are sized for only 2048 file
descriptors. A select call might hang or might cause a
segmentation violation depending on the arguments passed to it. See the select
manpage and the <sys/types.h> header file for more
information.
There are no workarounds for this impact; impacted code
must be modified.
For code opting for 60K file descriptor functionality:
The use of 60K file descriptors in conjunction with some libraries
is not supported. A library compiled with the old MAXFUPLIM
value might not work with applications using the new MAXFUPLIM value. Any calls to
select(2) made by a library function on behalf of the application would fail
if you had more than 2048 open files, as in the preceding
item above.
The use of 60K file descriptors in conjunction with the following
libraries is not supported:
X Window System libraries
Pascal and Fortran libraries
3D graphics libraries (Starbase, HP PEX, and HP-PHIGS)
For code opting for 60K file descriptor functionality:
Programs that opt for 60K file descriptors might experience
excessive memory usage or performance problems.
The fd_set data structure used in select(2) is sized with the
FD_SETSIZE constant (equivalent to MAXFUPLIM). Increasing this
constant from 2048 to 60000 increases the amount of memory used by
an fd_set from 256 bytes to about 7500 bytes.
Most applications that use fd_sets use only a few. However,
there might be applications that use many. Recompiling those
applications to use 60K file descriptors will cause a large increase
in memory usage, which may be problematic.
The same problem exists for applications that use MAXFUPLIM or
FD_SETSIZE to size other data structures.
For similar reasons, applications opting for 60K file descriptors might
experience performance degradation if the application uses
MAXFUPLIM or FD_SETSIZE
as a loop bound or as a select nfds argument
(see the select manpage for details).
Alternatives |
 |
To minimize the impact on existing code,
the 60K file descriptor feature is optional.
Existing code, even as it is
recompiled, continues to use the old MAXFUPLIM value of 2048
unless a different value is selected by defining _USE_BIG_FDS.
Whether code is recompiled with or without _USE_BIG_FDS or even if
the code is not recompiled (such as existing binaries), it may be
vulnerable to the first impact described above. There is no workaround for this impact.
Size Requirement |
 |
Approximately 1 KB of memory is used by the kernel to store 32 file
descriptors, both in the per-process file descriptor table and the
system-wide file table (sized by nfile, above). 60K file
descriptors can use as much as 2 MB. Thus, excessive use of this
feature may not be possible on small-memory machines.