From: Remi Gacogne Date: Fri, 23 Jan 2026 10:07:23 +0000 (+0100) Subject: dnsdist: Reduce contention around the sampling counter in the rings X-Git-Tag: dnsdist-2.1.0-alpha1~6^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=848ec456a2e1a4744267a90200ecf4cca60ee2a8;p=thirdparty%2Fpdns.git dnsdist: Reduce contention around the sampling counter in the rings Signed-off-by: Remi Gacogne --- diff --git a/pdns/dnsdistdist/dnsdist-rings.cc b/pdns/dnsdistdist/dnsdist-rings.cc index e1d9b607e1..8ac89cb786 100644 --- a/pdns/dnsdistdist/dnsdist-rings.cc +++ b/pdns/dnsdistdist/dnsdist-rings.cc @@ -24,6 +24,8 @@ #include "dnsdist-rings.hh" +thread_local size_t Rings::t_samplingCounter{0}; + void Rings::init(const RingsConfiguration& config) { if (d_initialized.exchange(true)) { @@ -207,8 +209,8 @@ bool Rings::shouldSkipDueToSampling() if (d_samplingRate == 0) { return false; } - auto counter = d_samplingCounter++; - return (counter % d_samplingRate) == 0; + auto counter = t_samplingCounter++; + return (counter % d_samplingRate) != 0; } uint32_t Rings::adjustForSamplingRate(uint32_t count) const diff --git a/pdns/dnsdistdist/dnsdist-rings.hh b/pdns/dnsdistdist/dnsdist-rings.hh index 03378941fd..ef99dd2c7d 100644 --- a/pdns/dnsdistdist/dnsdist-rings.hh +++ b/pdns/dnsdistdist/dnsdist-rings.hh @@ -290,6 +290,9 @@ private: bool shouldSkipDueToSampling(); static constexpr bool s_keepLockingStats{false}; + // small hack to reduce contention: this only works because we have a single Rings object in DNSdist + static thread_local size_t t_samplingCounter; + std::atomic d_nbQueryEntries{0}; std::atomic d_nbResponseEntries{0}; @@ -300,7 +303,6 @@ private: size_t d_numberOfShards{10}; size_t d_nbLockTries{5}; size_t d_samplingRate{0}; - std::atomic d_samplingCounter{0}; bool d_recordQueries{true}; bool d_recordResponses{true}; };