TCP performance regression on FreeBSD
BIND 9.16.4 (and presumably master
) on a FreeBSD 12.1 (in a VM) has a TCP query performance regression compared to 9.16.3.
The stress test executes four instances of Flamethrower: UDP IPv6, UDP IPv4, TCP IPv6, and TCP IPv4. Knowing that each TCP Flamethrower runs with 30 concurrent generators, each sending 100 queries every 1000 ms we can calculate number of expected TCP queries processed by BIND. If at least 90 % of this target is processed, the test is considered pass.
This test does pass on Linux (Fedora 32) but fails on FreeBSD 12.1. Some difference can be accounted to difference between these two environments as the former is a bare metal, the latter a KVM VM, but still 9.16.3 on FreeBSD 12.1 performs close to Linux.
9.16.3: Stress test (FreeBSD 12.1 / recursive / 1 hour)
INFO: Recursive server 'ns3' received 21066269 TCP queries
INFO: About 21600000 TCP queries were expected
INFO: Minimum number of TCP queries required to pass is 19440000
INFO: BIND processed enough TCP queries
9.16.4: Stress test (Fedora 32 / recursive / 1 hour)
INFO: Recursive server 'ns3' received 20714111 TCP queries
INFO: About 21600000 TCP queries were expected
INFO: Minimum number of TCP queries required to pass is 19440000
INFO: BIND processed enough TCP queries
9.16.4: Stress test (FreeBSD 12.1 / recursive / 1 hour)
INFO: Recursive server 'ns3' received 11103214 TCP queries
INFO: About 21600000 TCP queries were expected
INFO: Minimum number of TCP queries required to pass is 19440000
ERROR: BIND did not process enough TCP queries
There's a performance problem on BIND 9.11 on FreeBSD too, but the TCP code seems to be a bit different.