--- pdns-recursor-3.5.3/misc.cc +++ pdns-recursor-3.5.3/misc.cc @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #endif // WIN32 @@ -697,3 +698,22 @@ } while(!strchr(buffer, '\n')); return true; } + +unsigned int getFilenumLimit(bool hardOrSoft) +{ + struct rlimit rlim; + if(getrlimit(RLIMIT_NOFILE, &rlim) < 0) + unixDie("Requesting number of available file descriptors"); + return hardOrSoft ? rlim.rlim_max : rlim.rlim_cur; +} + +void setFilenumLimit(unsigned int lim) +{ + struct rlimit rlim; + + if(getrlimit(RLIMIT_NOFILE, &rlim) < 0) + unixDie("Requesting number of available file descriptors"); + rlim.rlim_cur=lim; + if(setrlimit(RLIMIT_NOFILE, &rlim) < 0) + unixDie("Setting number of available file descriptors"); +} --- pdns-recursor-3.5.3/misc.hh +++ pdns-recursor-3.5.3/misc.hh @@ -445,4 +445,6 @@ regex_t d_preg; }; +unsigned int getFilenumLimit(bool hardOrSoft=0); +void setFilenumLimit(unsigned int lim); #endif --- pdns-recursor-3.5.3/pdns_recursor.cc +++ pdns-recursor-3.5.3/pdns_recursor.cc @@ -1740,7 +1740,21 @@ g_tcpTimeout=::arg().asNum("client-tcp-timeout"); g_maxTCPPerClient=::arg().asNum("max-tcp-per-client"); - g_maxMThreads=::arg().asNum("max-mthreads"); + g_maxMThreads=::arg().asNum("max-mthreads"); + unsigned int availFDs=getFilenumLimit(); + if(g_maxMThreads * g_numThreads > availFDs) { + if(getFilenumLimit(true) >= g_maxMThreads * g_numThreads) { + setFilenumLimit(g_maxMThreads * g_numThreads); + L<