From: Otto Moerbeek Date: Fri, 24 Feb 2023 10:32:22 +0000 (+0100) Subject: Add contention/acquired stats to sharded packet cache X-Git-Tag: rec-4.9.0-alpha1~7^2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c8d4dc0f7233344762611599cd6e6e5791a200c;p=thirdparty%2Fpdns.git Add contention/acquired stats to sharded packet cache --- diff --git a/pdns/recursordist/RECURSOR-MIB.txt b/pdns/recursordist/RECURSOR-MIB.txt index 816fc47d0e..5d04fa74f6 100644 --- a/pdns/recursordist/RECURSOR-MIB.txt +++ b/pdns/recursordist/RECURSOR-MIB.txt @@ -54,6 +54,9 @@ rec MODULE-IDENTITY REVISION "202209120000Z" DESCRIPTION "Added metrics for answers from auths by rcode" + REVISION "202302240000Z" + DESCRIPTION "Added metrics for sharded packet cache contrntion" + ::= { powerdns 2 } powerdns OBJECT IDENTIFIER ::= { enterprises 43315 } @@ -1212,6 +1215,22 @@ authrcode15Count OBJECT-TYPE "Number of rcode 15 answers received" ::= { stats 144 } +packetCacheContended OBJECT-TYPE + SYNTAX Counter64 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "Number of contended packet cache lock acquisitions" + ::= { stats 145 } + +packetCacheAcquired OBJECT-TYPE + SYNTAX Counter64 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "Number of packet cache lock acquisitions" + ::= { stats 146 } + --- --- Traps / Notifications diff --git a/pdns/recursordist/rec-snmp.cc b/pdns/recursordist/rec-snmp.cc index 7ffce2acb1..d7a4ad64f9 100644 --- a/pdns/recursordist/rec-snmp.cc +++ b/pdns/recursordist/rec-snmp.cc @@ -167,6 +167,9 @@ static const oid rcode13AnswersOID[] = {RECURSOR_STATS_OID, 142}; static const oid rcode14AnswersOID[] = {RECURSOR_STATS_OID, 143}; static const oid rcode15AnswersOID[] = {RECURSOR_STATS_OID, 144}; +static const oid packetCacheContendedOID[] = {RECURSOR_STATS_OID, 145}; +static const oid packetCacheAcquiredOID[] = {RECURSOR_STATS_OID, 146}; + static std::unordered_map s_statsMap; /* We are never called for a GETNEXT if it's registered as a @@ -401,6 +404,8 @@ RecursorSNMPAgent::RecursorSNMPAgent(const std::string& name, const std::string& registerCounter64Stat("non-resolving-nameserver-entries", nonResolvingNameserverEntriesOID, OID_LENGTH(nonResolvingNameserverEntriesOID)); registerCounter64Stat("maintenance-usec", maintenanceUSecOID, OID_LENGTH(maintenanceUSecOID)); registerCounter64Stat("maintenance-calls", maintenanceCallsOID, OID_LENGTH(maintenanceCallsOID)); + registerCounter64Stat("packetcache-contended", packetCacheContendedOID, OID_LENGTH(packetCacheContendedOID)); + registerCounter64Stat("packetcache-acquired", packetCacheAcquiredOID, OID_LENGTH(packetCacheAcquiredOID)); #define RCODE(num) registerCounter64Stat("auth-" + RCode::to_short_s(num) + "-answers", rcode##num##AnswersOID, OID_LENGTH(rcode##num##AnswersOID)) RCODE(0); diff --git a/pdns/recursordist/rec_channel_rec.cc b/pdns/recursordist/rec_channel_rec.cc index 9bbc49df6e..4e82cf6041 100644 --- a/pdns/recursordist/rec_channel_rec.cc +++ b/pdns/recursordist/rec_channel_rec.cc @@ -401,18 +401,19 @@ static RecursorControlChannel::Answer doDumpToFile(int s, uint64_t* (*function)( } // Does not follow the generic dump to file pattern, has a more complex lambda -static RecursorControlChannel::Answer doDumpCache(int s) +static RecursorControlChannel::Answer doDumpCache(int socket) { - auto fdw = getfd(s); + auto fdw = getfd(socket); if (fdw < 0) { return {1, "Error opening dump file for writing: " + stringerror() + "\n"}; } uint64_t total = 0; try { - int fd = fdw; - total = g_recCache->doDump(fd, g_maxCacheEntries.load()) + g_negCache->doDump(fd, g_maxCacheEntries.load() / 8) + - (g_packetCache ? g_packetCache->doDump(fd) : 0) + dumpAggressiveNSECCache(fd); + total += g_recCache->doDump(fdw, g_maxCacheEntries.load()); + total += g_negCache->doDump(fdw, g_maxCacheEntries.load() / 8); + total += g_packetCache ? g_packetCache->doDump(fdw) : 0; + total += dumpAggressiveNSECCache(fdw); } catch (...) { } @@ -1265,7 +1266,9 @@ static void registerAllStats1() addGetStat("packetcache-hits", [] { return g_packetCache ? g_packetCache->getHits() : 0; }); addGetStat("packetcache-misses", [] { return g_packetCache ? g_packetCache->getMisses() : 0; }); addGetStat("packetcache-entries", [] { return g_packetCache ? g_packetCache->size() : 0; }); - addGetStat("packetcache-bytes", [] { return g_packetCache ? g_packetCache->bytes() : 0; });; + addGetStat("packetcache-bytes", [] { return g_packetCache ? g_packetCache->bytes() : 0; }); + addGetStat("packetcache-contended", []() { return g_packetCache ? g_packetCache->stats().first : 0; }); + addGetStat("packetcache-acquired", []() { return g_packetCache ? g_packetCache->stats().second : 0; }); addGetStat("aggressive-nsec-cache-entries", []() { return g_aggressiveNSECCache ? g_aggressiveNSECCache->getEntriesCount() : 0; }); addGetStat("aggressive-nsec-cache-nsec-hits", []() { return g_aggressiveNSECCache ? g_aggressiveNSECCache->getNSECHits() : 0; }); diff --git a/pdns/recursordist/recpacketcache.cc b/pdns/recursordist/recpacketcache.cc index 10fa9cbd1d..48fb138fc3 100644 --- a/pdns/recursordist/recpacketcache.cc +++ b/pdns/recursordist/recpacketcache.cc @@ -53,6 +53,18 @@ uint64_t RecursorPacketCache::getMisses() return sum; } +pair RecursorPacketCache::stats() +{ + uint64_t contended = 0; + uint64_t acquired = 0; + for (auto& shard : d_maps) { + auto content = shard.lock(); + contended += content->d_contended_count; + acquired += content->d_acquired_count; + } + return {contended, acquired}; +} + uint64_t RecursorPacketCache::doWipePacketCache(const DNSName& name, uint16_t qtype, bool subtree) { uint64_t count = 0; @@ -260,7 +272,7 @@ uint64_t RecursorPacketCache::doDump(int file) min = std::min(min, shardSize); max = std::max(max, shardSize); shardNum++; - for (const auto& entry : sidx) { + for (const auto& entry : sidx) { count++; try { fprintf(filePtr.get(), "%s %" PRId64 " %s ; tag %d %s\n", entry.d_name.toString().c_str(), static_cast(entry.d_ttd - now), DNSRecordContent::NumberToType(entry.d_type).c_str(), entry.d_tag, entry.d_tcp ? "tcp" : "udp"); diff --git a/pdns/recursordist/recpacketcache.hh b/pdns/recursordist/recpacketcache.hh index 8ebc46ecd4..10a005b897 100644 --- a/pdns/recursordist/recpacketcache.hh +++ b/pdns/recursordist/recpacketcache.hh @@ -99,6 +99,7 @@ public: [[nodiscard]] uint64_t bytes(); [[nodiscard]] uint64_t getHits(); [[nodiscard]] uint64_t getMisses(); + [[nodiscard]] pair stats(); private: struct Entry @@ -207,7 +208,8 @@ private: size_t d_maxSize; static bool qrMatch(const packetCache_t::index::type::iterator& iter, const std::string& queryPacket, const DNSName& qname, uint16_t qtype, uint16_t qclass); -bool checkResponseMatches(MapCombo::LockedContent& shard, std::pair::type::iterator, packetCache_t::index::type::iterator> range, const std::string& queryPacket, const DNSName& qname, uint16_t qtype, uint16_t qclass, time_t now, std::string* responsePacket, uint32_t* age, vState* valState, OptPBData* pbdata); + bool checkResponseMatches(MapCombo::LockedContent& shard, std::pair::type::iterator, packetCache_t::index::type::iterator> range, const std::string& queryPacket, const DNSName& qname, uint16_t qtype, uint16_t qclass, time_t now, std::string* responsePacket, uint32_t* age, vState* valState, OptPBData* pbdata); + public: void preRemoval(MapCombo::LockedContent& map, const Entry& entry) { diff --git a/pdns/recursordist/ws-recursor.cc b/pdns/recursordist/ws-recursor.cc index b1d11ae170..ae0cde21e1 100644 --- a/pdns/recursordist/ws-recursor.cc +++ b/pdns/recursordist/ws-recursor.cc @@ -1070,7 +1070,15 @@ const std::map MetricDefinitionStorage::d_metrics {"record-cache-contended", MetricDefinition(PrometheusMetricType::counter, - "Number of contented record cache lock acquisitions")}, + "Number of contended record cache lock acquisitions")}, + + {"packetcache-acquired", + MetricDefinition(PrometheusMetricType::counter, + "Number of packet cache lock acquisitions")}, + + {"packetcache-contended", + MetricDefinition(PrometheusMetricType::counter, + "Number of contended packet cache lock acquisitions")}, {"taskqueue-expired", MetricDefinition(PrometheusMetricType::counter,