]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2398. [bug] Improve file descriptor management. New,
authorMark Andrews <marka@isc.org>
Thu, 4 Sep 2008 08:03:08 +0000 (08:03 +0000)
committerMark Andrews <marka@isc.org>
Thu, 4 Sep 2008 08:03:08 +0000 (08:03 +0000)
                        temporary, named.conf option reserved-sockets,
                        default 512. [RT #18344]

CHANGES
bin/named/config.c
bin/named/named.conf.docbook
bin/named/server.c
doc/arm/Bv9ARM-book.xml
lib/isc/include/isc/socket.h
lib/isc/unix/socket.c
lib/isc/win32/libisc.def
lib/isc/win32/socket.c
lib/isccfg/namedconf.c

diff --git a/CHANGES b/CHANGES
index 2fb68ad87dd1d9cf18fca53abda5b4f9e1dcf8a8..1c9acbc61fee137760b84071886cee3137493042 100644 (file)
--- 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]
 
index 68d8d3282b5a87f8d7119a0b084136f30810eefa..233d9e097f26a809708f023b604a4254fdc6d70e 100644 (file)
@@ -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\
index e4cfcc7fef015953536e1bc72aaf2322973f5188..7d2b3f69e633bb0a426907d6e0e694b77e5317c4 100644 (file)
@@ -17,7 +17,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id: named.conf.docbook,v 1.1.2.29 2007/08/28 07:20:01 tbox Exp $ -->
+<!-- $Id: named.conf.docbook,v 1.1.2.30 2008/09/04 08:03:07 marka Exp $ -->
 <refentry>
   <refentryinfo>
     <date>Aug 13, 2004</date>
@@ -201,6 +201,7 @@ options {
        port <replaceable>integer</replaceable>;
        querylog <replaceable>boolean</replaceable>;
        recursing-file <replaceable>quoted_string</replaceable>;
+       reserved-sockets <replaceable>integer</replaceable>;
        random-device <replaceable>quoted_string</replaceable>;
        recursive-clients <replaceable>integer</replaceable>;
        serial-query-rate <replaceable>integer</replaceable>;
index 1a0d914f89959b961ca48d5b9331e189f0cfb163..cdb600bce08bffbf5ccefee2335bf8956395faa4 100644 (file)
@@ -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 <isc/portset.h>
 #include <isc/print.h>
 #include <isc/resource.h>
+#include <isc/socket.h>
 #include <isc/stdio.h>
 #include <isc/string.h>
 #include <isc/task.h>
@@ -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.
         */
index e0d4b5c6af8048291486998d2df7020804888ca6..f072c57a6241c9d52474f57d88db654b6f636d8a 100644 (file)
@@ -18,7 +18,7 @@
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- File: $Id: Bv9ARM-book.xml,v 1.241.18.90 2008/07/27 04:45:12 marka Exp $ -->
+<!-- File: $Id: Bv9ARM-book.xml,v 1.241.18.91 2008/09/04 08:03:08 marka Exp $ -->
 <book xmlns:xi="http://www.w3.org/2001/XInclude">
   <title>BIND 9 Administrator Reference Manual</title>
 
@@ -4471,6 +4471,7 @@ category notify { null; };
     <optional> max-transfer-idle-in <replaceable>number</replaceable>; </optional>
     <optional> max-transfer-idle-out <replaceable>number</replaceable>; </optional>
     <optional> tcp-clients <replaceable>number</replaceable>; </optional>
+    <optional> reserved-sockets <replaceable>number</replaceable>; </optional>
     <optional> recursive-clients <replaceable>number</replaceable>; </optional>
     <optional> serial-query-rate <replaceable>number</replaceable>; </optional>
     <optional> serial-queries <replaceable>number</replaceable>; </optional>
@@ -6735,6 +6736,25 @@ avoid-v6-udp-ports { 40000; range 50000 60000; };
               </listitem>
             </varlistentry>
 
+            <varlistentry>
+              <term><command>reserved-sockets</command></term>
+              <listitem>
+                <para>
+                 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 <literal>512</literal>.
+                 The minimum value is <literal>128</literal> and the
+                 maximum value is <literal>128</literal> less than
+                 maxsockets (-S).  This option may be removed in the future.
+                </para>
+                <para>
+                 This option has little effect on Windows.
+                </para>
+              </listitem>
+            </varlistentry>
+
             <varlistentry>
               <term><command>max-cache-size</command></term>
               <listitem>
index d99008f15bc04358547f2a0b4831bf332a824818..a9a22c87c57c9838b6ff3feb16a1253781784e35 100644 (file)
@@ -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 */
index e92ef7d32443b7c46a84bed7a1573c7ddeb14dae..e40563cb4d92523052ccf28a2592e09aca480ec4 100644 (file)
@@ -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.
index 1a2fb02004d097f3d668fc346b1643e9a1721acc..b99efa9a235937f1349be95bea3337bd4c938962 100644 (file)
@@ -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
index dab814a363b7f5dce73d79e73e2ac1d24e4ee358..a9a91619cf2273ca5411cf263a7aaae61f5cc413 100644 (file)
@@ -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);
+}
+
index f813387efcf71ab7c097d84af8de20347615513c..a13d0a5ad7cdae831666695ea8260ca2183deb62 100644 (file)
@@ -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 },