On Monday, April 5, 2021 10:05 AM, Otto Moerbeek Wrote:
> On Mon, Apr 05, 2021 at 02:40:17PM +0000, Nejedlo, Mark via Pdns-users
> wrote:
> 
> > We recently replaced some Bind servers with PowerDNS recursor, and
> > were rather surprised to see CPU usage essentially double for the same
> > workload.  My expectation was that the load would be more or less
> > equivalent between the two resolvers.  It looks like the load is
> > centered in the actual pdns_recursor worker threads, not the distributor
> > threads or dnsdist.  Is it expected that CPU usage would be so much
> > higher under PowerDNS?  Is there a debug parameter that can be set to
> > see where PowerDNS is spending its time?
> >
> > I've already gone through the performance guide and don't see any
> > additional tuning parameters that might help.  We're using LUA, but 1)
> > it's pretty lightweight (a couple hash lookups and modify dq object),
> > and 2) when I disabled the LUA scripting for testing, it didn't make a
> > noticeable difference in the load.
> 
> Impossible to say anything without any info about hardware, os, config
> and metrics.

Hardware is a VMware guest on ESXi, 12 cores, 4GB RAM (no apparent RAM 
pressure).  OS is Red Hat Enterprise 7.  Running recursor 4.3.5, via the 
official PowerDNS centos 7 RPM.

Config Files
------------

/etc/pdns-recursor/recursor.conf:
--------------------
setgid=pdns-recursor
setuid=pdns-recursor
version-string=anonymous
threads=8
pdns-distributes-queries=yes
distributor-threads=2
distribution-load-factor=1.25
query-local-address=64.50.242.202
query-local-address6=2600:3404:200:1:250:56ff:feae:df16

use-incoming-edns-subnet=true
xpf-rr-code=65280
xpf-allow-from=127.0.0.1, ::1
edns-subnet-whitelist=tds.net,tdstelecom.com

local-port=5353
local-address=127.0.0.1,::1
forward-zones-file=/etc/pdns-recursor/forward.zones
lua-dns-script=/etc/pdns-recursor/recursor-script.lua
--------------------


/etc/pdns-recursor/recursor-script.lua
--------------------
-- load business opt out list once on lua startup/reload
nxd_business_opt_out = newNMG()
nxd_boo_f = assert(io.open('/etc/pdns-recursor/NXD_BusinessOptOut.txt', 'r'))
for line in nxd_boo_f:lines() do
  if not string.match(line, '[G-Zg-z<>#]') then -- throw away non-data lines 
associated with answerx formatting
    nxd_business_opt_out:addMask(line)
  end
end

nxdomainhostskip = {'wpad', 'mail', 'ntp', 'voip', 'ftp', 'irc', 'finger'}
nxdomainhostmatch = {'web', 'my', 'ww', 'home', 'http'}

nxd_data = {}

-- counters for redirects and opt-out hits
nxd_optoutcount = getMetric("nxdomain-opt-out")
nxd_redirectcount = getMetric("nxdomain-redirect")

-- maintenance processes, including:
-- - refreshing the NXDomain hijacking record
function maintenance()
  local socket = require("socket")
  local udp = assert(socket.udp6())
  local resp
  local nxd_tmp = {}
  
  udp:settimeout(1)
  assert(udp:setsockname("*",0))
  assert(udp:setpeername("::1",5354))
  
  for i = 0, 2, 1 do
    assert(udp:send("NXD ANY"))
    resp = udp:receive()
    if resp then
      break
    end
  end
  
  if resp == nil then
    pdnslog("NXdomain refresh timeout")
  else
    local splitdata = {}
    for splits in string.gmatch(resp, "%S+") do
      table.insert(splitdata, splits)
    end
    if splitdata[1] == 'NXD' then
      local rrtype = ''
      local ttl = ''
      local ip = ''
      for i = 2, #splitdata do
        if rrtype == '' then
          if splitdata[i] == 'A' or splitdata[i] == 'AAAA' then
            rrtype = splitdata[i]
          elseif splitdata[i] == 'NODATA' then
            -- pdnslog('No data available')
            break
          else
            pdnslog('Invalid rrtype provided')
            break
          end
        elseif ttl == '' then
          ttl = tonumber(splitdata[i])
          if ttl == nil then
            pdnslog('Invalid ttl provided')
            break
          end
        elseif ip == '' then
          ip = splitdata[i]
          local tmpdr = newDR(newDN('redirect'), rrtype, ttl, ip, 
pdns.place.ANSWER)
          if tmpdr == nil then
            pdnslog("Unable to create DR for "..rrtype..' '..ttl..' '..ip)
            break
          else
            table.insert(nxd_tmp, tmpdr)
          end
          rrtype = ''
          ttl = ''
          ip = ''
        else
          pdnslog('Should not be reachable')
        end
      end -- for i = 2, #splitdata
    else
      pdnslog("invalid response "..resp)
    end -- if splitdata['1'] == 'NXD'
  end -- if/else resp == nil
  nxd_data = nxd_tmp
end

-- make redirect processing its own function so we can call it from multiple 
places
function nxd_handler(dq)
  for i = 1, #nxd_data do
    if dq.qtype == nxd_data[i].type or dq.qtype == pdns.ANY then
      dq.rcode = pdns.NOERROR -- make it a normal answer
      dq:addAnswer(nxd_data[i].type, nxd_data[i]:getContent(), nxd_data[i].ttl)
    end
  end
  if dq.rcode == pdns.NOERROR then
    nxd_redirectcount:inc()
  end
  return dq
end

-- If resolver returns nxdomain, redirect to searchguide service
function nxdomain(dq)

  -- Only redirect for A/AAAA/ANY queries
  if dq.qtype == pdns.A or dq.qtype == pdns.AAAA or dq.qtype == pdns.ANY then

    -- skip redirect if host part matches the patterns in nxdomainhostskip
    for i, hpart in ipairs(nxdomainhostskip) do
      if string.match(dq.qname:toString(), "^"..hpart) then
        return false
      end
    end

    -- business customer opt-out
    if nxd_business_opt_out:match(dq.remoteaddr) then
      nxd_optoutcount:inc()
      return false
    end

    -- check if host part matches patterns.  if so, redirect to search service
    for i, hpart in ipairs(nxdomainhostmatch) do
      if string.match(dq.qname:toString(), "^"..hpart) then
        dq = nxd_handler(dq)
        return true
      end
    end

    -- only redirect queries two or fewer levels deep
    if dq.qname:countLabels() < 3 then
      dq = nxd_handler(dq)
      return true
    end

    -- too long and didn't match host parts, so skip redirect
    return false
  end
  return false
end
--------------------


Half-hour stats
--------------------
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: 
8559042686 questions, 824993 cache entries, 102305 negative entries, 81% cache 
hits
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: throttle 
map: 1480, ns speeds: 74541, failed ns: 3038, ednsmap: 198701
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: 
outpacket/query ratio 28%, 11% throttled, 0 no-delegation drops
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: 11031110 
outgoing tcp connections, 42 queries running, 67363308 outgoing timeouts
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: 508363 
packet cache entries, 2% packet cache hits
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 0 
has been distributed 1127234640 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 1 
has been distributed 1025150455 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 2 
has been distributed 1086409376 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 3 
has been distributed 956026740 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 4 
has been distributed 1117212754 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 5 
has been distributed 981577497 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 6 
has been distributed 878916852 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: thread 7 
has been distributed 1378105489 queries
Apr 05 16:35:34 ny00vmp-rdns0.svc.tds.net pdns_recursor[1545]: stats: 4290 qps 
(average over 1800 seconds)
--------------------


rec_control get-all
--------------------
all-outqueries  2426135931
answers-slow    32622243
answers0-1      6963714100
answers1-10     616485007
answers10-100   589467848
answers100-1000 111976956
auth-zone-queries       3913588
auth4-answers-slow      54645139
auth4-answers0-1        502461956
auth4-answers1-10       778877222
auth4-answers10-100     615451605
auth4-answers100-1000   109890924
auth6-answers-slow      9558349
auth6-answers0-1        42211276
auth6-answers1-10       195413588
auth6-answers10-100     100814046
auth6-answers100-1000   13552926
cache-entries   825029
cache-hits      6781159775
cache-misses    1533106380
case-mismatches 0
chain-resends   174881587
client-parse-errors     0
concurrent-queries      75
cpu-msec-thread-0       91219643
cpu-msec-thread-1       142746545
cpu-msec-thread-2       278497218
cpu-msec-thread-3       250309239
cpu-msec-thread-4       250701322
cpu-msec-thread-5       319416792
cpu-msec-thread-6       328608768
cpu-msec-thread-7       264910279
cpu-msec-thread-8       322031125
cpu-msec-thread-9       335541569
dlg-only-drops  0
dnssec-authentic-data-queries   18646074
dnssec-check-disabled-queries   1113241
dnssec-queries  53214851
dnssec-result-bogus     0
dnssec-result-indeterminate     0
dnssec-result-insecure  0
dnssec-result-nta       0
dnssec-result-secure    10986
dnssec-validations      10986
dont-outqueries 45917207
ecs-queries     1451717
ecs-responses   32451
edns-ping-matches       0
edns-ping-mismatches    0
empty-queries   0
failed-host-entries     1356
fd-usage        269
ignored-packets 1478626
ipv6-outqueries 359162038
ipv6-questions  8551805269
malloc-bytes    0
max-cache-entries       1000000
max-mthread-stack       87984
max-packetcache-entries 500000
negcache-entries        102533
no-packet-error 1601797538
noedns-outqueries       3772686
noerror-answers 7669982655
noping-outqueries       0
nsset-invalidations     2704139
nsspeeds-entries        70484
nxdomain-answers        744158682
nxdomain-opt-out        2407297
nxdomain-redirect       93573041
outgoing-timeouts       67362296
outgoing4-timeouts      56885531
outgoing6-timeouts      10476765
over-capacity-drops     13007
packetcache-entries     510580
packetcache-hits        244194152
packetcache-misses      8307487740
policy-drops    0
policy-result-custom    0
policy-result-drop      0
policy-result-noaction  8314084804
policy-result-nodata    0
policy-result-nxdomain  0
policy-result-truncate  0
qa-latency      9496
qname-min-fallback-success      406051209
query-pipe-full-drops   0
questions       8558845589
real-memory-usage       4266360832
rebalanced-queries      1692943695
resource-limits 0
security-status 1
server-parse-errors     91767
servfail-answers        144318969
spoof-prevents  1
sys-msec        539748918
tcp-client-overflow     0
tcp-clients     4
tcp-outqueries  11030988
tcp-questions   7040320
throttle-entries        1356
throttled-out   306121689
throttled-outqueries    306121689
too-old-drops   107804
truncated-drops 0
udp-in-errors   80342
udp-noport-errors       711240
udp-recvbuf-errors      0
udp-sndbuf-errors       0
unauthorized-tcp        0
unauthorized-udp        0
unexpected-packets      46639
unreachables    206095
uptime  6103754
user-msec       2044729297
variable-responses      18555
x-our-latency   59
x-ourtime-slow  2003931
x-ourtime0-1    8265444257
x-ourtime1-2    37568531
x-ourtime16-32  33205
x-ourtime2-4    7265716
x-ourtime4-8    1653903
x-ourtime8-16   296611
--------------------
_______________________________________________
Pdns-users mailing list
Pdns-users@mailman.powerdns.com
https://mailman.powerdns.com/mailman/listinfo/pdns-users

Reply via email to