From adb5f85fa5a00d6d5759df55feb16dc22b0fc8d7 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 24 Mar 2025 18:20:18 -0400 Subject: 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 Discussion: https://postgr.es/m/w6uiicyou7hzq47mbyejubtcyb2rngkkf45fk4q7inue5kfbeo@bbfad3qyubvs Discussion: https://postgr.es/m/CAGECzQQh6VSy3KG4pN1d=h9J=D1rStFCMR+t7yh_Kwj-g87aLQ@mail.gmail.com --- src/backend/storage/file/fd.c | 14 ++++++++------ src/backend/utils/misc/guc_tables.c | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 62f1185859f..0c3a2a756e7 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -1047,16 +1047,17 @@ set_max_safe_fds(void) /*---------- * 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 - * fd.c. This ensures that we won't exceed either max_files_per_process - * or the experimentally-determined EMFILE limit. + * fd.c. This ensures that we won't allow to open more than + * max_files_per_process, or the experimentally-determined EMFILE limit, + * additional files. *---------- */ count_usable_fds(max_files_per_process, &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. @@ -1070,9 +1071,10 @@ set_max_safe_fds(void) ereport(FATAL, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), 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, - FD_MINFREE + NUM_RESERVED_FDS))); + FD_MINFREE + NUM_RESERVED_FDS, + already_open))); elog(DEBUG2, "max_safe_fds = %d, usable_fds = %d, already_open = %d", max_safe_fds, usable_fds, already_open); diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 17d28f458f2..989825d3a9c 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -2680,7 +2680,7 @@ struct config_int ConfigureNamesInt[] = { {"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 }, &max_files_per_process, -- cgit v1.2.3