====== 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/