====== Networking - DNS - DNS Performance Tests ======
Determine which DNS server is the quickest to use.
If all you care about is speed, then the DNS with the lower number for the websites you care about is probably your best bet.
----
===== Required =====
You need to install bc and dig. For Ubuntu:
sudo apt-get install bc dnsutils
----
===== Install =====
git clone --depth=1 https://github.com/cleanbrowsing/dnsperftest/
or manually create the following file, make it executable and run it:
#!/usr/bin/env bash
command -v bc > /dev/null || { echo "bc was not found. Please install bc."; exit 1; }
{ command -v drill > /dev/null && dig=drill; } || { command -v dig > /dev/null && dig=dig; } || { echo "dig was not found. Please install dnsutils."; exit 1; }
NAMESERVERS=`cat /etc/resolv.conf | grep ^nameserver | cut -d " " -f 2 | sed 's/\(.*\)/&/'`
PROVIDERS="
192.168.1.1#pfSense
192.168.1.2#Bind Server
1.1.1.1#cloudflare
4.2.2.1#level3
8.8.8.8#google
9.9.9.9#quad9
80.80.80.80#freenom
208.67.222.123#opendns
199.85.126.20#norton
185.228.168.168#cleanbrowsing
77.88.8.7#yandex
176.103.130.132#adguard
156.154.70.3#neustar
8.26.56.26#comodo
"
# Domains to test. Duplicated domains are ok
DOMAINS2TEST="www.google.com amazon.com facebook.com www.youtube.com www.reddit.com wikipedia.org twitter.com gmail.com www.google.com whatsapp.com"
totaldomains=0
printf "%-18s" ""
for d in $DOMAINS2TEST; do
totaldomains=$((totaldomains + 1))
printf "%-8s" "test$totaldomains"
done
printf "%-8s" "Average"
echo ""
for p in $NAMESERVERS $PROVIDERS; do
pip=${p%%#*}
pname=${p##*#}
ftime=0
printf "%-18s" "$pname"
for d in $DOMAINS2TEST; do
ttime=`$dig +tries=1 +time=2 +stats @$pip $d |grep "Query time:" | cut -d : -f 2- | cut -d " " -f 2`
if [ -z "$ttime" ]; then
#let's have time out be 1s = 1000ms
ttime=1000
elif [ "x$ttime" = "x0" ]; then
ttime=1
fi
printf "%-8s" "$ttime ms"
ftime=$((ftime + ttime))
done
avg=`bc -lq <<< "scale=2; $ftime/$totaldomains"`
echo " $avg"
done
exit 0;
----
===== Run =====
cd dnsperftest
bash ./dnstest.sh
returns:
test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 Average
127.0.0.53 9 ms 9 ms 9 ms 14 ms 19 ms 20 ms 9 ms 14 ms 1 ms 9 ms 11.30
Peter 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1.00
cloudflare 8 ms 10 ms 8 ms 8 ms 11 ms 9 ms 8 ms 9 ms 8 ms 8 ms 8.70
level3 13 ms 14 ms 14 ms 14 ms 14 ms 13 ms 14 ms 13 ms 13 ms 14 ms 13.60
google 7 ms 7 ms 19 ms 12 ms 18 ms 19 ms 7 ms 13 ms 7 ms 12 ms 12.10
quad9 20 ms 18 ms 23 ms 22 ms 14 ms 120 ms 15 ms 20 ms 16 ms 23 ms 29.10
freenom 25 ms 35 ms 20 ms 46 ms 42 ms 148 ms 25 ms 25 ms 22 ms 121 ms 50.90
opendns 8 ms 8 ms 8 ms 25 ms 8 ms 112 ms 8 ms 25 ms 13 ms 9 ms 22.40
norton 8 ms 8 ms 8 ms 8 ms 8 ms 8 ms 8 ms 8 ms 8 ms 8 ms 8.00
cleanbrowsing 19 ms 15 ms 14 ms 18 ms 19 ms 18 ms 14 ms 14 ms 14 ms 14 ms 15.90
yandex 47 ms 76 ms 47 ms 47 ms 47 ms 160 ms 47 ms 52 ms 47 ms 47 ms 61.70
adguard 19 ms 18 ms 18 ms 19 ms 14 ms 14 ms 14 ms 18 ms 14 ms 20 ms 16.80
neustar 20 ms 20 ms 22 ms 20 ms 21 ms 22 ms 24 ms 21 ms 22 ms 20 ms 21.20
comodo 14 ms 15 ms 13 ms 15 ms 13 ms 128 ms 14 ms 14 ms 15 ms 16 ms 25.70
**NOTE:** To sort with the fastest first, add **| sort -k 22 -n** at the end of the command:
dnstest.sh | sort -k 22 -n
==== For Windows users using the Linux subsystem ====
If you receive an error **$'\r':** command not found, convert the file to a Linux-compatible line endings using:
tr -d '\15\32' < dnstest.sh > dnstest-2.sh
Then run bash ./dnstest-2.sh
----
===== Use Docker to run the DNS performance test =====
==== Have a Dockerfile ====
Dockerfile contains the following:
FROM alpine:latest
RUN apk --no-cache add bash bc drill \
&& mkdir /app \
&& wget https://raw.githubusercontent.com/cleanbrowsing/dnsperftest/master/dnstest.sh -O /app/dnstest.sh \
&& chmod +x /app/dnstest.sh
ENTRYPOINT ["/app/dnstest.sh"]
----
==== Build the Docker image ====
docker build --tag dnstest .
returns:
Sending build context to Docker daemon 83.46kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
aad63a933944: Pull complete
Digest: sha256:b276d875eeed9c7d3f1cfa7edb06b22ed22b14219a7d67c52c56612330348239
Status: Downloaded newer image for alpine:latest
---> a187dde48cd2
Step 2/3 : RUN apk --no-cache add bash bc drill && mkdir /app && wget https://raw.githubusercontent.com/cleanbrowsing/dnsperftest/master/dnstest.sh -O /app/dnstest.sh && chmod +x /app/dnstest.sh
---> Running in a8c11400d24c
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/7) Installing ncurses-terminfo-base (6.1_p20200118-r3)
(2/7) Installing ncurses-libs (6.1_p20200118-r3)
(3/7) Installing readline (8.0.1-r0)
(4/7) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
(5/7) Installing bc (1.07.1-r1)
(6/7) Installing ldns (1.7.1-r1)
(7/7) Installing drill (1.7.1-r1)
Executing busybox-1.31.1-r9.trigger
OK: 8 MiB in 21 packages
Connecting to raw.githubusercontent.com (151.101.64.133:443)
saving to '/app/dnstest.sh'
dnstest.sh 100% |********************************| 1582 0:00:00 ETA
'/app/dnstest.sh' saved
Removing intermediate container a8c11400d24c
---> f04a1f625386
Step 3/3 : ENTRYPOINT ["/app/dnstest.sh"]
---> Running in f23f9090e44f
Removing intermediate container f23f9090e44f
---> 2d50dc06d819
Successfully built 2d50dc06d819
Successfully tagged dnstest:latest
----
==== Run the Docker image ====
docker run dnstest
----
===== References =====
https://github.com/cleanbrowsing/dnsperftest
https://www.senki.org/network-operations-scaling/dns-latency-and-performance-test-tools/