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:
parent
7d559c8580
commit
adb5f85fa5
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user