Hello dnsmasq experts, Following up on the recent addition of the flag --max-tcp-connections, I'd like to propose a patch with monitoring of the number of TCP connections. This way, a user can actually estimate their usage and adjust --max-tcp-connections accordingly to prevent overload.
The patch adds 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. Please kindly let me know what you think. Best regards, Damian Sawicki * Add to the metrics and dump_cache() the info on the utilisation of the limit on concurrent TCP connections (the variable daemon->max_procs, customisable via --max-tcp-connections). --- man/dnsmasq.8 | 2 +- src/cache.c | 5 +++++ src/dnsmasq.c | 11 ++++++++++- src/dnsmasq.h | 1 + src/metrics.c | 1 + src/metrics.h | 1 + src/option.c | 1 + 7 files changed, 20 insertions(+), 2 deletions(-) diff --git a/man/dnsmasq.8 b/man/dnsmasq.8 index 6d37360..1b5ebda 100644 --- a/man/dnsmasq.8 +++ b/man/dnsmasq.8 @@ -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. In +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. diff --git a/src/cache.c b/src/cache.c index 5342ce2..b95e3c7 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1895,6 +1895,11 @@ 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 %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) diff --git a/src/dnsmasq.c b/src/dnsmasq.c index 65ba334..39aaf19 100644 --- a/src/dnsmasq.c +++ b/src/dnsmasq.c @@ -1534,7 +1534,11 @@ 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; + if (daemon->tcp_pipes[i] == -1) + daemon->metrics[METRIC_TCP_CONNECTIONS]--; + } break; #if defined(HAVE_SCRIPT) @@ -1844,6 +1848,8 @@ static void check_dns_listeners(time_t now) { close(daemon->tcp_pipes[i]); daemon->tcp_pipes[i] = -1; + if (daemon->tcp_pids[i] == 0) + daemon->metrics[METRIC_TCP_CONNECTIONS]--; } for (listener = daemon->listeners; listener; listener = listener->next) @@ -1972,6 +1978,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); diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 67c083b..3d85b73 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -1314,6 +1314,7 @@ extern struct daemon { int dumpfd; #endif int max_procs; + uint max_procs_used; } *daemon; struct server_details { diff --git a/src/metrics.c b/src/metrics.c index 050ccb3..1a9a4d3 100644 --- a/src/metrics.c +++ b/src/metrics.c @@ -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) { diff --git a/src/metrics.h b/src/metrics.h index 22e9e48..e1cdd87 100644 --- a/src/metrics.h +++ b/src/metrics.h @@ -38,6 +38,7 @@ enum { METRIC_LEASES_PRUNED_4, METRIC_LEASES_ALLOCATED_6, METRIC_LEASES_PRUNED_6, + METRIC_TCP_CONNECTIONS, __METRIC_MAX, }; diff --git a/src/option.c b/src/option.c index 9423582..3eeda18 100644 --- a/src/option.c +++ b/src/option.c @@ -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); -- 2.43.0.rc1.413.gea7ed67945-goog _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss