]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: report error when linux map limit is too low
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 15 May 2024 09:03:07 +0000 (11:03 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Tue, 21 May 2024 13:47:33 +0000 (15:47 +0200)
pdns/recursordist/rec-main.cc

index 304718f00c8f9372ca782f4d75d0ae5ce302697d..250b0abc9dace418fdba050f9c130151e326ecc5 100644 (file)
@@ -932,6 +932,24 @@ static void checkLinuxIPv6Limits([[maybe_unused]] Logr::log_t log)
 #endif
 }
 
+static void checkLinuxMapCountLimits([[maybe_unused]] Logr::log_t log)
+{
+#ifdef __linux__
+  string line;
+  if (readFileIfThere("/proc/sys/vm/max_map_count", &line)) {
+    auto lim = std::stoull(line);
+    // mthread stack use 3 maps per stack (2 guard pages + stack itself). Multiple by 4 for extra allowance.
+    // Also add 2 for handler and task threads.
+    auto mapsNeeded = 4ULL * g_maxMThreads * (RecThreadInfo::numTCPWorkers() + RecThreadInfo::numUDPWorkers() + 2);
+    if (lim < mapsNeeded) {
+      SLOG(g_log << Logger::Error << "sysctl kern.max_map_count= <" << mapsNeeded << ", this may cause 'bad_alloc' exceptions" << endl,
+           log->info(Logr::Error, "sysctl kern.max_map_count < mapsNeeded, this may cause 'bad_alloc' exceptions",
+                     "kern.max_map_count", Logging::Loggable(lim), "mapsNeeded", Logging::Loggable(mapsNeeded)));
+    }
+  }
+#endif
+}
+
 static void checkOrFixFDS(Logr::log_t log)
 {
   unsigned int availFDs = getFilenumLimit();
@@ -2193,6 +2211,8 @@ static int serviceMain(Logr::log_t log)
 
   g_maxMThreads = ::arg().asNum("max-mthreads");
 
+  checkLinuxMapCountLimits(log);
+
   int64_t maxInFlight = ::arg().asNum("max-concurrent-requests-per-tcp-connection");
   if (maxInFlight < 1 || maxInFlight > USHRT_MAX || maxInFlight >= g_maxMThreads) {
     SLOG(g_log << Logger::Warning << "Asked to run with illegal max-concurrent-requests-per-tcp-connection, setting to default (10)" << endl,