From 66fe8627de2c8488b7808c7b342e6ceb51f65414 Mon Sep 17 00:00:00 2001 From: Diego Fronza Date: Tue, 5 Nov 2019 17:48:47 -0300 Subject: [PATCH] Added TCP high-water statistics variable This variable will report the maximum number of simultaneous tcp clients that BIND has served while running. It can be verified by running rndc status, then inspect "tcp high-water: count", or by generating statistics file, rndc stats, then inspect the line with "TCP connection high-water" text. The tcp-highwater variable is atomically updated based on an existing tcp-quota system handled in ns/client.c. --- bin/named/server.c | 5 +++++ bin/named/statschannel.c | 3 +++ lib/isc/stats.c | 14 +++++++------- lib/ns/client.c | 7 ++++++- lib/ns/include/ns/stats.h | 4 +++- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/bin/named/server.c b/bin/named/server.c index 0cbd462b1d..e7f87e349e 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -11447,6 +11447,11 @@ named_server_status(named_server_t *server, isc_buffer_t **text) { isc_quota_getmax(&server->sctx->tcpquota)); CHECK(putstr(text, line)); + snprintf(line, sizeof(line), "TCP high-water: %u\n", + (unsigned)ns_stats_get_counter(server->sctx->nsstats, + ns_statscounter_tcphighwater)); + CHECK(putstr(text, line)); + if (server->reload_status != NAMED_RELOAD_DONE) { snprintf(line, sizeof(line), "reload/reconfig %s\n", server->reload_status == NAMED_RELOAD_FAILED diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c index d7f864acec..a955d7b207 100644 --- a/bin/named/statschannel.c +++ b/bin/named/statschannel.c @@ -241,6 +241,8 @@ init_desc(void) { SET_NSSTATDESC(invalidsig, "requests with invalid signature", "ReqBadSIG"); SET_NSSTATDESC(requesttcp, "TCP requests received", "ReqTCP"); + SET_NSSTATDESC(tcphighwater, "TCP connection high-water", + "TCPConnHighWater"); SET_NSSTATDESC(authrej, "auth queries rejected", "AuthQryRej"); SET_NSSTATDESC(recurserej, "recursive queries rejected", "RecQryRej"); SET_NSSTATDESC(xfrrej, "transfer requests rejected", "XfrRej"); @@ -322,6 +324,7 @@ init_desc(void) { "QryUsedStale"); SET_NSSTATDESC(prefetch, "queries triggered prefetch", "Prefetch"); SET_NSSTATDESC(keytagopt, "Keytag option received", "KeyTagOpt"); + INSIST(i == ns_statscounter_max); /* Initialize resolver statistics */ diff --git a/lib/isc/stats.c b/lib/isc/stats.c index 1df53498a9..44cc2d4e1b 100644 --- a/lib/isc/stats.c +++ b/lib/isc/stats.c @@ -29,17 +29,17 @@ #define ISC_STATS_VALID(x) ISC_MAGIC_VALID(x, ISC_STATS_MAGIC) #if defined(_WIN32) && !defined(_WIN64) -typedef atomic_int_fast32_t isc_stat_t; + typedef atomic_int_fast32_t isc__atomic_statcounter_t; #else -typedef atomic_int_fast64_t isc_stat_t; + typedef atomic_int_fast64_t isc__atomic_statcounter_t; #endif struct isc_stats { - unsigned int magic; - isc_mem_t *mctx; - isc_refcount_t references; - int ncounters; - isc_stat_t *counters; + unsigned int magic; + isc_mem_t *mctx; + isc_refcount_t references; + int ncounters; + isc__atomic_statcounter_t *counters; }; static isc_result_t diff --git a/lib/ns/client.c b/lib/ns/client.c index f16ece8c49..598e41179e 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -3400,7 +3400,6 @@ client_accept(ns_client_t *client) { isc_result_t result; CTRACE("accept"); - /* * Set up a new TCP connection. This means try to attach to the * TCP client quota (tcp-clients), but fail if we're over quota. @@ -3451,6 +3450,12 @@ client_accept(ns_client_t *client) { RUNTIME_CHECK(result == ISC_R_SUCCESS); } + /* TCP high-water stats update. */ + unsigned int curr_tcpquota = isc_quota_getused(&client->sctx->tcpquota); + ns_stats_update_if_greater(client->sctx->nsstats, + ns_statscounter_tcphighwater, + curr_tcpquota); + /* * If this client was set up using get_client() or get_worker(), * then TCP is already marked active. However, if it was restarted diff --git a/lib/ns/include/ns/stats.h b/lib/ns/include/ns/stats.h index f456a971b0..175813113e 100644 --- a/lib/ns/include/ns/stats.h +++ b/lib/ns/include/ns/stats.h @@ -102,7 +102,9 @@ enum { ns_statscounter_prefetch = 63, ns_statscounter_keytagopt = 64, - ns_statscounter_max = 65 + ns_statscounter_tcphighwater = 65, + + ns_statscounter_max = 66, }; void