From ce7f8b30ab2976ca3ce1ea892e90373ed236fb24 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 23 Nov 2011 19:51:06 +0200 Subject: [PATCH] master: Log a warning at startup if fd limit is too low. --- src/master/master-settings.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 4f495273c8..eeb9fefb6c 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -9,6 +9,7 @@ #include "ipwd.h" #include "mkdir-parents.h" #include "safe-mkdir.h" +#include "restrict-process-size.h" #include "settings-parser.h" #include "master-settings.h" @@ -403,6 +404,8 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) static int warned_auth = FALSE, warned_anvil = FALSE; #ifdef CONFIG_BINARY const struct service_settings *default_service; +#else + rlim_t fd_limit; #endif struct master_settings *set = _set; struct service_settings *const *services; @@ -411,6 +414,8 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) struct passwd pw; unsigned int i, j, count, len, client_limit, process_limit; unsigned int max_auth_client_processes, max_anvil_client_processes; + const char *max_client_limit_source = "default_client_count"; + unsigned int max_client_limit; len = strlen(set->base_dir); if (len > 0 && set->base_dir[len-1] == '/') { @@ -484,6 +489,7 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) } } t_array_init(&all_listeners, 64); + max_client_limit = set->default_client_limit; max_auth_client_processes = 0; max_anvil_client_processes = 2; /* blocking, nonblocking pipes */ for (i = 0; i < count; i++) { @@ -525,6 +531,11 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) "vsz_limit is too low", service->name); return FALSE; } + if (max_client_limit < service->client_limit) { + max_client_limit = service->client_limit; + max_client_limit_source = t_strdup_printf( + "service %s { client_limit }", service->name); + } #ifdef CONFIG_BINARY default_service = @@ -570,6 +581,15 @@ master_settings_verify(void *_set, pool_t pool, const char **error_r) "required under max. load (%u)", 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); + } +#endif /* check for duplicate listeners */ array_sort(&all_listeners, i_strcmp_p); -- 2.47.3