]> granicus.if.org Git - pdns/commitdiff
implement dynamic cache sizeing for recursor
authorbert hubert <bert.hubert@powerdns.com>
Fri, 15 Sep 2017 15:42:51 +0000 (17:42 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Fri, 15 Sep 2017 15:42:51 +0000 (17:42 +0200)
With this commit, the number of (packet)cache entries can be changed at runtime, although the effect may not be immediate in case of shrinking the cache.

pdns/pdns_recursor.cc
pdns/rec_channel_rec.cc
pdns/recursor_cache.cc
pdns/recursor_cache.hh
pdns/recursordist/docs/manpages/rec_control.rst
pdns/syncres.hh

index f733f81e9d05777c01837f5a99beb2bd06d33580..e863614f12c715b88c3d534ea1629787471309c2 100644 (file)
@@ -156,6 +156,7 @@ static bool g_useOneSocketPerThread;
 static bool g_gettagNeedsEDNSOptions{false};
 static time_t g_statisticsInterval;
 static bool g_useIncomingECS;
+std::atomic<uint32_t> g_maxCacheEntries, g_maxPacketCacheEntries;
 
 RecursorControlChannel s_rcc; // only active in thread 0
 RecursorStats g_stats;
@@ -2080,10 +2081,10 @@ static void houseKeeping(void *)
     if(now.tv_sec - last_prune > (time_t)(5 + t_id)) {
       DTime dt;
       dt.setTimeval(now);
-      t_RC->doPrune(); // this function is local to a thread, so fine anyhow
-      t_packetCache->doPruneTo(::arg().asNum("max-packetcache-entries") / g_numWorkerThreads);
+      t_RC->doPrune(g_maxCacheEntries / g_numThreads); // this function is local to a thread, so fine anyhow
+      t_packetCache->doPruneTo(g_maxPacketCacheEntries / g_numWorkerThreads);
 
-      SyncRes::pruneNegCache(::arg().asNum("max-cache-entries") / (g_numWorkerThreads * 10));
+      SyncRes::pruneNegCache(g_maxCacheEntries / (g_numWorkerThreads * 10));
 
       if(!((cleanCounter++)%40)) {  // this is a full scan!
        time_t limit=now.tv_sec-300;
@@ -2817,6 +2818,9 @@ static int serviceMain(int argc, char*argv[])
   g_dnssecLogBogus = ::arg().mustDo("dnssec-log-bogus");
   g_maxNSEC3Iterations = ::arg().asNum("nsec3-max-iterations");
 
+  g_maxCacheEntries = ::arg().asNum("max-cache-entries");
+  g_maxPacketCacheEntries = ::arg().asNum("max-packetcache-entries");
+  
   try {
     loadRecursorLuaConfig(::arg()["lua-config-file"], ::arg().mustDo("daemon"));
   }
index 269dbe649e743808ce9507507cc70984ba711aea..e722f202dd3e2c7327660a17e46545ac7b9eb56c 100644 (file)
@@ -612,6 +612,24 @@ string setMinimumTTL(T begin, T end)
   return "New minimum TTL: " + std::to_string(SyncRes::s_minimumTTL) + "\n";
 }
 
+template<typename T>
+string setMaxCacheEntries(T begin, T end)
+{
+  if(end-begin != 1) 
+    return "Need to supply new cache size\n";
+  g_maxCacheEntries = pdns_stou(*begin);
+  return "New minimum TTL: " + std::to_string(g_maxCacheEntries) + "\n";
+}
+
+template<typename T>
+string setMaxPacketCacheEntries(T begin, T end)
+{
+  if(end-begin != 1) 
+    return "Need to supply new packet cache size\n";
+  g_maxPacketCacheEntries = pdns_stou(*begin);
+  return "New minimum TTL: " + std::to_string(g_maxPacketCacheEntries) + "\n";
+}
+
 
 static uint64_t getSysTimeMsec()
 {
@@ -1205,6 +1223,8 @@ string RecursorControlParser::getAnswer(const string& question, RecursorControlP
 "reload-lua-script [filename]     (re)load Lua script\n"
 "reload-lua-config [filename]     (re)load Lua configuration file\n"
 "reload-zones                     reload all auth and forward zones\n"
+"set-max-cache-entries value      set new maximum cache size"
+"set-max-packetcache-entries val  set new maximum packet cache size"      
 "set-minimum-ttl value            set minimum-ttl-override\n"
 "set-carbon-server                set a carbon server for telemetry\n"
 "set-dnssec-log-bogus SETTING     enable (SETTING=yes) or disable (SETTING=no) logging of DNSSEC validation failures\n"
@@ -1352,6 +1372,13 @@ string RecursorControlParser::getAnswer(const string& question, RecursorControlP
     return reloadAuthAndForwards();
   }
 
+  if(cmd=="set-max-cache-entries") {
+    return setMaxCacheEntries(begin, end);
+  }
+  if(cmd=="set-max-packetcache-entries") {
+    return setMaxPacketCacheEntries(begin, end);
+  }
+  
   if(cmd=="set-minimum-ttl") {
     return setMinimumTTL(begin, end);
   }
index 2b6e9010b52fbf8772f1bb6d57455952d4ac902d..d3245420fb1d81014a0278fa25a6998fe1862714 100644 (file)
@@ -484,8 +484,3 @@ void MemRecursorCache::doPrune(unsigned int keep)
   pruneCollection(*this, d_cache, keep);
 }
 
-void MemRecursorCache::doPrune(void)
-{
-  unsigned int maxCached=::arg().asNum("max-cache-entries") / g_numThreads;
-  doPrune(maxCached);
-}
index ca9cf4a982c3469e8d48269f8a4c108a4cb0186f..9f53ca5724c91a432980d28f4232f1017076189d 100644 (file)
@@ -61,7 +61,6 @@ public:
 
   void replace(time_t, const DNSName &qname, const QType& qt,  const vector<DNSRecord>& content, const vector<shared_ptr<RRSIGRecordContent>>& signatures, const std::vector<std::shared_ptr<DNSRecord>>& authorityRecs, bool auth, boost::optional<Netmask> ednsmask=boost::none, vState state=Indeterminate);
 
-  void doPrune(void);
   void doPrune(unsigned int keep);
   uint64_t doDump(int fd);
 
index 352b5d577c2fae1d96ca9822bba45e162840662e..0db7b10c85f9af5e9ac84598092c987114827422 100644 (file)
@@ -150,6 +150,16 @@ set-dnssec-log-bogus *SETTING*
     DNSSEC validation failures and to 'no' or 'off' to disable logging these
     failures.
 
+set-max-cache-entries *NUM*
+    Change the maximum number of entries in the DNS cache.  If reduced, the
+    cache size will start shrinking to this number as part of the normal
+    cache purging process, which might take a while.
+
+set-max-packetcache-entries *NUM*
+    Change the maximum number of entries in the packet cache.  If reduced, the
+    cache size will start shrinking to this number as part of the normal
+    cache purging process, which might take a while.
+
 set-minimum-ttl *NUM*
     Set minimum-ttl-override to *NUM*.
 
index 980650f6d31d306b49ebb27da6392523564a8e63..fddfb9721a2420f09243053ed2557a23e49f5a13 100644 (file)
@@ -949,6 +949,7 @@ void parseACLs();
 extern RecursorStats g_stats;
 extern unsigned int g_numThreads;
 extern uint16_t g_outgoingEDNSBufsize;
+extern std::atomic<uint32_t> g_maxCacheEntries, g_maxPacketCacheEntries;
 
 
 std::string reloadAuthAndForwards();