From: Mark Andrews Date: Thu, 4 Sep 2008 08:03:08 +0000 (+0000) Subject: 2398. [bug] Improve file descriptor management. New, X-Git-Tag: v9.4.3b3~28 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=a8240cd7d56a1434d936d54488dc5de1f9988955;p=thirdparty%2Fbind9.git 2398. [bug] Improve file descriptor management. New, temporary, named.conf option reserved-sockets, default 512. [RT #18344] --- diff --git a/CHANGES b/CHANGES index 2fb68ad87dd..1c9acbc61fe 100644 --- a/CHANGES +++ b/CHANGES @@ -69,7 +69,7 @@ 2399. [bug] Abort timeout queries to reduce the number of open UDP sockets. [RT #18367] - [bug] Improve file descriptor management. New, +2398. [bug] Improve file descriptor management. New, temporary, named.conf option reserved-sockets, default 512. [RT #18344] diff --git a/bin/named/config.c b/bin/named/config.c index 68d8d3282b5..233d9e097f2 100644 --- a/bin/named/config.c +++ b/bin/named/config.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: config.c,v 1.47.18.34 2008/07/20 23:46:12 tbox Exp $ */ +/* $Id: config.c,v 1.47.18.35 2008/09/04 08:03:07 marka Exp $ */ /*! \file */ @@ -99,6 +99,7 @@ options {\n\ use-ixfr true;\n\ edns-udp-size 4096;\n\ max-udp-size 4096;\n\ + reserved-sockets 512;\n\ \n\ /* view */\n\ allow-notify {none;};\n\ diff --git a/bin/named/named.conf.docbook b/bin/named/named.conf.docbook index e4cfcc7fef0..7d2b3f69e63 100644 --- a/bin/named/named.conf.docbook +++ b/bin/named/named.conf.docbook @@ -17,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + Aug 13, 2004 @@ -201,6 +201,7 @@ options { port integer; querylog boolean; recursing-file quoted_string; + reserved-sockets integer; random-device quoted_string; recursive-clients integer; serial-query-rate integer; diff --git a/bin/named/server.c b/bin/named/server.c index 1a0d914f899..cdb600bce08 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: server.c,v 1.419.18.66 2008/08/01 02:00:41 jinmei Exp $ */ +/* $Id: server.c,v 1.419.18.67 2008/09/04 08:03:07 marka Exp $ */ /*! \file */ @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -2728,30 +2729,32 @@ static isc_result_t load_configuration(const char *filename, ns_server_t *server, isc_boolean_t first_time) { - isc_result_t result; - isc_interval_t interval; - cfg_parser_t *parser = NULL; + cfg_aclconfctx_t aclconfctx; cfg_obj_t *config; - const cfg_obj_t *options; - const cfg_obj_t *views; + cfg_parser_t *parser = NULL; + const cfg_listelt_t *element; + const cfg_obj_t *builtin_views; + const cfg_obj_t *maps[3]; const cfg_obj_t *obj; + const cfg_obj_t *options; const cfg_obj_t *usev4ports, *avoidv4ports, *usev6ports, *avoidv6ports; - const cfg_obj_t *maps[3]; - const cfg_obj_t *builtin_views; - const cfg_listelt_t *element; + const cfg_obj_t *views; dns_view_t *view = NULL; dns_view_t *view_next; - dns_viewlist_t viewlist; dns_viewlist_t tmpviewlist; - cfg_aclconfctx_t aclconfctx; - isc_uint32_t interface_interval; - isc_uint32_t heartbeat_interval; - isc_uint32_t udpsize; + dns_viewlist_t viewlist; in_port_t listen_port, udpport_low, udpport_high; + int i; + isc_interval_t interval; isc_portset_t *v4portset = NULL; isc_portset_t *v6portset = NULL; isc_resourcevalue_t nfiles; - int i; + isc_result_t result; + isc_uint32_t heartbeat_interval; + isc_uint32_t interface_interval; + isc_uint32_t reserved; + isc_uint32_t udpsize; + unsigned int maxsocks; cfg_aclconfctx_init(&aclconfctx); ISC_LIST_INIT(viewlist); @@ -2837,22 +2840,42 @@ load_configuration(const char *filename, ns_server_t *server, * but may cause subsequent runtime failures for a busy recursive * server. */ + result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &maxsocks); + if (result != ISC_R_SUCCESS) + maxsocks = 0; result = isc_resource_getcurlimit(isc_resource_openfiles, &nfiles); - if (result == ISC_R_SUCCESS) { - unsigned int maxsocks; - - result = isc_socketmgr_getmaxsockets(ns_g_socketmgr, &maxsocks); - if (result == ISC_R_SUCCESS && - (isc_resourcevalue_t)maxsocks > nfiles) { - isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, - NS_LOGMODULE_SERVER, ISC_LOG_WARNING, - "max open files " - "(%" ISC_PRINT_QUADFORMAT "u)" - " is smaller than max sockets (%u)", - nfiles, maxsocks); - } + if (result == ISC_R_SUCCESS && (isc_resourcevalue_t)maxsocks > nfiles) { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_SERVER, ISC_LOG_WARNING, + "max open files (%" ISC_PRINT_QUADFORMAT "u)" + " is smaller than max sockets (%u)", + nfiles, maxsocks); } + /* + * Set the number of socket reserved for TCP, stdio etc. + */ + obj = NULL; + result = ns_config_get(maps, "reserved-sockets", &obj); + INSIST(result == ISC_R_SUCCESS); + reserved = cfg_obj_asuint32(obj); + if (maxsocks != 0) { + if (maxsocks < 128U) /* Prevent underflow. */ + reserved = 0; + else if (reserved > maxsocks - 128U) /* Minimum UDP space. */ + reserved = maxsocks - 128; + } + /* Minimum TCP/stdio space. */ + if (reserved < 128U) + reserved = 128; + if (reserved + 128U > maxsocks && maxsocks != 0) { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_SERVER, ISC_LOG_WARNING, + "less than 128 UDP sockets available after " + "applying 'reserved-sockets' and 'maxsockets'"); + } + isc__socketmgr_setreserved(ns_g_socketmgr, reserved); + /* * Configure various server options. */ diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml index e0d4b5c6af8..f072c57a624 100644 --- a/doc/arm/Bv9ARM-book.xml +++ b/doc/arm/Bv9ARM-book.xml @@ -18,7 +18,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - + BIND 9 Administrator Reference Manual @@ -4471,6 +4471,7 @@ category notify { null; }; max-transfer-idle-in number; max-transfer-idle-out number; tcp-clients number; + reserved-sockets number; recursive-clients number; serial-query-rate number; serial-queries number; @@ -6735,6 +6736,25 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; + + reserved-sockets + + + The number of file descriptors reserved for TCP, stdio, + etc. This needs to be big enough to cover the number of + interfaces named listens on, tcp-clients as well as + to provide room for outgoing TCP queries and incoming zone + transfers. The default is 512. + The minimum value is 128 and the + maximum value is 128 less than + maxsockets (-S). This option may be removed in the future. + + + This option has little effect on Windows. + + + + max-cache-size diff --git a/lib/isc/include/isc/socket.h b/lib/isc/include/isc/socket.h index d99008f15bc..a9a22c87c57 100644 --- a/lib/isc/include/isc/socket.h +++ b/lib/isc/include/isc/socket.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.h,v 1.57.18.14 2008/08/21 00:03:25 jinmei Exp $ */ +/* $Id: socket.h,v 1.57.18.15 2008/09/04 08:03:08 marka Exp $ */ #ifndef ISC_SOCKET_H #define ISC_SOCKET_H 1 @@ -823,6 +823,12 @@ isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm, * \li #ISC_R_FAILURE */ +void +isc__socketmgr_setreserved(isc_socketmgr_t *mgr, isc_uint32_t); +/*%< + * Temporary. For use by named only. + */ + ISC_LANG_ENDDECLS #endif /* ISC_SOCKET_H */ diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index e92ef7d3244..e40563cb4d9 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.237.18.52 2008/08/21 00:03:25 jinmei Exp $ */ +/* $Id: socket.c,v 1.237.18.53 2008/09/04 08:03:08 marka Exp $ */ /*! \file */ @@ -342,6 +342,7 @@ struct isc_socketmgr { fd_set *write_fds_copy; int maxfd; #endif /* USE_SELECT */ + int reserved; /* unlocked */ #ifdef ISC_PLATFORM_USETHREADS isc_thread_t watcher; isc_condition_t shutdown_ok; @@ -1826,9 +1827,18 @@ opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) { #ifdef F_DUPFD /* - * Leave a space for stdio to work in. + * Leave a space for stdio and TCP to work in. */ - if (sock->fd >= 0 && sock->fd < 20) { + if (manager->reserved != 0 && sock->type == isc_sockettype_udp && + sock->fd >= 0 && sock->fd < manager->reserved) { + int new, tmp; + new = fcntl(sock->fd, F_DUPFD, manager->reserved); + tmp = errno; + (void)close(sock->fd); + errno = tmp; + sock->fd = new; + err = "isc_socket_create: fcntl/reserved"; + } else if (sock->fd >= 0 && sock->fd < 20) { int new, tmp; new = fcntl(sock->fd, F_DUPFD, 20); tmp = errno; @@ -3062,6 +3072,14 @@ watcher(void *uap) { } #endif /* ISC_PLATFORM_USETHREADS */ +void +isc__socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) { + + REQUIRE(VALID_MANAGER(manager)); + + manager->reserved = reserved; +} + /* * Create a new socket manager. */ @@ -3295,6 +3313,7 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, /* zero-clear so that necessary cleanup on failure will be easy */ memset(manager, 0, sizeof(*manager)); manager->maxsocks = maxsocks; + manager->reserved = 0; manager->fds = isc_mem_get(mctx, manager->maxsocks * sizeof(isc_socket_t *)); if (manager->fds == NULL) { @@ -3371,7 +3390,6 @@ isc_socketmgr_create2(isc_mem_t *mctx, isc_socketmgr_t **managerp, if (result != ISC_R_SUCCESS) goto cleanup; memset(manager->fdstate, 0, manager->maxsocks * sizeof(int)); - #ifdef ISC_PLATFORM_USETHREADS /* * Start up the select/poll thread. diff --git a/lib/isc/win32/libisc.def b/lib/isc/win32/libisc.def index 1a2fb02004d..b99efa9a235 100644 --- a/lib/isc/win32/libisc.def +++ b/lib/isc/win32/libisc.def @@ -33,6 +33,7 @@ isc__mem_putanddetach isc__mem_strdup isc__mempool_get isc__mempool_put +isc__socketmgr_setreserved isc__strerror isc_app_block isc_app_finish @@ -331,8 +332,8 @@ isc_ratelimiter_setpertic isc_ratelimiter_shutdown isc_refcount_init isc_region_compare -isc_resource_getlimit isc_resource_getcurlimit +isc_resource_getlimit isc_resource_setlimit isc_result_register isc_result_totext diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index dab814a363b..a9a91619cf2 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.30.18.32 2008/08/21 00:03:25 jinmei Exp $ */ +/* $Id: socket.c,v 1.30.18.33 2008/09/04 08:03:08 marka Exp $ */ /* This code has been rewritten to take advantage of Windows Sockets * I/O Completion Ports and Events. I/O Completion Ports is ONLY @@ -3975,3 +3975,10 @@ isc_socket_permunix(isc_sockaddr_t *addr, isc_uint32_t perm, UNUSED(group); return (ISC_R_NOTIMPLEMENTED); } + +void +isc__socketmgr_setreserved(isc_socketmgr_t *manager, isc_uint32_t reserved) { + UNUSED(manager); + UNUSED(reserved); +} + diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c index f813387efcf..a13d0a5ad7c 100644 --- a/lib/isccfg/namedconf.c +++ b/lib/isccfg/namedconf.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: namedconf.c,v 1.30.18.42 2008/06/24 23:45:56 tbox Exp $ */ +/* $Id: namedconf.c,v 1.30.18.43 2008/09/04 08:03:08 marka Exp $ */ /*! \file */ @@ -686,6 +686,7 @@ options_clauses[] = { { "recursing-file", &cfg_type_qstring, 0 }, { "random-device", &cfg_type_qstring, 0 }, { "recursive-clients", &cfg_type_uint32, 0 }, + { "reserved-sockets", &cfg_type_uint32, 0 }, { "serial-queries", &cfg_type_uint32, CFG_CLAUSEFLAG_OBSOLETE }, { "serial-query-rate", &cfg_type_uint32, 0 }, { "server-id", &cfg_type_serverid, 0 },