汎用ハードウェアを使用した DNS サーバーのストレス テストとパフォーマンスを測定するために構築されたコマンド ライン DNS ベンチマーク ツール。このツールは通常、同時接続あたり最大 30 KB を消費しますが、サーバー、OS、およびネットワークが適切なレベルの同時実行を実現できる場合、最新のコアあたり最大 30,000 QPS を維持できます。
DNStrace は OS リゾルバーをバイパスし、Docker パッケージの事前構築済み静的バイナリとして提供されます。基本的な遅延測定、結果チェック、およびヒストグラムがサポートされています。現在、 A
、 AAAA
、およびTXT
質問のみがサポートされています。
$ dnstrace --help usage: dnstrace [<flags>] <queries>... A DNS benchmark. Flags: --help Show context-sensitive help (also try --help-long and --help-man). -s, --server="127.0.0.1" DNS server IP:port to test. -t, --type=A Query type. -n, --number=1 Number of queries to issue. Note that the total number of queries issued = number*concurrency*len(queries). -c, --concurrency=1 Number of concurrent queries to issue. -l, --rate-limit=0 Apply a global questions / second rate limit. -e, --expect=EXPECT ... Expect a specific response. -r, --recurse Allow DNS recursion. --edns0=0 Enable EDNS0 with specified size. --tcp Use TCP fot DNS requests. --write=1s DNS write timeout. --read=4s DNS read timeout. --codes Enable counting DNS return codes. --min=400µs Minimum value for timing histogram. --max=4s Maximum value for histogram. --precision=[1-5] Significant figure for histogram precision. --distribution Display distribution histogram of timings to stdout. --csv=/path/to/file.csv Export distribution to CSV. --io-errors Log I/O errors to stderr. --silent Disable stdout. --color ANSI Color output. --version Show application version. Args: <queries> Queries to issue.
dnstrace
パブリック ネットワーク経由の往復遅延をテストするのに役立ちますが、このコードは主に、独自のインフラストラクチャをテストするための Apachebench スタイルのツールを提供するために作成されました。
したがって、デフォルト以外の設定では、重大な DNS 負荷が非常に簡単に発生します。パブリック DNS サービスに対してはこれを行わないでください。おそらく、IP にフラグを立てるでしょう。
go get github.com/redsift/dnstrace
バイナリを$GOPATH/bin
にインストールします。 OS-X では、ネイティブ バイナリは、HyperKit で実行される以下の Docker コンテナよりも大幅にパフォーマンスが向上します。たとえば、スループットが 30% 向上、レイテンシが 30% 低下、タイミング スプレッドが 4 倍減少します。
このツールは、事前に構築されたイメージで利用できます。
docker run redsift/dnstrace --help
ローカル テスト設定で 50,000 QPS 以上に到達できる場合、Docker ネットワーキングによりスループットに最大 2% のオーバーヘッドが追加され、平均レイテンシに最大 8% が追加されることが期待できます (Linux Docker 1.12.3 でテスト)。これが目的にとって重要な場合は、 --net=host
指定して実行するとよいでしょう。
./dnstrace --completion-script-bash
および./dnstrace --completion-script-zsh
シェル補完スクリプトを作成します。
例えば
$ eval "$(./dnstrace --completion-script-zsh)" $ ./dnstrace --concurrency --codes --distribution --io-errors --precision --server --version --color --edns0 --max --rate-limit --silent --write --concurrency --expect --min --read --tcp --csv --help --number --recurse --type
OS-X 上で同時接続数が数千に近づくと、ファイル ハンドルまたはスレッドが不十分なために接続エラーが発生する可能性があります。これはプロセスの制限が原因である可能性が高いため、同時実行レベルを 1000 を超えて増やす場合は、必ずこれらの制限を調整してください。
sudo ulimit
使用すると、ルート シェルが作成され、その制限が調整されてから終了し、実質的な効果は発生しないことに注意してください。代わりに、OS-X では最初にlaunchctl
使用してください。
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
長時間実行する場合、ユーザーはkill -1 pid
を介して SIGHUP を送信して、現在の進行状況カウントを取得できます。
$ docker run redsift/dnstrace -n 10 -c 10 --server 8.8.8.8 --recurse redsift.io Benchmarking 8.8.8.8:53 via udp with 10 conncurrent requests Total requests: 100 of 100 (100.0%) DNS success codes: 100 DNS response codes NOERROR: 100 Time taken for tests: 107.091332ms Questions per second: 933.8 DNS timings, 100 datapoints min: 3.145728ms mean: 9.484369ms [+/-sd]: 5.527339ms max: 27.262975ms DNS distribution, 100 datapoints LATENCY | | COUNT +-------------+---------------------------------------------+-------+ 3.276799ms | ▄▄▄▄▄▄▄▄ | 2 3.538943ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 3.801087ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 4.063231ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 4.325375ms | ▄▄▄▄▄▄▄▄ | 2 4.587519ms | | 0 4.849663ms | | 0 5.111807ms | ▄▄▄▄ | 1 5.373951ms | ▄▄▄▄ | 1 5.636095ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 5.898239ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 6.160383ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 6.422527ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 6.684671ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 6.946815ms | ▄▄▄▄▄▄▄▄ | 2 7.208959ms | ▄▄▄▄ | 1 7.471103ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 9 7.733247ms | ▄▄▄▄▄▄▄▄ | 2 7.995391ms | ▄▄▄▄▄▄▄▄ | 2 8.257535ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 8.650751ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 9.175039ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 11 9.699327ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 6 10.223615ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 10.747903ms | ▄▄▄▄ | 1 11.272191ms | ▄▄▄▄ | 1 11.796479ms | | 0 12.320767ms | | 0 12.845055ms | | 0 13.369343ms | | 0 13.893631ms | ▄▄▄▄ | 1 14.417919ms | ▄▄▄▄ | 1 14.942207ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 15.466495ms | | 0 15.990783ms | ▄▄▄▄ | 1 16.515071ms | | 0 17.301503ms | | 0 18.350079ms | | 0 19.398655ms | ▄▄▄▄ | 1 20.447231ms | ▄▄▄▄▄▄▄▄ | 2 21.495807ms | ▄▄▄▄ | 1 22.544383ms | | 0 23.592959ms | | 0 24.641535ms | ▄▄▄▄ | 1 25.690111ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 26.738687ms | ▄▄▄▄ | 1