【dig】DNSの名前解決速度を測る

2023/01/08に公開約5,100字2件のコメント

Cloudflareの1.1.1.1というDNSリゾルバのツイートが目に入り、DNSの速度を測定してみたくなりました。
https://twitter.com/Cloudflare/status/1611368212582600704

そもそもDNSとは

DNSとは、Domain Name Systemの略です。
全てのコンピュータには、IPアドレスという住所のようなものが割り当てられています。
例えば、google.comのIPアドレスは”142.251.46.174"です。これをアドレスバーに入力すると、Googleの検索ページに飛ぶことができます。

しかし、私たちはIPアドレスを覚えてられません。そこで、IPアドレスの代わりにドメイン、もしくはURLを入力します。(今の時代、URLを入力することも少ない気がしますが...)
この入力されたドメインをIPアドレスに変換する役割を持っているのがDNSです。

ドメインからIPアドレスを調べる

ドメインからIPアドレスを調べることができるサイトがあるので、貼っておきます。
https://www.nslookup.io/domains/zenn.dev/webservers/

DNSリゾルバとは

DNSは、ドメインからIPアドレスへの変換(名前解決と呼ばれる)を行うためのシステムでした。このシステムの中には、いくつかの構成要素があり、そのうちの一つがDNSリゾルバです。
DNSリゾルバとは、名前解決を行うためのリクエストが最初に到達するサーバーのことです。再帰リゾルバとも呼ばれます。

また、DNSはルートサーバーやTLDサーバーなど複数のサーバーで構築されています。DNSリゾルバは、そのたくさんのサーバーにリクエストを送る役割を持っています。(DNSの中で一番忙しそう)

DNSリゾルバの確認方法

Macの場合

「アップルメニュー 」>「システム設定」>「ネットワーク」。 次に、右側でネットワークサービスを選択。「詳細」>「DNS」で確認できます。
https://support.apple.com/ja-jp/guide/mac-help/mh14127/mac

コマンド

scutil --dns | grep 'nameserver\[[0-9]*\]'
cat /etc/resolv.conf

https://superuser.com/questions/258151/how-do-i-check-what-dns-server-im-using-on-mac-os-x

DNSの速度

digコマンドを使うことで、名前解決の速度を計ることができます。

dig @リゾルバのIPアドレス ドメイン名

zenn.devに対して、1.1.1.1の速度を測ってみました。
色々と出力が出ていますが、速度は最後のブロックのQuery timeというところです。

❯ dig @1.1.1.1 zenn.dev

; <<>> DiG 9.10.6 <<>> @1.1.1.1 zenn.dev
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62385
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;zenn.dev.                      IN      A

;; ANSWER SECTION:
zenn.dev.               78986   IN      A       35.190.77.180

;; Query time: 29 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sun Jan 08 12:08:08 JST 2023
;; MSG SIZE  rcvd: 53

29 msecですね。
これだけだと、どれくらい早いのか分からないので、筆者のPCにリゾルバとして設定されていたルーターのIPアドレスを渡して、速度を測ってみます。

;; Query time: 0 msec

0 msec...早すぎる!!
これは、筆者がzenn.devがキャッシュされているのが原因ですね。

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

キャッシュをクリアしたので、もう一度やってみます。

Query time: 0 msec

...おかしい。

それでは、日本から遠そうなブラジルのサイトのドメインで試してみます。

❯ dig @1.1.1.1 www.ibge.gov.br

; <<>> DiG 9.10.6 <<>> @1.1.1.1 www.ibge.gov.br
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31081
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.ibge.gov.br.               IN      A

;; ANSWER SECTION:
www.ibge.gov.br.        1800    IN      A       170.84.40.26

;; Query time: 1004 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sun Jan 08 12:23:17 JST 2023
;; MSG SIZE  rcvd: 60

1秒もかかってますね!
それでは、自宅のルータに変えてやってみます。

;; Query time: 307 msec

??????????
おそらく、自分が何か大きな勘違いをしているのでしょう。
答えがすぐに見つからなそうなので、最後にDNSのベンチマークをするコマンドを紹介して終わります。

DNSのベンチマーク

dnsperftestというコマンドです。
https://github.com/cleanbrowsing/dnsperftest
Macで使う場合は、次をインストールしておいてください。

brew install bc bind

さて、どうなるか...

❯ git clone --depth=1 https://github.com/cleanbrowsing/dnsperftest/
❯ cd dnsperftest
❯ bash ./dnstest.sh |sort -k 22 -n
                     test1   test2   test3   test4   test5   test6   test7   test8   test9   test10  Average
192.168.50.1         1 ms    1 ms    1 ms    1 ms    1 ms    1 ms    1 ms    1 ms    1 ms    1 ms      1.00
norton               33 ms   29 ms   29 ms   34 ms   33 ms   29 ms   28 ms   28 ms   33 ms   34 ms     31.00
cloudflare           35 ms   32 ms   34 ms   27 ms   27 ms   27 ms   34 ms   32 ms   34 ms   31 ms     31.30
nextdns              30 ms   31 ms   31 ms   29 ms   34 ms   32 ms   35 ms   30 ms   30 ms   34 ms     31.60
cleanbrowsing        32 ms   28 ms   33 ms   35 ms   32 ms   34 ms   32 ms   36 ms   32 ms   33 ms     32.70
google               32 ms   25 ms   29 ms   69 ms   29 ms   26 ms   21 ms   64 ms   26 ms   26 ms     34.70
comodo               60 ms   59 ms   60 ms   57 ms   53 ms   63 ms   60 ms   60 ms   60 ms   60 ms     59.20
opendns              71 ms   35 ms   106 ms  119 ms  33 ms   200 ms  25 ms   27 ms   30 ms   33 ms     67.90
neustar              73 ms   72 ms   102 ms  75 ms   108 ms  76 ms   78 ms   74 ms   102 ms  133 ms    89.30
quad9                94 ms   88 ms   92 ms   92 ms   89 ms   91 ms   95 ms   87 ms   89 ms   92 ms     90.90
level3               26 ms   30 ms   34 ms   26 ms   28 ms   27 ms   29 ms   30 ms   30 ms   1000 ms   126.00
adguard              186 ms  174 ms  179 ms  183 ms  179 ms  174 ms  182 ms  185 ms  178 ms  176 ms    179.60
freenom              91 ms   1000 ms 99 ms   96 ms   1000 ms 95 ms   177 ms  96 ms   90 ms   99 ms     284.30
yandex               317 ms  308 ms  297 ms  312 ms  336 ms  311 ms  357 ms  328 ms  303 ms  301 ms    317.00

我がルーターが最強。

References

https://www.cloudflare.com/ja-jp/learning/dns/what-is-1.1.1.1/
https://ottan.jp/posts/2018/04/dns-performance-test-github/

Discussion

自宅のルータの方が早いという謎の結果

推測になりますが自宅のルーター側でDNSの返答をキャッシュ済みだと思われます。また、物理的にどのサーバーよりもルーターが近いからキャッシュ後は1msで提供できてると思います。

コメントありがとうございます。

ルーター側でDNSの返答をキャッシュ済み
なるほど、ということは、以下のコマンドはPC側のキャッシュ?を削除しているということなのでしょうか?

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
ログインするとコメントできます