1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-21 12:05:57 +03:00

Redefine max_files_per_process to control additionally opened files

Until now max_files_per_process=N limited each backend to open N files in
total (minus a safety factor), even if there were already more files opened in
postmaster and inherited by backends.  Change max_files_per_process to control
how many additional files each process is allowed to open.

The main motivation for this is the patch to add io_method=io_uring, which
needs to open one file for each backend.  Without this patch, even if
RLIMIT_NOFILE is high enough, postmaster will fail in set_max_safe_fds() if
started with a high max_connections.  The cause of the failure is that, until
now, set_max_safe_fds() subtracted the already open files from
max_files_per_process.

Reviewed-by: Noah Misch <noah@leadboat.com>
Discussion: https://postgr.es/m/w6uiicyou7hzq47mbyejubtcyb2rngkkf45fk4q7inue5kfbeo@bbfad3qyubvs
Discussion: https://postgr.es/m/CAGECzQQh6VSy3KG4pN1d=h9J=D1rStFCMR+t7yh_Kwj-g87aLQ@mail.gmail.com
This commit is contained in:
Andres Freund 2025-03-24 18:20:18 -04:00
parent 7d559c8580
commit adb5f85fa5
3 changed files with 15 additions and 9 deletions

View File

@ -2378,8 +2378,12 @@ include_dir 'conf.d'
</term> </term>
<listitem> <listitem>
<para> <para>
Sets the maximum number of simultaneously open files allowed to each Sets the maximum number of open files each server subprocess is
server subprocess. The default is one thousand files. If the kernel is enforcing allowed to open simultaneously, in addition to the files already open
in postmaster. The default is one thousand files.
</para>
<para>
If the kernel is enforcing
a safe per-process limit, you don't need to worry about this setting. a safe per-process limit, you don't need to worry about this setting.
But on some platforms (notably, most BSD systems), the kernel will But on some platforms (notably, most BSD systems), the kernel will
allow individual processes to open many more files than the system allow individual processes to open many more files than the system

View File

@ -1047,16 +1047,17 @@ set_max_safe_fds(void)
/*---------- /*----------
* We want to set max_safe_fds to * We want to set max_safe_fds to
* MIN(usable_fds, max_files_per_process - already_open) * MIN(usable_fds, max_files_per_process)
* less the slop factor for files that are opened without consulting * less the slop factor for files that are opened without consulting
* fd.c. This ensures that we won't exceed either max_files_per_process * fd.c. This ensures that we won't allow to open more than
* or the experimentally-determined EMFILE limit. * max_files_per_process, or the experimentally-determined EMFILE limit,
* additional files.
*---------- *----------
*/ */
count_usable_fds(max_files_per_process, count_usable_fds(max_files_per_process,
&usable_fds, &already_open); &usable_fds, &already_open);
max_safe_fds = Min(usable_fds, max_files_per_process - already_open); max_safe_fds = Min(usable_fds, max_files_per_process);
/* /*
* Take off the FDs reserved for system() etc. * Take off the FDs reserved for system() etc.
@ -1070,9 +1071,10 @@ set_max_safe_fds(void)
ereport(FATAL, ereport(FATAL,
(errcode(ERRCODE_INSUFFICIENT_RESOURCES), (errcode(ERRCODE_INSUFFICIENT_RESOURCES),
errmsg("insufficient file descriptors available to start server process"), errmsg("insufficient file descriptors available to start server process"),
errdetail("System allows %d, server needs at least %d.", errdetail("System allows %d, server needs at least %d, %d files are already open.",
max_safe_fds + NUM_RESERVED_FDS, max_safe_fds + NUM_RESERVED_FDS,
FD_MINFREE + NUM_RESERVED_FDS))); FD_MINFREE + NUM_RESERVED_FDS,
already_open)));
elog(DEBUG2, "max_safe_fds = %d, usable_fds = %d, already_open = %d", elog(DEBUG2, "max_safe_fds = %d, usable_fds = %d, already_open = %d",
max_safe_fds, usable_fds, already_open); max_safe_fds, usable_fds, already_open);

View File

@ -2680,7 +2680,7 @@ struct config_int ConfigureNamesInt[] =
{ {
{"max_files_per_process", PGC_POSTMASTER, RESOURCES_KERNEL, {"max_files_per_process", PGC_POSTMASTER, RESOURCES_KERNEL,
gettext_noop("Sets the maximum number of simultaneously open files for each server process."), gettext_noop("Sets the maximum number of files each server process is allowed to open simultaneously."),
NULL NULL
}, },
&max_files_per_process, &max_files_per_process,