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);