<div dir="ltr">Anand,<div><br></div><div>first of all - thanks for doing this, it's a lot of repetitive work. With benchmarking, there are many opinions and anecdotes, but not many are backed with data. Your test setup looks sane to me - presuming the question you're trying to answer "what sustained query rate can daemon X achieve in our environment"? If you're interested in gauging your infrastructure against attacks, you probably should use attack traffic.</div><div><br></div><div>There are many variables involved (hardware, drivers, os), and a lot of things to tune. I think it's a good thing you reduced the benchmarking scope to your system first. It's very useful to have baseline results first (please do share them), instead of doing the "drunken man approach" tuning. There are now many good tools - ftrace perf (as Florian mentioned), systemtap, bcc ... to help you find out where the time is spent when you get to actual tuning, no need for guessing.<br></div><div><br></div><div>Good luck, it'd be awesome if this somehow turned into a repeatable test environment.</div><div><br></div><div>Marek</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 13 August 2016 at 03:43, Anand Buddhdev <span dir="ltr"><<a href="mailto:anandb@ripe.net" target="_blank">anandb@ripe.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi folks,<br>
<br>
I'm doing some DNS server benchmarking, and I think I've got a lab setup<br>
that looks right, but I'd like to run my config past you guys, the<br>
experts, to make sure I'm not overlooking anything obvious.<br>
<br>
I have 3 Dell R320 servers, each with a single Intel Xeon E5-2470<br>
10-core processor at 2.40 GHz. The OS therefore sees 20 processors. The<br>
server has the usual on-board dual-port 1 Gbit ethernet ports, but I'm<br>
not using these for the testing. These are merely for logging in and OS<br>
management. The servers also have dual-port 10 GB NICs, with an intel<br>
chipset, and using the Linux "ixgbe" driver.<br>
<br>
One 10 GB NIC in each server is connected to a switch, so that the 3<br>
NICs are in the same LAN.<br>
<br>
The OS is an up-to-date CentOS 7 installation. The roles are thus:<br>
<br>
1. server 1 is the source of packets. On it, I have compiled the latest<br>
tcpreplay with the --enable-quick-tx option, to allow it to play back<br>
packets at a high rate. I have a pcap file containing 6,882,162 real DNS<br>
queries (UDP-only) which I can send out to a DNS server.<br>
<br>
2. server 2 is the DNS server. I have so far installed BIND 9.10.4-P1,<br>
NSD 4.1.10, Knot 2.3.0 and Yadifa 2.1.6 on it. They are all configured<br>
as root name servers, with the root, arpa and <a href="http://root-servers.net" rel="noreferrer" target="_blank">root-servers.net</a> zones on<br>
them.<br>
<br>
I have done minimal tuning of this server. I have set these 4 sysctl<br>
settings:<br>
<br>
net.core.rmem_default=4194304<br>
net.core.rmem_max=4194304<br>
net.core.wmem_default=4194304<br>
net.core.wmem_max=4194304<br>
<br>
Additionally, I've configured the following iptables rules on it:<br>
<br>
-A PREROUTING -i p1p1 -p udp -m udp --dport 53 -j NOTRACK<br>
-A OUTPUT -o p1p1 -p udp -m udp --sport 53 -j NOTRACK<br>
<br>
With these rules, I ensure that no connection-tracking is done, and I<br>
can count the number of incoming packets (queries) and the number of<br>
outgoing packets (responses) easily.<br>
<br>
Finally, there is a default route installed on the server to send all<br>
the responses out to server 3.<br>
<br>
3. Server 3 is just the sink. It received DNS responses, and there's a<br>
single iptables rules to drop them all (and count them):<br>
<br>
-A PREROUTING -s <a href="http://193.0.14.129/32" rel="noreferrer" target="_blank">193.0.14.129/32</a> -p udp -m udp --sport 53 -j DROP<br>
<br>
<br>
With this setup, I can emit a DNS query from the source, and it goes to<br>
the DNS server, which emits a response, and the response goes to the<br>
sink where it is discarded. On the source, tcpreplay is able to achieve<br>
a maximum packet rate of just over 3 million, so I can blast over 3<br>
million q/s towards the DNS server. At that rate, none of the DNS<br>
servers can keep up of course. However, I'm playing back packets are<br>
various rates to find the breaking points of the various servers.<br>
<br>
Now I know that there is a LOT more tweaking and tuning that can be<br>
done. For example the 10 GB NICs have lots of tunables. In addition,<br>
there are things like CPU affinity, IRQ affinity, etc that could be<br>
tweaked. But let's assume that we don't want to get into that level of<br>
tweaking and tuning, and just want to use the defaults of the OS with<br>
minimal adjustment, is this setup okay? Are there any other Linux kernel<br>
adjustments, especially on the DNS server, that should be adjusted for<br>
high packet rates?<br>
<br>
Regards,<br>
Anand Buddhdev<br>
RIPE NCC<br>
______________________________<wbr>_________________<br>
dns-operations mailing list<br>
<a href="mailto:dns-operations@lists.dns-oarc.net">dns-operations@lists.dns-oarc.<wbr>net</a><br>
<a href="https://lists.dns-oarc.net/mailman/listinfo/dns-operations
dns-operations" rel="noreferrer" target="_blank">https://lists.dns-oarc.net/<wbr>mailman/listinfo/dns-<wbr>operations<br>
dns-operations</a> mailing list<br>
<a href="https://lists.dns-oarc.net/mailman/listinfo/dns-operations" rel="noreferrer" target="_blank">https://lists.dns-oarc.net/<wbr>mailman/listinfo/dns-<wbr>operations</a><br>
</blockquote></div><br></div>