<div dir="ltr">In my environment, we have a plant of internal recursive servers for our data center and separate plants of authoritative servers; something like 65-85% of the traffic outbound from our recursive plants (several hundred queries/sec per client machine) is destined for our authoritative plants. I ran some quick benchmarks to compare per-query times for TCP-keepalive queries vs UDP queries:<div><br></div><div><div><br></div><div><font face="monospace, monospace">$ ./<a href="http://dns_keepalive_benchmarks.pl">dns_keepalive_benchmarks.pl</a> -c 5000</font></div><div><font face="monospace, monospace">use tcp: 0 / keepalive: 0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Querying for '<a href="http://www.example.com/A">www.example.com/A</a>'</font></div><div><font face="monospace, monospace">============================</font></div><div><font face="monospace, monospace">5000 iterations executed</font></div><div><font face="monospace, monospace">Iterations per second: 615.83</font></div><div><font face="monospace, monospace">Avg time per iteration: 1623.82 μs</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ ./<a href="http://dns_keepalive_benchmarks.pl">dns_keepalive_benchmarks.pl</a> -c 5000 --tcp</font></div><div><font face="monospace, monospace">use tcp: 1 / keepalive: 0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Querying for '<a href="http://www.example.com/A">www.example.com/A</a>'</font></div><div><font face="monospace, monospace">============================</font></div><div><font face="monospace, monospace">5000 iterations executed</font></div><div><font face="monospace, monospace">Iterations per second: 464.90</font></div><div><font face="monospace, monospace">Avg time per iteration: 2151.01 μs</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ ./<a href="http://dns_keepalive_benchmarks.pl">dns_keepalive_benchmarks.pl</a> -c 5000 --tcp --keepalive</font></div><div><font face="monospace, monospace">use tcp: 1 / keepalive: 1</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Querying for '<a href="http://www.example.com/A">www.example.com/A</a>'</font></div><div><font face="monospace, monospace">============================</font></div><div><font face="monospace, monospace">5000 iterations executed</font></div><div><font face="monospace, monospace">Iterations per second: 842.70</font></div><div><font face="monospace, monospace">Avg time per iteration: 1186.67 μs</font></div></div><div><br></div><div><br></div><div>As you can see, the TCP keep-alive test performs significantly better than the UDP test (TCP without keep alive is included simply as a reference point). There are all sorts of variables here (not least of which being I'm using perl as a client rather than an actual resolver or even something written in C); consider these numbers very back-of-the-napkin and worthy of more in-depth testing. I know there's an IETF draft to support TCP keepalives, but the thought occurred to me that a short-term solution would be an option to nail up TCP connections to specific IPs. This, along with an option to specify how many queries should traverse such a connection before that connection is recycled (something comparable to Apache's '<font face="monospace, monospace">KeepAlive</font>' and '<font face="monospace, monospace">MaxKeepAliveRequests</font>' parameter) would be an improvement.</div><div><br></div><div>Something like:</div><div><br></div><div><font face="monospace, monospace">  tcp-upstream-keepalive: 10.1.1.1</font></div><div><font face="monospace, monospace">  tcp-upstream-keepalive: <a href="http://10.50.1.64/27">10.50.1.64/27</a></font></div><div><font face="monospace, monospace">  tcp-upstream-keepalive-maxrequests: 10000</font></div><div><br></div><div><br></div><div>Thoughts? Has anyone else looked into this?</div><div><br></div><div>Regards,</div><div><br></div><div>Noah</div></div>