From bd4687186c9da23411b7a92f0a9f73a41a68900c Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Mon, 11 Oct 2021 11:08:05 +0200 Subject: [PATCH] rec: Prevent false sharing for the recursor's metrics --- pdns/rec_channel_rec.cc | 6 +- pdns/recursor_cache.hh | 5 +- pdns/recursordist/aggressive_nsec.hh | 11 +-- pdns/recursordist/negcache.hh | 3 +- pdns/syncres.cc | 32 +++---- pdns/syncres.hh | 121 ++++++++++++++------------- 6 files changed, 91 insertions(+), 87 deletions(-) diff --git a/pdns/rec_channel_rec.cc b/pdns/rec_channel_rec.cc index d19d719b0c..d05ea58426 100644 --- a/pdns/rec_channel_rec.cc +++ b/pdns/rec_channel_rec.cc @@ -74,7 +74,7 @@ bool PrefixDashNumberCompare::operator()(const std::string& a, const std::string } static map d_get32bitpointers; -static map*> d_getatomics; +static map d_getatomics; static map> d_get64bitmembers; static map> d_getmultimembers; @@ -112,7 +112,7 @@ static void addGetStat(const string& name, const uint32_t* place) d_get32bitpointers[name] = place; } -static void addGetStat(const string& name, const std::atomic* place) +static void addGetStat(const string& name, const pdns::stat_t* place) { d_getatomics[name] = place; } @@ -1164,7 +1164,7 @@ static StatsMap toCPUStatsMap(const string& name) return entries; } -static StatsMap toRPZStatsMap(const string& name, LockGuarded>>& map) +static StatsMap toRPZStatsMap(const string& name, LockGuarded>& map) { const string pbasename = getPrometheusName(name); StatsMap entries; diff --git a/pdns/recursor_cache.hh b/pdns/recursor_cache.hh index c9d0d66ba8..815539ce41 100644 --- a/pdns/recursor_cache.hh +++ b/pdns/recursor_cache.hh @@ -38,6 +38,7 @@ #include #include "iputils.hh" #include "lock.hh" +#include "stat_t.hh" #include "validate.hh" #undef max @@ -67,7 +68,7 @@ public: bool doAgeCache(time_t now, const DNSName& name, QType qtype, uint32_t newTTL); bool updateValidationStatus(time_t now, const DNSName &qname, QType qt, const ComboAddress& who, const OptTag& routingTag, bool requireAuth, vState newState, boost::optional capTTD); - std::atomic cacheHits{0}, cacheMisses{0}; + pdns::stat_t cacheHits{0}, cacheMisses{0}; private: @@ -224,7 +225,7 @@ private: } }; - std::atomic d_entriesCount{0}; + pdns::stat_t d_entriesCount{0}; LockGuardedTryHolder lock() { diff --git a/pdns/recursordist/aggressive_nsec.hh b/pdns/recursordist/aggressive_nsec.hh index 32b6336583..ec58593c2e 100644 --- a/pdns/recursordist/aggressive_nsec.hh +++ b/pdns/recursordist/aggressive_nsec.hh @@ -32,6 +32,7 @@ #include "dnsname.hh" #include "dnsrecords.hh" #include "lock.hh" +#include "stat_t.hh" class AggressiveNSECCache { @@ -137,11 +138,11 @@ private: void updateEntriesCount(SuffixMatchTree>>& zones); SharedLockGuarded>>> d_zones; - std::atomic d_nsecHits{0}; - std::atomic d_nsec3Hits{0}; - std::atomic d_nsecWildcardHits{0}; - std::atomic d_nsec3WildcardHits{0}; - std::atomic d_entriesCount{0}; + pdns::stat_t d_nsecHits{0}; + pdns::stat_t d_nsec3Hits{0}; + pdns::stat_t d_nsecWildcardHits{0}; + pdns::stat_t d_nsec3WildcardHits{0}; + pdns::stat_t d_entriesCount{0}; uint64_t d_maxEntries{0}; }; diff --git a/pdns/recursordist/negcache.hh b/pdns/recursordist/negcache.hh index 8e2d9c7e8a..c2a0fcbf96 100644 --- a/pdns/recursordist/negcache.hh +++ b/pdns/recursordist/negcache.hh @@ -29,6 +29,7 @@ #include "dnsname.hh" #include "dns.hh" #include "lock.hh" +#include "stat_t.hh" #include "validate.hh" using namespace ::boost::multi_index; @@ -113,7 +114,7 @@ private: uint64_t d_acquired_count{0}; void invalidate() {} }; - std::atomic d_entriesCount{0}; + pdns::stat_t d_entriesCount{0}; LockGuardedTryHolder lock() { diff --git a/pdns/syncres.cc b/pdns/syncres.cc index 3a9009df49..7e2a4c048f 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -65,22 +65,22 @@ unsigned int SyncRes::s_serverdownthrottletime; unsigned int SyncRes::s_nonresolvingnsmaxfails; unsigned int SyncRes::s_nonresolvingnsthrottletime; unsigned int SyncRes::s_ecscachelimitttl; -std::atomic SyncRes::s_authzonequeries; -std::atomic SyncRes::s_queries; -std::atomic SyncRes::s_outgoingtimeouts; -std::atomic SyncRes::s_outgoing4timeouts; -std::atomic SyncRes::s_outgoing6timeouts; -std::atomic SyncRes::s_outqueries; -std::atomic SyncRes::s_tcpoutqueries; -std::atomic SyncRes::s_dotoutqueries; -std::atomic SyncRes::s_throttledqueries; -std::atomic SyncRes::s_dontqueries; -std::atomic SyncRes::s_qnameminfallbacksuccess; -std::atomic SyncRes::s_unreachables; -std::atomic SyncRes::s_ecsqueries; -std::atomic SyncRes::s_ecsresponses; -std::map> SyncRes::s_ecsResponsesBySubnetSize4; -std::map> SyncRes::s_ecsResponsesBySubnetSize6; +pdns::stat_t SyncRes::s_authzonequeries; +pdns::stat_t SyncRes::s_queries; +pdns::stat_t SyncRes::s_outgoingtimeouts; +pdns::stat_t SyncRes::s_outgoing4timeouts; +pdns::stat_t SyncRes::s_outgoing6timeouts; +pdns::stat_t SyncRes::s_outqueries; +pdns::stat_t SyncRes::s_tcpoutqueries; +pdns::stat_t SyncRes::s_dotoutqueries; +pdns::stat_t SyncRes::s_throttledqueries; +pdns::stat_t SyncRes::s_dontqueries; +pdns::stat_t SyncRes::s_qnameminfallbacksuccess; +pdns::stat_t SyncRes::s_unreachables; +pdns::stat_t SyncRes::s_ecsqueries; +pdns::stat_t SyncRes::s_ecsresponses; +std::map SyncRes::s_ecsResponsesBySubnetSize4; +std::map SyncRes::s_ecsResponsesBySubnetSize6; uint8_t SyncRes::s_ecsipv4limit; uint8_t SyncRes::s_ecsipv6limit; diff --git a/pdns/syncres.hh b/pdns/syncres.hh index 1e58a8622a..2ace9e6b43 100644 --- a/pdns/syncres.hh +++ b/pdns/syncres.hh @@ -52,6 +52,7 @@ #include "proxy-protocol.hh" #include "sholder.hh" #include "histogram.hh" +#include "stat_t.hh" #include "tcpiohandler.hh" #ifdef HAVE_CONFIG_H @@ -734,22 +735,22 @@ public: static thread_local ThreadLocalStorage t_sstorage; - static std::atomic s_queries; - static std::atomic s_outgoingtimeouts; - static std::atomic s_outgoing4timeouts; - static std::atomic s_outgoing6timeouts; - static std::atomic s_throttledqueries; - static std::atomic s_dontqueries; - static std::atomic s_qnameminfallbacksuccess; - static std::atomic s_authzonequeries; - static std::atomic s_outqueries; - static std::atomic s_tcpoutqueries; - static std::atomic s_dotoutqueries; - static std::atomic s_unreachables; - static std::atomic s_ecsqueries; - static std::atomic s_ecsresponses; - static std::map> s_ecsResponsesBySubnetSize4; - static std::map> s_ecsResponsesBySubnetSize6; + static pdns::stat_t s_queries; + static pdns::stat_t s_outgoingtimeouts; + static pdns::stat_t s_outgoing4timeouts; + static pdns::stat_t s_outgoing6timeouts; + static pdns::stat_t s_throttledqueries; + static pdns::stat_t s_dontqueries; + static pdns::stat_t s_qnameminfallbacksuccess; + static pdns::stat_t s_authzonequeries; + static pdns::stat_t s_outqueries; + static pdns::stat_t s_tcpoutqueries; + static pdns::stat_t s_dotoutqueries; + static pdns::stat_t s_unreachables; + static pdns::stat_t s_ecsqueries; + static pdns::stat_t s_ecsresponses; + static std::map s_ecsResponsesBySubnetSize4; + static std::map s_ecsResponsesBySubnetSize6; static string s_serverID; static unsigned int s_minimumTTL; @@ -1023,9 +1024,9 @@ MT_t* getMT(); struct RecursorStats { - std::atomic servFails; - std::atomic nxDomains; - std::atomic noErrors; + pdns::stat_t servFails; + pdns::stat_t nxDomains; + pdns::stat_t noErrors; pdns::AtomicHistogram answers; pdns::AtomicHistogram auth4Answers; pdns::AtomicHistogram auth6Answers; @@ -1035,48 +1036,48 @@ struct RecursorStats pdns::AtomicHistogram cumulativeAuth6Answers; std::atomic avgLatencyUsec; std::atomic avgLatencyOursUsec; - std::atomic qcounter; // not increased for unauth packets - std::atomic ipv6qcounter; - std::atomic tcpqcounter; - std::atomic unauthorizedUDP; // when this is increased, qcounter isn't - std::atomic unauthorizedTCP; // when this is increased, qcounter isn't - std::atomic policyDrops; - std::atomic tcpClientOverflow; - std::atomic clientParseError; - std::atomic serverParseError; - std::atomic tooOldDrops; - std::atomic truncatedDrops; - std::atomic queryPipeFullDrops; - std::atomic unexpectedCount; - std::atomic caseMismatchCount; - std::atomic spoofCount; - std::atomic resourceLimits; - std::atomic overCapacityDrops; - std::atomic ipv6queries; - std::atomic chainResends; - std::atomic nsSetInvalidations; - std::atomic ednsPingMatches; - std::atomic ednsPingMismatches; - std::atomic noPingOutQueries, noEdnsOutQueries; - std::atomic packetCacheHits; - std::atomic noPacketError; - std::atomic ignoredCount; - std::atomic emptyQueriesCount; + pdns::stat_t qcounter; // not increased for unauth packets + pdns::stat_t ipv6qcounter; + pdns::stat_t tcpqcounter; + pdns::stat_t unauthorizedUDP; // when this is increased, qcounter isn't + pdns::stat_t unauthorizedTCP; // when this is increased, qcounter isn't + pdns::stat_t policyDrops; + pdns::stat_t tcpClientOverflow; + pdns::stat_t clientParseError; + pdns::stat_t serverParseError; + pdns::stat_t tooOldDrops; + pdns::stat_t truncatedDrops; + pdns::stat_t queryPipeFullDrops; + pdns::stat_t unexpectedCount; + pdns::stat_t caseMismatchCount; + pdns::stat_t spoofCount; + pdns::stat_t resourceLimits; + pdns::stat_t overCapacityDrops; + pdns::stat_t ipv6queries; + pdns::stat_t chainResends; + pdns::stat_t nsSetInvalidations; + pdns::stat_t ednsPingMatches; + pdns::stat_t ednsPingMismatches; + pdns::stat_t noPingOutQueries, noEdnsOutQueries; + pdns::stat_t packetCacheHits; + pdns::stat_t noPacketError; + pdns::stat_t ignoredCount; + pdns::stat_t emptyQueriesCount; time_t startupTime; - std::atomic dnssecQueries; - std::atomic dnssecAuthenticDataQueries; - std::atomic dnssecCheckDisabledQueries; - std::atomic variableResponses; - std::atomic maxMThreadStackUsage; - std::atomic dnssecValidations; // should be the sum of all dnssecResult* stats - std::map > dnssecResults; - std::map > xdnssecResults; - std::map > policyResults; - LockGuarded>> policyHits; - std::atomic rebalancedQueries{0}; - std::atomic proxyProtocolInvalidCount{0}; - std::atomic nodLookupsDroppedOversize{0}; - std::atomic dns64prefixanswers{0}; + pdns::stat_t dnssecQueries; + pdns::stat_t dnssecAuthenticDataQueries; + pdns::stat_t dnssecCheckDisabledQueries; + pdns::stat_t variableResponses; + pdns::stat_t maxMThreadStackUsage; + pdns::stat_t dnssecValidations; // should be the sum of all dnssecResult* stats + std::map dnssecResults; + std::map xdnssecResults; + std::map policyResults; + LockGuarded> policyHits; + pdns::stat_t rebalancedQueries{0}; + pdns::stat_t proxyProtocolInvalidCount{0}; + pdns::stat_t nodLookupsDroppedOversize{0}; + pdns::stat_t dns64prefixanswers{0}; RecursorStats() : answers("answers", { 1000, 10000, 100000, 1000000 }), -- 2.47.2