Source tarball and GPG signature available at: https://github.com/gdnsd/gdnsd/releases/
3.6.0 - 2021-02-24
* UDP DNS threads now idle much more efficiently when there's little to no
network traffic arriving for them. Previously all such threads woke up
and re-executed recvmsg() at least once every ~3.1 seconds. Now they
block indefinitely in a ppoll() call once they've been idle for ~257ms or
longer. This reduces thread wakeup churn and thus power/cpu efficiency
waste in the case of unused threads for extra listen addresses. It also
reduces the worst corner case for daemon shutdown delays caused by UDP
threads from ~3.1s to ~257ms.
* TCP DNS threads now invoke rcu_quiescent_state() more often, which
can help data reloads complete faster when there are many active TCP
clients per thread. Previously they quiesced or went offline from RCU
once per eventloop iteration, where one iteration could handle up to 1
pending request per client connection for many connections. Now they
also quiesce once for each response sent.
* SO_REUSEPORT_LB is now used for better UDP and TCP socket loadbalancing
on BSDs which have this socket option available.
* Zone and config files are now loaded more efficiently when there are many
small ones, by switching to a malloc()+read() pattern instead of mmap()
for files that are smaller than 1MB. mmap modifies process-global memory
mappings once per file, which is expensive for a multi-threaded daemon
loading many small files (especially in parallel!), so it's just not
worth it unless the files are large-ish.