⏱️

サクッとDNSのベンチマーク(DoH3、DoT、DoQ対応)

に公開

やること

たまに、サクッとDNSサーバーのベンチマークを測りたい時がありますよね😆

そんなときに、CLIで簡単にDNSの応答速度を測るツールとしてdnspyreがあります。

なんと、マルチプラットフォーム対応でLinuxやWindows、MacOS、ARM系でも動きます。

https://github.com/Tantalor93/dnspyre

こんな感じのレポートをコマンドを叩くだけで簡単に得られます!


ベンチマークの結果

検証環境

クライアント側

  • Windows 11
  • Ubuntu 24.04

インストール方法

Github Releaseからダウンロード

以下のリンクから、Latestタグの最新の安定版をダウンロードします。
https://github.com/Tantalor93/dnspyre/releases/latest

Assetsの中から以下を参考にして、自分のパソコンに合ったバージョンをダウンロードします。

解凍

Windowsでも以下のコマンドで解凍できます
tar -xvzf ./dnspyre_windows_amd64.tar.gz -C ./dnspyre

Homebrew

シェル補完も併せて自動的使えるようになるらしいです。(確認していない)

brew tap tantalor93/dnspyre
brew install dnspyre

Go Tooling

Go製なので、Gopherの方は、go installするだけで使えます。

go install github.com/tantalor93/dnspyre/v3@latest
Bash/ZSH シェル補完の設定方法

Homebrew以外の場合は、手動でシェル補完を入れることもできます。

ZSHの場合、~/.zprofileなどに追加
eval "$(dnspyre --completion-script-zsh)"
Bashの場合、~/.bash_profileなどに追加
eval "$(dnspyre --completion-script-bash)"

コマンド例

例えば、以下のようなコマンドを入力するだけで、簡単にDNSサーバーのベンチマークを取ることができます。

# DNSサーバー(8.8.8.8)に対して、10並列スレッド・各2回(10スレッドx2回=合計20回)
# example.comを問い合わせてベンチマークを測定する
$ ./dnspyre -n 2 -c 10 --server 8.8.8.8 example.com

Benchmarking 8.8.8.8:53 via udp with 10 concurrent requests

Total requests:         20       # 送信したDNSリクエストの総数
DNS success responses:  20       # 正常に応答が返ってきた回数

DNS response codes:              # DNSの返答コードの内訳
        NOERROR:        20 

DNS question types:              # 問い合わせたレコードの種類
        A:      20

Time taken for tests:   6.13ms   # テスト開始から全リクエスト完了までにかかった実時間
Questions per second:   3264.0   # 1秒当たりに換算したスループット(処理能力)
DNS timings, 20 datapoints
         min:           1.05ms   # 最小: 最も速かった応答
         mean:          1.93ms   # 平均値: 全体の平均応答速度
         [+/-sd]:       470.95µs # 標準偏差: データのばらつき(ブレ)
         max:           2.62ms   # 最大値: 最も遅かった応答
         p99:           2.62ms   # 以下、パーセンタイル値
         p95:           2.62ms
         p90:           2.62ms
         p75:           2.36ms
         p50:           2.36ms   # 中央値

# 分布図: 応答速度のばらつきを視覚化したグラフ
# LATENCY: 遅延時間, COUNT: 回数
DNS distribution, 20 datapoints
  LATENCY |                                             | COUNT  
----------+---------------------------------------------+--------
  1.18ms  | ▄▄▄▄▄▄▄▄▄▄▄▄                                |     2  
  1.44ms  | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄       |     6  
  1.7ms   |                                             |     0  
  1.97ms  | ▄▄▄▄▄▄                                      |     1  
  2.23ms  | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ |     7  
  2.49ms  | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄                   |     4  

使い方

使えるDNSの種類

TCPとかもできますが、よく使うもの以外は割愛します。

通常のDNS

dnspyre --server <DNSサーバー> <問い合わせたいドメイン>

dnspyre --server 8.8.8.8 example.com

DNS over HTTPS(DoH)

dnspyre --server https://<DNSサーバー> <問い合わせたいドメイン>

dnspyre --server https://dns.google/dns-query example.com

# DNS-over-HTTP/3(DoH/3)
# doh-protocolで指定すれば、QUICを使うDoH/3も使えます!
dnspyre --server https://dns.google/dns-query --doh-protocol 3 example.com

DNS over TLS(DoT)

dnspyre --dot --server <DNSサーバー[:ポート番号]> <問い合わせたいドメイン>

dnspyre --dot --server dns.google example.com

DNS over QUIC(DoQ)

なんとQUICにまで対応しています!

dnspyre --server quic://<DNSサーバー> <問い合わせたいドメイン>

dnspyre --server quic://ultralow.dns.nextdns.io example.com

ベンチマークを取る

並列スレッド数と連続実行回数を指定する

先頭に-n-cをつけて、並列スレッド数と各スレッドの実行回数を指定して、DNSを問い合わせます。

dnspyre -n <各スレッドの実行回数> -c <並列スレッド数> --server <DNSサーバー> <問い合わせたいドメイン>

# 10並列スレッド・各2回(10スレッドx2回=合計20回)
dnspyre -n 2 -c 10 --dot --server dns.google example.com

並列スレッド数で計測したい時間を指定する

先頭に--duration-cをつけて、並列スレッド数とベンチマークを計測したい時間を指定して、DNSを問い合わせます。

dnspyre --duration <計測したい時間> -c <並列スレッド数> --server <DNSサーバー> <問い合わせたいドメイン>

# 10並列スレッド・30秒間でベンチマークを計測する
dnspyre --duration 30s -c 10 --dot --server dns.google example.com

その他

ここでは、よく使いそうなコマンドを大まかに書きましたが、他にもDNSクエリタイプの指定やDNSSECの応答チェック、そして、Prometheusにエクスポートしてリアルタイムに監視するなんてことまで...

ぜひ、公式ドキュメントをチェックしてください。

https://tantalor93.github.io/dnspyre/examples.html

まとめ

セルフホストしたDNSサーバーの応答速度を最適化する沼にはまりましょう。

参考

https://github.com/Tantalor93/dnspyre

https://tantalor93.github.io/dnspyre/

Discussion