]> granicus.if.org Git - pdns/commitdiff
improve filedescriptor requesting code so it requests more filedescriptors, plus...
authorbert hubert <bert.hubert@netherlabs.nl>
Thu, 26 Nov 2015 14:26:39 +0000 (15:26 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 26 Nov 2015 16:06:16 +0000 (17:06 +0100)
pdns/pdns_recursor.cc

index 4538e398d0c2c63ba9f4e23adc29c6af6c0bb1a3..275ab6bf08712f4621a4a2e8e63dc45c8a0592b5 100644 (file)
@@ -1975,17 +1975,19 @@ static void checkLinuxIPv6Limits()
 }
 static void checkOrFixFDS()
 {
-  unsigned int availFDs=getFilenumLimit()-10; // some healthy margin, thanks AJ ;-)
-  if(g_maxMThreads * g_numWorkerThreads > availFDs) {
-    if(getFilenumLimit(true) >= g_maxMThreads * g_numWorkerThreads) {
-      setFilenumLimit(g_maxMThreads * g_numWorkerThreads);
-      L<<Logger::Warning<<"Raised soft limit on number of filedescriptors to "<<g_maxMThreads * g_numWorkerThreads<<" to match max-mthreads and threads settings"<<endl;
+  unsigned int availFDs=getFilenumLimit(); 
+  unsigned int wantFDs = g_maxMThreads * g_numWorkerThreads +25; // even healthier margin then before
+
+  if(wantFDs > availFDs) {
+    if(getFilenumLimit(true) >= wantFDs) {
+      setFilenumLimit(wantFDs);
+      L<<Logger::Warning<<"Raised soft limit on number of filedescriptors to "<<wantFDs<<" to match max-mthreads and threads settings"<<endl;
     }
     else {
       int newval = getFilenumLimit(true) / g_numWorkerThreads;
-      L<<Logger::Warning<<"Insufficient number of filedescriptors available for max-mthreads*threads setting! ("<<availFDs<<" < "<<g_maxMThreads*g_numWorkerThreads<<"), reducing max-mthreads to "<<newval<<endl;
+      L<<Logger::Warning<<"Insufficient number of filedescriptors available for max-mthreads*threads setting! ("<<availFDs<<" < "<<wantFDs<<"), reducing max-mthreads to "<<newval<<endl;
       g_maxMThreads = newval;
-      setFilenumLimit(g_maxMThreads * g_numWorkerThreads);
+      setFilenumLimit(getFilenumLimit(true));
     }
   }
 }
@@ -2259,11 +2261,10 @@ int serviceMain(int argc, char*argv[])
   writePid();
   makeControlChannelSocket( ::arg().asNum("processes") > 1 ? forks : -1);
   g_numThreads = ::arg().asNum("threads") + ::arg().mustDo("pdns-distributes-queries");
+  g_numWorkerThreads = ::arg().asNum("threads");
   g_maxMThreads = ::arg().asNum("max-mthreads");
   checkOrFixFDS();
 
-
-
   int newgid=0;
   if(!::arg()["setgid"].empty())
     newgid=Utility::makeGidNumeric(::arg()["setgid"]);
@@ -2281,8 +2282,7 @@ int serviceMain(int argc, char*argv[])
   }
 
   Utility::dropUserPrivs(newuid);
-  g_numThreads = ::arg().asNum("threads") + ::arg().mustDo("pdns-distributes-queries");
-  g_numWorkerThreads = ::arg().asNum("threads");
+
   makeThreadPipes();
 
   g_tcpTimeout=::arg().asNum("client-tcp-timeout");