[PATCH] increase fd_limit to max_client_limit automatically

Lauri Tirkkonen ltirkkon at niksula.hut.fi
Thu Jan 22 12:01:24 UTC 2015


Hi, with a low soft limit on file descriptors, dovecot 2.2.15 warns on
startup:

    Warning: fd limit (ulimit -n) is lower than required under max. load
    (256 < 1000), because of default_client_limit

It could try increasing the limit first, and only report the warning if that
fails. I'm attaching a patch that does just this.

Without the patch, the soft fd limit is kept at whatever it was on dovecot
startup:

    % pfexec plimit $(pgrep dovecot)
    18737:  /opt/niksula/sbin/dovecot
       resource              current         maximum
      time(seconds)         unlimited       unlimited
      file(blocks)          unlimited       unlimited
      data(kbytes)          unlimited       unlimited
      stack(kbytes)         10240           unlimited
      coredump(blocks)      unlimited       unlimited
      nofiles(descriptors)  256             65536
      vmemory(kbytes)       unlimited       unlimited

and with patch applied, it's increased to max_client_limit:

    % pfexec plimit $(pgrep dovecot)                                 
    18775:  /opt/niksula/sbin/dovecot
       resource              current         maximum
      time(seconds)         unlimited       unlimited
      file(blocks)          unlimited       unlimited
      data(kbytes)          unlimited       unlimited
      stack(kbytes)         10240           unlimited
      coredump(blocks)      unlimited       unlimited
      nofiles(descriptors)  1000            65536
      vmemory(kbytes)       unlimited       unlimited

It should probably be increased to higher than that to account for fds
other than client sockets, but I don't have insights into that.

-- 
Lauri Tirkkonen
Niksula systems specialist
-------------- next part --------------
diff -r e30e9b2b0e37 src/master/master-settings.c
--- a/src/master/master-settings.c	Wed Jan 21 02:21:35 2015 +0200
+++ b/src/master/master-settings.c	Thu Jan 22 13:39:41 2015 +0200
@@ -18,6 +18,7 @@
 #include <unistd.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <sys/resource.h>
 
 static bool master_settings_verify(void *_set, pool_t pool,
 				   const char **error_r);
@@ -418,7 +419,7 @@
 #ifdef CONFIG_BINARY
 	const struct service_settings *default_service;
 #else
-	rlim_t fd_limit;
+	struct rlimit fd_limit;
 	const char *max_client_limit_source = "default_client_limit";
 	unsigned int max_client_limit = set->default_client_limit;
 #endif
@@ -591,12 +592,18 @@
 			  client_limit, max_anvil_client_processes);
 	}
 #ifndef CONFIG_BINARY
-	if (restrict_get_fd_limit(&fd_limit) == 0 &&
-	    fd_limit < (rlim_t)max_client_limit) {
-		i_warning("fd limit (ulimit -n) is lower than required "
-			  "under max. load (%u < %u), because of %s",
-			  (unsigned int)fd_limit, max_client_limit,
-			  max_client_limit_source);
+	if (getrlimit(RLIMIT_NOFILE, &fd_limit) == 0) {
+#ifdef HAVE_SETRLIMIT
+		rlim_t old = fd_limit.rlim_cur;
+		fd_limit.rlim_cur = I_MAX(old, max_client_limit);
+		if (setrlimit(RLIMIT_NOFILE, &fd_limit) < 0)
+			fd_limit.rlim_cur = old;
+#endif
+		if (fd_limit.rlim_cur < (rlim_t)max_client_limit)
+			i_warning("fd limit (ulimit -n) is lower than required "
+			    "under max. load (%u < %u), because of %s",
+			    (unsigned int)fd_limit.rlim_cur, max_client_limit,
+			    max_client_limit_source);
 	}
 #endif
 


More information about the dovecot mailing list