From f65ea0c29202c50561b0ca98fdbd1cb630b703b6 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 3 Nov 2016 18:05:47 +0100 Subject: [PATCH] dnsdist: Add `setCacheCleaningPercentage()` --- pdns/README-dnsdist.md | 3 ++- pdns/dnsdist-lua.cc | 1 + pdns/dnsdist.cc | 4 +++- pdns/dnsdist.hh | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pdns/README-dnsdist.md b/pdns/README-dnsdist.md index 43ae7bbd67..44cc1ed3b9 100644 --- a/pdns/README-dnsdist.md +++ b/pdns/README-dnsdist.md @@ -880,7 +880,7 @@ getPool("poolname"):getCache():printStats() ``` Expired cached entries can be removed from a cache using the `purgeExpired(n)` -method, which will remove expired entries from the cache until at least `n` +method, which will remove expired entries from the cache until at most `n` entries remain in the cache. For example, to remove all expired entries: ``` @@ -1488,6 +1488,7 @@ instantiate a server with additional parameters * `setMaxTCPQueuedConnections(n)`: set the maximum number of TCP connections queued (waiting to be picked up by a client thread), defaults to 1000. 0 means unlimited * `setMaxUDPOutstanding(n)`: set the maximum number of outstanding UDP queries to a given backend server. This can only be set at configuration time and defaults to 10240 * `setCacheCleaningDelay(n)`: set the interval in seconds between two runs of the cache cleaning algorithm, removing expired entries + * `setCacheCleaningPercentage(n)`: set the percentage of the cache that the cache cleaning algorithm will try to free by removing expired entries. By default (100), all expired entries are removed * `setStaleCacheEntriesTTL(n)`: allows using cache entries expired for at most `n` seconds when no backend available to answer for a query * DNSCrypt related: * `addDNSCryptBind("127.0.0.1:8443", "provider name", "/path/to/resolver.cert", "/path/to/resolver.key", [false], [TCP Fast Open queue size]):` listen to incoming DNSCrypt queries on 127.0.0.1 port 8443, with a provider name of "provider name", using a resolver certificate and associated key stored respectively in the `resolver.cert` and `resolver.key` files. The fifth optional parameter sets SO_REUSEPORT when available. The last parameter sets the TCP Fast Open queue size, enabling TCP Fast Open when available and the value is larger than 0. diff --git a/pdns/dnsdist-lua.cc b/pdns/dnsdist-lua.cc index ecfc53e800..cae2b7feb5 100644 --- a/pdns/dnsdist-lua.cc +++ b/pdns/dnsdist-lua.cc @@ -1523,6 +1523,7 @@ vector> setupLua(bool client, const std::string& confi }); g_lua.writeFunction("setCacheCleaningDelay", [](uint32_t delay) { g_cacheCleaningDelay = delay; }); + g_lua.writeFunction("setCacheCleaningPercentage", [](uint16_t percentage) { if (percentage < 100) g_cacheCleaningPercentage = percentage; else g_cacheCleaningPercentage = 100; }); g_lua.writeFunction("setECSSourcePrefixV4", [](uint16_t prefix) { g_ECSSourcePrefixV4=prefix; }); diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index faad4d79f3..bee97ef9ee 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -1264,6 +1264,7 @@ catch(...) uint64_t g_maxTCPClientThreads{10}; std::atomic g_cacheCleaningDelay{60}; +std::atomic g_cacheCleaningPercentage{100}; void* maintThread() { @@ -1290,7 +1291,8 @@ void* maintThread() packetCache = entry.second->packetCache; } if (packetCache) { - packetCache->purgeExpired(); + size_t upTo = (packetCache->getMaxEntries()* (100 - g_cacheCleaningPercentage)) / 100; + packetCache->purgeExpired(upTo); } } counter = 0; diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index 7c4ac6f687..62089e1ac4 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -687,6 +687,7 @@ extern std::atomic g_configurationDone; extern uint64_t g_maxTCPClientThreads; extern uint64_t g_maxTCPQueuedConnections; extern std::atomic g_cacheCleaningDelay; +extern std::atomic g_cacheCleaningPercentage; extern bool g_verboseHealthChecks; extern uint32_t g_staleCacheEntriesTTL; -- 2.47.2