]> granicus.if.org Git - pdns/commitdiff
document cache cleaning rate adjustment, plus switch to symbolic names for limits
authorbert hubert <bert.hubert@powerdns.com>
Thu, 29 Sep 2016 15:23:42 +0000 (17:23 +0200)
committermind04 <mind04@monshouwer.org>
Sat, 1 Oct 2016 16:51:36 +0000 (18:51 +0200)
pdns/packetcache.cc
pdns/packetcache.hh

index a30f56e960c3ea9a5cbd880f280be6fc31618916..3e85ee62f4418aae8fef1863d75afa41c75ca1a9 100644 (file)
@@ -434,6 +434,15 @@ void PacketCache::cleanup()
   DLOG(L<<"Done with cache clean"<<endl);
 }
 
+/* the logic:
+   after d_nextclean operations, we clean. We also adjust the cleaninterval
+   a bit so we slowly move it to a value where we clean roughly every 30 seconds.
+
+   If d_nextclean has reached its maximum value, we also test if we were called
+   within 30 seconds, and if so, we skip cleaning. This means that under high load,
+   we will not clean more often than every 30 seconds anyhow.
+*/
+
 void PacketCache::cleanupIfNeeded()
 {
   if (d_ops++ == d_nextclean) {
@@ -441,7 +450,7 @@ void PacketCache::cleanupIfNeeded()
 
     DLOG(L<<"cleaninterval: "<<d_cleaninterval<<", timediff: "<<timediff<<endl);
 
-    if (d_cleaninterval == 300000 && timediff < 30) {
+    if (d_cleaninterval == s_maxcleaninterval && timediff < 30) {
       d_cleanskipped = true;
       d_nextclean += d_cleaninterval;
 
@@ -449,7 +458,14 @@ void PacketCache::cleanupIfNeeded()
 
       return;
     }
-    if(d_cleanskipped) {
+
+    if(!d_cleanskipped) {
+      d_cleaninterval=(int)(0.6*d_cleaninterval)+(0.4*d_cleaninterval*(30.0/timediff));
+      d_cleaninterval=std::max(d_cleaninterval, s_mincleaninterval);
+      d_cleaninterval=std::min(d_cleaninterval, s_maxcleaninterval);
+
+      DLOG(L<<"new cleaninterval: "<<d_cleaninterval<<endl);
+    } else {
       d_cleanskipped = false;
     }
 
index aee5a7a728f0398c965da0bb0df445b70ad5d9bd..6035fbb7bfbf85181875476bd6780b9233e35829 100644 (file)
@@ -141,7 +141,7 @@ private:
   AtomicCounter d_ops;
   time_t d_lastclean; // doesn't need to be atomic
   unsigned long d_nextclean;
-  int d_cleaninterval;
+  unsigned int d_cleaninterval;
   bool d_cleanskipped;
   AtomicCounter *d_statnumhit;
   AtomicCounter *d_statnummiss;
@@ -150,6 +150,8 @@ private:
   int d_ttl;
   int d_recursivettl;
   bool d_doRecursion;
+
+  static constexpr unsigned int s_mincleaninterval=1000, s_maxcleaninterval=300000;
 };