From: Remi Gacogne Date: Tue, 25 May 2021 14:35:13 +0000 (+0200) Subject: dnsdist: Skip some memory allocations in client mode X-Git-Tag: dnsdist-1.7.0-alpha1~149^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a093b261aae431777482a58bdcae8ebe33203084;p=thirdparty%2Fpdns.git dnsdist: Skip some memory allocations in client mode dnsdist does not use most of the configuration in client mode, mostly caring about the settings needed to access the console, but we still need to parse all directives and create objects due to the way our Lua parsing works. We don't, however, need to allocate the whole storage needed for packet caches, for backend states or for the in-memory ring buffers. This reduces the memory consumption of a console client to roughly 1 MB from hundreds of them in some cases. --- diff --git a/pdns/dnsdist-lua.cc b/pdns/dnsdist-lua.cc index 010478e9cf..d15de8aad0 100644 --- a/pdns/dnsdist-lua.cc +++ b/pdns/dnsdist-lua.cc @@ -253,7 +253,7 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck) [client, configCheck](boost::variant pvars, boost::optional qps) { setLuaSideEffect(); - std::shared_ptr ret = std::make_shared(ComboAddress()); + std::shared_ptr ret = std::make_shared(ComboAddress(), ComboAddress(), 0, std::string(), 1, !(client || configCheck)); newserver_t vars; ComboAddress serverAddr; @@ -827,7 +827,7 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck) luaCtx.writeFunction("getServer", [client](boost::variant i) { if (client) { - return std::make_shared(ComboAddress()); + return std::make_shared(ComboAddress(), ComboAddress(), 0, std::string(), 1, false); } auto states = g_dstates.getCopy(); if (auto str = boost::get(&i)) { @@ -1819,14 +1819,19 @@ static void setupLuaConfig(LuaContext& luaCtx, bool client, bool configCheck) } }); - luaCtx.writeFunction("setRingBuffersSize", [](size_t capacity, boost::optional numberOfShards) { + luaCtx.writeFunction("setRingBuffersSize", [client](size_t capacity, boost::optional numberOfShards) { setLuaSideEffect(); if (g_configurationDone) { errlog("setRingBuffersSize() cannot be used at runtime!"); g_outputBuffer="setRingBuffersSize() cannot be used at runtime!\n"; return; } - g_rings.setCapacity(capacity, numberOfShards ? *numberOfShards : 10); + if (!client) { + g_rings.setCapacity(capacity, numberOfShards ? *numberOfShards : 10); + } + else { + g_rings.setCapacity(0, 1); + } }); luaCtx.writeFunction("setRingBuffersLockRetries", [](size_t retries) { @@ -2579,7 +2584,7 @@ vector> setupLua(LuaContext& luaCtx, bool client, bool setupLuaBindingsDNSCrypt(luaCtx); setupLuaBindingsDNSQuestion(luaCtx); setupLuaBindingsKVS(luaCtx, client); - setupLuaBindingsPacketCache(luaCtx); + setupLuaBindingsPacketCache(luaCtx, client); setupLuaBindingsProtoBuf(luaCtx, client, configCheck); setupLuaInspection(luaCtx); setupLuaRules(luaCtx); diff --git a/pdns/dnsdist-lua.hh b/pdns/dnsdist-lua.hh index b40073613a..28cd00da73 100644 --- a/pdns/dnsdist-lua.hh +++ b/pdns/dnsdist-lua.hh @@ -100,7 +100,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client); void setupLuaBindingsDNSCrypt(LuaContext& luaCtx); void setupLuaBindingsDNSQuestion(LuaContext& luaCtx); void setupLuaBindingsKVS(LuaContext& luaCtx, bool client); -void setupLuaBindingsPacketCache(LuaContext& luaCtx); +void setupLuaBindingsPacketCache(LuaContext& luaCtx, bool client); void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck); void setupLuaRules(LuaContext& luaCtx); void setupLuaInspection(LuaContext& luaCtx); diff --git a/pdns/dnsdistdist/dnsdist-backend.cc b/pdns/dnsdistdist/dnsdist-backend.cc index 091839b414..9425f350c8 100644 --- a/pdns/dnsdistdist/dnsdist-backend.cc +++ b/pdns/dnsdistdist/dnsdist-backend.cc @@ -153,7 +153,7 @@ void DownstreamState::setWeight(int newWeight) } } -DownstreamState::DownstreamState(const ComboAddress& remote_, const ComboAddress& sourceAddr_, unsigned int sourceItf_, const std::string& sourceItfName_, size_t numberOfSockets, bool connect=true): sourceItfName(sourceItfName_), remote(remote_), idStates(g_maxOutstanding), sourceAddr(sourceAddr_), sourceItf(sourceItf_), name(remote_.toStringWithPort()), nameWithAddr(remote_.toStringWithPort()) +DownstreamState::DownstreamState(const ComboAddress& remote_, const ComboAddress& sourceAddr_, unsigned int sourceItf_, const std::string& sourceItfName_, size_t numberOfSockets, bool connect=true): sourceItfName(sourceItfName_), remote(remote_), idStates(connect ? g_maxOutstanding : 0), sourceAddr(sourceAddr_), sourceItf(sourceItf_), name(remote_.toStringWithPort()), nameWithAddr(remote_.toStringWithPort()) { id = getUniqueID(); threadStarted.clear(); diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc index 79c58d558c..7cadee528b 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc @@ -28,10 +28,10 @@ #include "dnsdist.hh" #include "dnsdist-lua.hh" -void setupLuaBindingsPacketCache(LuaContext& luaCtx) +void setupLuaBindingsPacketCache(LuaContext& luaCtx, bool client) { /* PacketCache */ - luaCtx.writeFunction("newPacketCache", [](size_t maxEntries, boost::optional>> vars) { + luaCtx.writeFunction("newPacketCache", [client](size_t maxEntries, boost::optional>> vars) { bool keepStaleData = false; size_t maxTTL = 86400; @@ -98,6 +98,11 @@ void setupLuaBindingsPacketCache(LuaContext& luaCtx) numberOfShards = maxEntries; } + if (client) { + maxEntries = 1; + numberOfShards = 1; + } + auto res = std::make_shared(maxEntries, maxTTL, minTTL, tempFailTTL, maxNegativeTTL, staleTTL, dontAge, numberOfShards, deferrableInsertLock, ecsParsing); res->setKeepStaleData(keepStaleData);