dnstcpbench を使ってみた

balaeniceps-rex DNS

DNS 用のストレスツールである dnstcpbench をいろいろ試してみました。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

DNS 用のストレスツールの比較を行いました。「DNS 用ストレスツールの比較」をご参照ください。

dnstcpbench を実施する OS のバージョンは以下のとおりです。

[root@rocky8-client ~]# uname -a
Linux rocky8-client.mydomain 4.18.0-553.56.1.el8_10.x86_64 #1 SMP Tue Jun 10 17:00:45 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

dnstcpbench のバージョンは以下のとおりです。

[root@rocky8-client ~]# dnstcpbench --version
dnstcpbench 4.8.4
参考:dnstcpbench のインストール

EPEL リポジトリインストール

[root@rocky8-client ~]# dnf install epel-release -y

- 省略 -

インストール済み:
  epel-release-8-18.el8.noarch

完了しました!
[root@rocky8-client ~]#

dnstcpbench のインストール

[root@rocky8-client ~]# dnf install pdns-tools -y

- 省略 -

インストール済み:
  boost-program-options-1.66.0-13.el8.x86_64           libsodium-1.0.18-2.el8.x86_64           pdns-tools-4.8.4-1.el8.x86_64

完了しました!
[root@rocky8-client ~]# which dnstcpbench
/usr/bin/dnstcpbench
[root@rocky8-client ~]# rpm -qf `which dnstcpbench`
pdns-tools-4.8.4-1.el8.x86_64
[root@rocky8-client ~]#
参考:dnstcpbench のヘルプ
[root@rocky8-client ~]# dnstcpbench -h
Syntax: dnstcpbench REMOTE [PORT] < QUERIES
Where QUERIES is one query per line, format: qname qtype, just 1 space
Allowed options:
  -h [ --help ]            produce help message
  --version                print version number
  -v [ --verbose ]         be verbose
  -u [ --udp-first ]       try UDP first
  -f [ --file ] arg        source file - if not specified, defaults to stdin
  --tcp-no-delay arg (=1)  use TCP_NODELAY socket option
  --timeout-msec arg (=10) wait for this amount of milliseconds for an answer
  --workers arg (=100)     number of parallel workers

[root@rocky8-client ~]#

概要

  • クエリデータをファイルに登録し、dnstcpbench コマンドに読み込ませることでクエリを送信することができます。
  • クエリリクエストの RD フラグは 0(非再帰問い合わせ)のため、基本的には権威 DNS へ負荷をかけるためのツールと思われます。ヘルプでは、RD フラグを 1(再起問い合わせ)として送信するためのオプションは見当たりませんでした。
  • トランスポートのデフォルトは TCP です。-u オプションを指定することで UDP を優先させることができます。”優先”という表現ですが、UDP で Truncated(切り捨て)が発生した場合、TCP での再送(TCP フォールバック)が行われます。
  • dnstcpbench 実行後に表示される統計情報を見ていただければわかりますが、UDP のクエリが正しく集計されないようです。TCP および TCP フォールバックのクエリについては集計されていました。確認不足で申し訳ありませんが、そういう仕様なのかはわかりませんでした。
  • dnstcpbench ではオプションで指定したファイル内のクエリデータを順次処理し、データが尽きたところで処理を終了するだけのようです。ヘルプを見る限り、ファイルを繰り返し読み込むとか、ある一定時間クエリリクエストを送信し続けるといったようなオプションはないようです。
  • あと、qps を指定するオプションは無いようです。

キャッシュ DNS へ UDP でクエリ

RD フラグは 0(非再帰問い合わせ)のため、キャッシュ DNS へのクエリはあまり意味がないので、実行ログだけ参考までに記載しておきます。

参考:キャッシュ DNS がキャッシュを持たない場合の実行ログ

キャッシュ DNS に test.com がキャッシュされていないことを確認。

[root@rocky8-dns02 ~]# rndc flush
[root@rocky8-dns02 ~]# rndc dumpdb
[root@rocky8-dns02 ~]# grep test.com /var/named/data/cache_dump.db
[root@rocky8-dns02 ~]#

dnstcpbench を実行。10.0.2.40 はキャッシュ DNS。

[root@rocky8-client dnstcpbench]# cat test.com.lst
always1.test.com A
[root@rocky8-client dnstcpbench]# dnstcpbench -v -u -f test.com.lst 10.0.2.40
Sending queries to: 10.0.2.40:53
Attempting UDP first: yes
Timeout: 10 ms
Using TCP_NODELAY: 1
Average qps: 1, median qps: 0
Average UDP latency: 1920 us, median: 0 us
Average TCP latency: 0 us, median: 0 us
OK: 0, network errors: 0, other errors: 0
Timeouts: 0
Truncateds: 0, auth answers: 0
[root@rocky8-client dnstcpbench]#

dnstcpbench 実行中のパケットキャプチャ。クエリリクエストに対し、root の NS が返されている。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
2 ^C
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
    1 17:19:17.002213896    10.0.2.44 → 10.0.2.40    DNS 76 Standard query 0x0000 A always1.test.com
    2 17:19:17.003956195    10.0.2.40 → 10.0.2.44    DNS 137 Standard query response 0x0000 A always1.test.com NS z.root-servers.net NS x.root-servers.net NS y.root-servers.net
[root@rocky8-client ~]#
参考:キャッシュ DNS がキャッシュを持つ場合の実行ログ

test.com を事前にキャッシュ。

[root@rocky8-client dnstcpbench]# dig @cachedns always1.test.com +short
2.3.4.5
[root@rocky8-dns02 ~]# rndc dumpdb
[root@rocky8-dns02 ~]# grep test.com /var/named/data/cache_dump.db
test.com.               604785  NS      ns1.test.com.
                        604785  NS      ns2.test.com.
always1.test.com.       45      A       2.3.4.5
ns1.test.com.           604785  A       10.0.2.32
ns2.test.com.           604785  A       10.0.2.32
[root@rocky8-dns02 ~]#

dnstcpbench を実行。10.0.2.40 はキャッシュ DNS。

[root@rocky8-client dnstcpbench]# dnstcpbench -v -u -f test.com.lst 10.0.2.40
Sending queries to: 10.0.2.40:53
Attempting UDP first: yes
Timeout: 10 ms
Using TCP_NODELAY: 1
Average qps: 1, median qps: 0
Average UDP latency: 1249 us, median: 0 us
Average TCP latency: 0 us, median: 0 us
OK: 0, network errors: 0, other errors: 0
Timeouts: 0
Truncateds: 0, auth answers: 0
[root@rocky8-client dnstcpbench]#

dnstcpbench 実行中のパケットキャプチャ。クエリリクエストに対し、test.com の NS が返されている。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
2 ^C
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
    1 17:10:38.773159345    10.0.2.44 → 10.0.2.40    DNS 76 Standard query 0x0000 A always1.test.com
    2 17:10:38.774216040    10.0.2.40 → 10.0.2.44    DNS 144 Standard query response 0x0000 A always1.test.com NS ns2.test.com NS ns1.test.com A 10.0.2.32 A 10.0.2.32
[root@rocky8-client ~]#

権威 DNS へ UDP でクエリ

「概要」で述べたとおりですが、dnstcpbench 実行後に表示される統計情報に UDP クエリは正しく反映されていないように見えます。

クエリデータを登録したファイルを用意します。(*1)

*1 ここでは権威サーバ側に PolarDNS を使用していますが、PolarDNS は alwaysX.test.com のクエリに対し、NOERROR のレスポンスを自動的に返します。ゾーンファイルへの RR の登録を必要としません。
[root@rocky8-client dnstcpbench]# rm -f test.com.lst
[root@rocky8-client dnstcpbench]# for i in `seq 1 10000`; do
>   echo "always${i}.test.com A" >> test.com.lst
> done
[root@rocky8-client dnstcpbench]# wc -l test.com.lst
10000 test.com.lst
[root@rocky8-client dnstcpbench]# head -n 1 test.com.lst; tail -n 1 test.com.lst
always1.test.com A
always10000.test.com A
[root@rocky8-client dnstcpbench]#

dnstcpbench には以下のオプションを指定します。また、dnstcpbench 実行の際、time コマンドで時間を計測します。

(-v) 試験結果の詳細表示を指定
(-u) トランスポートに UDP 優先を指定
(-f) クエリのリストファイルに test.com.lst を指定
試験対象の DNS サーバに 10.0.2.32(test.com の NS)を指定(*1)

dnstcpbench の結果では Timeouts: 9727 と集計されているため、273 件は返されているはずですが、OK: 行には全くカウントされていません。

*1 dnstcpbench では /etc/hosts のホスト名が使用できなかったため、IP アドレスを直接指定しています。
[root@rocky8-client dnstcpbench]# time dnstcpbench -v -u -f test.com.lst 10.0.2.32
Sending queries to: 10.0.2.32:53
Attempting UDP first: yes
Timeout: 10 ms
Using TCP_NODELAY: 1
Average qps: 10000, median qps: 0   <<qps の平均値と中間値のはずですが…
Average UDP latency: 3728.7 us, median: 10.1465 us
Average TCP latency: 0 us, median: 0 us
OK: 0, network errors: 0, other errors: 0   <<実際のクエリ件数が反映されていません。
Timeouts: 9727
Truncateds: 0, auth answers: 0

real    0m6.697s   <<time コマンドの表示(実行時間と cpu 使用時間)
user    0m0.004s
sys     0m1.329s
[root@rocky8-client dnstcpbench]#

以下は、dnstcpbench 実行中のパケットキャプチャのログです。
x.x.x.44 はクライアント(スタブリゾルバ)、x.x.x.32 は権威 DNS(test.com の NS)のアドレスです。クエリリクエスト(#1)の Recursion desired は 0(非再帰問い合わせ)を示しています。dnstcpbench では OK: 等の集計はありませんでしたが、パケットキャプチャではクエリレスポンス(#18)が返されていることが確認できます。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
16565 ^C
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap | grep "Standard query" | grep always1.test.com
Running as user "root" and group "root". This could be dangerous.
    1 16:10:58.074664327    10.0.2.44 → 10.0.2.32    DNS 76 Standard query 0x0000 A always1.test.com
   18 16:10:58.082578912    10.0.2.32 → 10.0.2.44    DNS 92 Standard query response 0x0000 A always1.test.com A 2.3.4.5
[root@rocky8-client ~]# tshark -nn -r /tmp/test.pcap  -Y '(frame.number==1)' -V | grep ^Domain -A10 | cat -n
Running as user "root" and group "root". This could be dangerous.
     1  Domain Name System (query)
     2      Transaction ID: 0x0000
     3      Flags: 0x0000 Standard query
     4          0... .... .... .... = Response: Message is a query
     5          .000 0... .... .... = Opcode: Standard query (0)
     6          .... ..0. .... .... = Truncated: Message is not truncated
     7          .... ...0 .... .... = Recursion desired: Don't do query recursively
     8          .... .... .0.. .... = Z: reserved (0)
     9          .... .... ...0 .... = Non-authenticated data: Unacceptable
    10      Questions: 1
    11      Answer RRs: 0
[root@rocky8-client ~]#

権威 DNS へ TCP でクエリ

デフォルト(TCP)で権威 DNS へクエリリクエストを送信します。
TCP パケットのクエリ件数は、dnstcpbench 実行後に表示される統計情報に正しく反映されています。

クエリデータを登録したファイルを用意します。(*1)

*1 ここでは権威サーバ側に PolarDNS を使用していますが、PolarDNS は alwaysX.test.com のクエリに対し、NOERROR のレスポンスを自動的に返します。ゾーンファイルへの RR の登録を必要としません。
[root@rocky8-client dnstcpbench]# rm -f test.com.lst
[root@rocky8-client dnstcpbench]# for i in `seq 1 10000`; do
>   echo "always${i}.test.com A" >> test.com.lst
> done
[root@rocky8-client dnstcpbench]# wc -l test.com.lst
10000 test.com.lst
[root@rocky8-client dnstcpbench]# head -n 1 test.com.lst; tail -n 1 test.com.lst
always1.test.com A
always10000.test.com A
[root@rocky8-client dnstcpbench]#

dnstcpbench には以下のオプションを指定します。また、dnstcpbench 実行の際、time コマンドで時間を計測します。

(-v) 試験結果の詳細表示を指定
(-f) クエリのリストファイルに test.com.lst を指定
試験対象の DNS サーバに 10.0.2.32(test.com の NS)を指定(*1)
*1 dnstcpbench では /etc/hosts のホスト名が使用できなかったため、IP アドレスを直接指定しています。
[root@rocky8-client dnstcpbench]# time dnstcpbench -v -f test.com.lst 10.0.2.32
Sending queries to: 10.0.2.32:53
Attempting UDP first: no
Timeout: 10 ms
Using TCP_NODELAY: 1
Average qps: 294.118, median qps: 315.529   <<qps の平均値と中間値
Average UDP latency: 0 us, median: 0 us
Average TCP latency: 313788 us, median: 287706 us
OK: 9992, network errors: 0, other errors: 0   <<OK: + Timeouts: = 10000(ファイル登録件数と一致)
Timeouts: 8
Truncateds: 0, auth answers: 9992

real    0m31.939s   <<time コマンドの表示(実行時間と cpu 使用時間)
user    0m0.007s
sys     0m4.460s
[root@rocky8-client dnstcpbench]#

以下は、dnstcpbench 実行中のパケットキャプチャのログです。
x.x.x.44 はクライアント(スタブリゾルバ)、x.x.x.32 は権威 DNS(test.com の NS)のアドレスです。TCP の 3WAY ハンドシェイク(#1-3)の後、クエリリクエスト(#4)が送信されています。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
70703 ^C
36643 packets dropped
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap | head -n 10
Running as user "root" and group "root". This could be dangerous.
    1 16:44:46.710653280    10.0.2.44 → 10.0.2.32    TCP 74 46042 → 53 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=2406805162 TSecr=0 WS=128
    2 16:44:46.711771466    10.0.2.32 → 10.0.2.44    TCP 74 53 → 46042 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=573877042 TSecr=2406805162 WS=128
    3 16:44:46.711908106    10.0.2.44 → 10.0.2.32    TCP 66 46042 → 53 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=2406805163 TSecr=573877042
    4 16:44:46.712504279    10.0.2.44 → 10.0.2.32    DNS 102 Standard query 0x0000 A always1.test.com
    5 16:44:46.712850810    10.0.2.44 → 10.0.2.32    TCP 74 46044 → 53 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=2406805164 TSecr=0 WS=128
    6 16:44:46.713500005    10.0.2.32 → 10.0.2.44    TCP 66 53 → 46042 [ACK] Seq=1 Ack=37 Win=29056 Len=0 TSval=573877044 TSecr=2406805164
    7 16:44:46.713505157    10.0.2.32 → 10.0.2.44    TCP 74 53 → 46044 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=573877045 TSecr=2406805164 WS=128
    8 16:44:46.713938451    10.0.2.44 → 10.0.2.32    TCP 66 46044 → 53 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=2406805165 TSecr=573877045
    9 16:44:46.714749785    10.0.2.32 → 10.0.2.44    DNS 118 Standard query response 0x0000 A always1.test.com A 2.3.4.5
   10 16:44:46.714754652    10.0.2.44 → 10.0.2.32    TCP 66 46042 → 53 [ACK] Seq=37 Ack=53 Win=29312 Len=0 TSval=2406805166 TSecr=573877046
tshark: An error occurred while printing packets: Broken pipe.
[root@rocky8-client ~]#

truncated(切り捨て)発生時の動作

UDP でクエリリクエストを送信した場合、クエリレスポンスの RR(Resource Record)サイズが大きいと(DNS サーバの設定にもよりますが)truncated(切り捨て)が発生します。dnstcpbench では、truncated を受け取ると、UDP を TCP に変更しクエリリクエストを再送信(TCP フォールバック)します。

クエリデータを登録したファイルを用意します。
“www.test.co.jp A” は、truncated を発生させないクエリ、”bigtxt.test.co.jp TXT” を発生させるクエリです。それぞれ 1000 件づつ登録します。

[root@rocky8-client dnstcpbench]# rm -f test.co.jp.lst
[root@rocky8-client dnstcpbench]# for i in `seq 1 1000`; do
>   echo "www.test.co.jp A" >> test.co.jp.lst
>   echo "bigtxt.test.co.jp TXT" >> test.co.jp.lst
> done
[root@rocky8-client dnstcpbench]# wc -l test.co.jp.lst
2000 test.co.jp.lst
[root@rocky8-client dnstcpbench]# head -n 2 test.co.jp.lst
www.test.co.jp A
bigtxt.test.co.jp TXT
[root@rocky8-client dnstcpbench]#

以下の条件で実施します。

(-v) 試験結果の詳細表示を指定
(-u) トランスポートに UDP 優先を指定
(-f) クエリのリストファイルに test.co.jp.lst を指定
試験対象の DNS サーバに 10.0.2.28(test.co.jp の NS)を指定
[root@rocky8-client dnstcpbench]# time dnstcpbench -v -u -f test.co.jp.lst 10.0.2.28
Sending queries to: 10.0.2.28:53
Attempting UDP first: yes
Timeout: 10 ms
Using TCP_NODELAY: 1
Average qps: 285.714, median qps: 198   <<qps の平均値と中間値
Average UDP latency: 165820 us, median: 101617 us
Average TCP latency: 73687.7 us, median: 402.863 us
OK: 1000, network errors: 0, other errors: 0  <<Truncated により TCP フォールバックされたクエリのみ集計されているっぽい。
Timeouts: 0
Truncateds: 1000, auth answers: 1000   <<Truncated の件数

real    0m4.965s
user    0m0.007s
sys     0m0.904s
[root@rocky8-client dnstcpbench]#

以下は、dnstcpbench 実行中のパケットキャプチャのログです。
x.x.x.44 はクライアント(スタブリゾルバ)、x.x.x.28 は権威 DNS(test.co.jp の NS)のアドレスです。
クエリレスポンス(#4)の Truncated で 1(切り捨て発生)が返され、TCP フォールバック(#5 以降)が行われています。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
14022 ^C
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap | head -n 10
Running as user "root" and group "root". This could be dangerous.
    1 17:27:14.149827681    10.0.2.44 → 10.0.2.28    DNS 74 Standard query 0x0000 A www.test.co.jp
    2 17:27:14.150624789    10.0.2.44 → 10.0.2.28    DNS 77 Standard query 0x0000 TXT bigtxt.test.co.jp
    3 17:27:14.151755418    10.0.2.28 → 10.0.2.44    DNS 131 Standard query response 0x0000 A www.test.co.jp A 1.2.3.4 NS ns2.test.jp NS ns1.test.jp
    4 17:27:14.151763768    10.0.2.28 → 10.0.2.44    DNS 77 Standard query response 0x0000 TXT bigtxt.test.co.jp
    5 17:27:14.151937697    10.0.2.44 → 10.0.2.28    TCP 74 41418 → 53 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=334594402 TSecr=0 WS=128
    6 17:27:14.152763670    10.0.2.28 → 10.0.2.44    TCP 74 53 → 41418 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=85996026 TSecr=334594402 WS=128
    7 17:27:14.152889741    10.0.2.44 → 10.0.2.28    TCP 66 41418 → 53 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=334594403 TSecr=85996026
    8 17:27:14.153478920    10.0.2.44 → 10.0.2.28    DNS 103 Standard query 0x0000 TXT bigtxt.test.co.jp
    9 17:27:14.153817053    10.0.2.44 → 10.0.2.28    DNS 74 Standard query 0x0000 A www.test.co.jp
   10 17:27:14.154053742    10.0.2.28 → 10.0.2.44    TCP 66 53 → 41418 [ACK] Seq=1 Ack=38 Win=29056 Len=0 TSval=85996028 TSecr=334594404
tshark: An error occurred while printing packets: Broken pipe.
[root@rocky8-client ~]# tshark -nn -r /tmp/test.pcap  -Y '(frame.number==4)' -V | grep ^Domain -A10 | cat -n
Running as user "root" and group "root". This could be dangerous.
     1  Domain Name System (response)
     2      Transaction ID: 0x0000
     3      Flags: 0x8600 Standard query response, No error
     4          1... .... .... .... = Response: Message is a response
     5          .000 0... .... .... = Opcode: Standard query (0)
     6          .... .1.. .... .... = Authoritative: Server is an authority for domain
     7          .... ..1. .... .... = Truncated: Message is truncated   <<切り捨て発生
     8          .... ...0 .... .... = Recursion desired: Don't do query recursively
     9          .... .... 0... .... = Recursion available: Server can't do recursive queries
    10          .... .... .0.. .... = Z: reserved (0)
    11          .... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server
[root@rocky8-client ~]#

timeout 発生時の動作

dnstcpbench はデフォルトでは 10 ms(–timeout-msec オプションで変更可能)でクエリが timeout します。クエリレスポンスが 1000 ms 遅延するクエリデータを用意し、意図的に timeout を発生させます。

まずは、クエリレスポンスが 1000 ms 遅延することを dig で確認します。

[root@rocky8-client dnstcpbench]# dig @dns-testcom always.slp1000.test.com +noall +comments +stats
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19328
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; Query time: 1021 msec   <<1000 ms 遅延
;; SERVER: 10.0.2.32#53(10.0.2.32)
;; WHEN: 金  7月 11 18:57:30 JST 2025
;; MSG SIZE  rcvd: 57

[root@rocky8-client dnstcpbench]#

次に dnstcpbench の動作を確認します。

クエリデータを登録したファイルを用意します。

[root@rocky8-client dnstcpbench]# rm -f test.com.lst
[root@rocky8-client dnstcpbench]# for i in `seq 1 1000`; do
>   echo "always${i}.slp1000.test.com A" >> test.com.lst
> done
[root@rocky8-client dnstcpbench]# wc -l test.com.lst
1000 test.com.lst
[root@rocky8-client dnstcpbench]# head -n 1 test.com.lst; tail -n 1 test.com.lst
always1.slp1000.test.com A
always1000.slp1000.test.com A
[root@rocky8-client dnstcpbench]#

以下の条件で実施します。

(-v) 試験結果の詳細表示を指定
(-f) クエリのリストファイルに test.com.lst を指定
試験対象の DNS サーバに 10.0.2.32(test.com の NS)を指定
[root@rocky8-client dnstcpbench]# time dnstcpbench -v -f test.com.lst 10.0.2.32
Sending queries to: 10.0.2.32:53
Attempting UDP first: no
Timeout: 10 ms            <<10 ms で timeout
Using TCP_NODELAY: 1
Average qps: 1000, median qps: 0   <<qps の平均値と中間値(値が変なのは全件 timeout だから?)
Average UDP latency: 0 us, median: 0 us
Average TCP latency: 0 us, median: 0 us
OK: 0, network errors: 0, other errors: 0
Timeouts: 1000            <<timeout の件数
Truncateds: 0, auth answers: 0

real    0m4.385s
user    0m0.004s
sys     0m0.400s
[root@rocky8-client dnstcpbench]#

以下は、dnstcpbench 実行中のパケットキャプチャのログです。
x.x.x.44 はクライアント(スタブリゾルバ)、x.x.x.32 は権威 DNS(test.com の NS)のアドレスです。dnstcpbench では全件 timeout として計上されていますが、パケットキャプチャではクエリレスポンス(#3465)が 1000 ms 遅延で返されていることが確認できます。

[root@rocky8-client ~]# tshark -i 1 -f "port 53" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
10812 ^C
[root@rocky8-client ~]# tshark -t a -r /tmp/test.pcap | grep -w always1
Running as user "root" and group "root". This could be dangerous.
  442 19:08:02.560116104    10.0.2.44 → 10.0.2.32    DNS 110 Standard query 0x0000 A always1.slp1000.test.com
 3465 19:08:03.562824211    10.0.2.32 → 10.0.2.44    DNS 126 Standard query response 0x0000 A always1.slp1000.test.com A 2.3.4.5
[root@rocky8-client ~]#

クエリリクエスト送信件数の制御について

「概要」で述べたとおりですが、dnstcpbench では -f で指定したファイル内のクエリデータが尽きるまで送信し続けます。一定期間負荷をかけ続けるためにはそれなりのデータ件数を用意する必要がありますが、何件必要かは環境ごとに実行してみるまではわかりません。過剰にデータを用意するといつまでも終了しませんが、強制終了すると統計情報が集計されません。想定されるピークの件数を見積もり、その値で負荷試験を行うしかないかと。

timeout コマンドで強制終了時の動作を確認します。次の検証は統計情報が正常に集計されないことの確認ですので、実際の負荷試験には役に立つことはないと思いますが一応記載しておきます。

クエリデータを作成します。(*1)

*1 ここでは権威サーバ側に PolarDNS を使用していますが、PolarDNS は alwaysX.test.com のクエリに対し、NOERROR のレスポンスを自動的に返します。ゾーンファイルへの RR の登録を必要としません。
[root@rocky8-client dnstcpbench]# rm -f test.com.lst
[root@rocky8-client dnstcpbench]# for i in `seq 1 100000`; do
>   echo "always${i}.test.com A" >> test.com.lst
> done
[root@rocky8-client dnstcpbench]# wc -l test.com.lst
100000 test.com.lst
[root@rocky8-client dnstcpbench]# head -n 1 test.com.lst; tail -n 1 test.com.lst
always1.test.com A
always100000.test.com A
[root@rocky8-client dnstcpbench]#

dnstcpbench に指定するオプションは以下のとおりです。dnstcpbench は timeout コマンドで 30 秒後に強制終了します。

(-v) 試験結果の詳細表示を指定
(-f) クエリのリストファイルに test.com.lst を指定
試験対象の DNS サーバに 10.0.2.32(test.com の NS)を指定

結果は以下のとおりですが、統計情報が表示されていません。

[root@rocky8-client dnstcpbench]# timeout 30 dnstcpbench -v -f test.com.lst 10.0.2.32
Sending queries to: 10.0.2.32:53
Attempting UDP first: no
Timeout: 10 ms
Using TCP_NODELAY: 1
[root@rocky8-client dnstcpbench]#

Ctrl+C でも dnstcpbench を強制終了してみましたが、やはり統計情報は表示されませんでした。

[root@rocky8-client dnstcpbench]# time dnstcpbench -v -f test.com.lst 10.0.2.32
Sending queries to: 10.0.2.32:53
Attempting UDP first: no
Timeout: 10 ms
Using TCP_NODELAY: 1
^C                   <<Ctrl+C 押下で強制終了

real    0m10.242s
user    0m0.007s
sys     0m1.470s
[root@rocky8-client dnstcpbench]#
タイトルとURLをコピーしました