From d38bab5edd60dbe6309512b6c8daea37ce579b70 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 19 Feb 2025 19:35:09 -0500 Subject: [PATCH] pgbench: Increase RLIMIT_NOFILE if necessary pgbench already had code to check if the soft rlimit is too low for the specified number of connections. If too low, it errored out, telling the user to increase the limit. However, we can do better: If the hard limit allows, increase the soft limit to be sufficiently for the number of connections. It is common for the soft limit to be considerably lower than the hard limit, due to the danger of soft limits > 1024 breaking programs that use the select(2), as explained in [1]. [1]: https://0pointer.net/blog/file-descriptor-limits.html Author: Jelte Fennema-Nio Reviewed-by: Andres Freund Reviewed-by: Tom Lane Discussion: https://postgr.es/m/CAGECzQQh6VSy3KG4pN1d%3Dh9J%3DD1rStFCMR%2Bt7yh_Kwj-g87aLQ%40mail.gmail.com --- src/bin/pgbench/pgbench.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 5e1fcf59c61..fdc957fa34d 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -6815,13 +6815,26 @@ main(int argc, char **argv) #ifdef HAVE_GETRLIMIT if (getrlimit(RLIMIT_NOFILE, &rlim) == -1) pg_fatal("getrlimit failed: %m"); - if (rlim.rlim_cur < nclients + 3) + + if (rlim.rlim_max < nclients + 3) { pg_log_error("need at least %d open files, but system limit is %ld", - nclients + 3, (long) rlim.rlim_cur); + nclients + 3, (long) rlim.rlim_max); pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit."); exit(1); } + + if (rlim.rlim_cur < nclients + 3) + { + rlim.rlim_cur = nclients + 3; + if (setrlimit(RLIMIT_NOFILE, &rlim) == -1) + { + pg_log_error("need at least %d open files, but couldn't raise the limit: %m", + nclients + 3); + pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit."); + exit(1); + } + } #endif /* HAVE_GETRLIMIT */ break; case 'C':