Add information on process-forking for TCP connections to metrics.
authorDamian Sawicki <dsawicki@google.com>
Thu, 30 Nov 2023 15:55:51 +0000 (15:55 +0000)
committerSimon Kelley <simon@thekelleys.org.uk>
Thu, 30 Nov 2023 15:55:51 +0000 (15:55 +0000)
Add the relevant information to the metrics and to the output of
dump_cache() (which is called when dnsmasq receives SIGUSR1).
Hence, users not collecting metrics will still be able to
troubleshoot with SIGUSR1. In addition to the current usage,
dump_cache() contains the information on the highest usage
since it was last called.

man/dnsmasq.8
src/cache.c
src/dnsmasq.c
src/dnsmasq.h
src/metrics.c
src/metrics.h
src/option.c

index 6d37360..1b5ebda 100644 (file)
@@ -2303,7 +2303,7 @@ they expired in order to make room for new names and the total number
 of names that have been inserted into the cache. The number of cache hits and 
 misses and the number of authoritative queries answered are also given. For each upstream
 server it gives the number of queries sent, and the number which
-resulted in an error. I
+resulted in an error. It also gives information on the number of forks for TCP connections. In
 .B --no-daemon
 mode or when full logging is enabled (\fB--log-queries\fP), a complete dump of the
 contents of the cache is made. 
index 5342ce2..07f81ad 100644 (file)
@@ -1895,7 +1895,12 @@ void dump_cache(time_t now)
 #endif
 
   blockdata_report();
-
+  my_syslog(LOG_INFO, _("child processes for TCP requests: in use %zu, highest since last SIGUSR1 %zu, max allowed %zu."),
+           daemon->metrics[METRIC_TCP_CONNECTIONS],
+           daemon->max_procs_used,
+           daemon->max_procs);
+  daemon->max_procs_used = daemon->metrics[METRIC_TCP_CONNECTIONS];
+  
   /* sum counts from different records for same server */
   for (serv = daemon->servers; serv; serv = serv->next)
     serv->flags &= ~SERV_MARK;
index 65ba334..732dce1 100644 (file)
@@ -1534,7 +1534,12 @@ static void async_event(int pipe, time_t now)
          else if (daemon->port != 0)
            for (i = 0 ; i < daemon->max_procs; i++)
              if (daemon->tcp_pids[i] == p)
-               daemon->tcp_pids[i] = 0;
+               {
+                 daemon->tcp_pids[i] = 0;
+                 /* tcp_pipes == -1 && tcp_pids == 0 required to free slot */
+                 if (daemon->tcp_pipes[i] == -1)
+                   daemon->metrics[METRIC_TCP_CONNECTIONS]--;
+               }
        break;
        
 #if defined(HAVE_SCRIPT)       
@@ -1844,6 +1849,9 @@ static void check_dns_listeners(time_t now)
        {
          close(daemon->tcp_pipes[i]);
          daemon->tcp_pipes[i] = -1;    
+         /* tcp_pipes == -1 && tcp_pids == 0 required to free slot */
+         if (daemon->tcp_pids[i] == 0)
+           daemon->metrics[METRIC_TCP_CONNECTIONS]--;
        }
        
   for (listener = daemon->listeners; listener; listener = listener->next)
@@ -1972,6 +1980,9 @@ static void check_dns_listeners(time_t now)
                  /* i holds index of free slot */
                  daemon->tcp_pids[i] = p;
                  daemon->tcp_pipes[i] = pipefd[0];
+                 daemon->metrics[METRIC_TCP_CONNECTIONS]++;
+                 if (daemon->metrics[METRIC_TCP_CONNECTIONS] > daemon->max_procs_used)
+                   daemon->max_procs_used = daemon->metrics[METRIC_TCP_CONNECTIONS];
                }
              close(confd);
 
index 67c083b..3d85b73 100644 (file)
@@ -1314,6 +1314,7 @@ extern struct daemon {
   int dumpfd;
 #endif
   int max_procs;
+  uint max_procs_used;
 } *daemon;
 
 struct server_details {
index 050ccb3..1a9a4d3 100644 (file)
@@ -39,6 +39,7 @@ const char * metric_names[] = {
     "leases_pruned_4",
     "leases_allocated_6",
     "leases_pruned_6",
+    "tcp_connections",
 };
 
 const char* get_metric_name(int i) {
index 22e9e48..e1cdd87 100644 (file)
@@ -38,6 +38,7 @@ enum {
   METRIC_LEASES_PRUNED_4,
   METRIC_LEASES_ALLOCATED_6,
   METRIC_LEASES_PRUNED_6,
+  METRIC_TCP_CONNECTIONS,
   
   __METRIC_MAX,
 };
index 9423582..3eeda18 100644 (file)
@@ -5855,6 +5855,7 @@ void read_opts(int argc, char **argv, char *compile_opts)
   daemon->randport_limit = 1;
   daemon->host_index = SRC_AH;
   daemon->max_procs = MAX_PROCS;
+  daemon->max_procs_used = 0;
   
   /* See comment above make_servers(). Optimises server-read code. */
   mark_servers(0);