⏱️
サクッとDNSのベンチマーク(DoH3、DoT、DoQ対応)
やること
たまに、サクッとDNSサーバーのベンチマークを測りたい時がありますよね😆
そんなときに、CLIで簡単にDNSの応答速度を測るツールとしてdnspyreがあります。
なんと、マルチプラットフォーム対応でLinuxやWindows、MacOS、ARM系でも動きます。
こんな感じのレポートをコマンドを叩くだけで簡単に得られます!

ベンチマークの結果
検証環境
クライアント側
- Windows 11
- Ubuntu 24.04
インストール方法
Github Releaseからダウンロード
以下のリンクから、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にエクスポートしてリアルタイムに監視するなんてことまで...
ぜひ、公式ドキュメントをチェックしてください。
まとめ
セルフホストしたDNSサーバーの応答速度を最適化する沼にはまりましょう。
参考
Discussion