Befehlszeilen-DNS-Benchmark-Tool zum Stresstest und Messen der Leistung von DNS-Servern mit handelsüblicher Hardware. Dieses Tool verbraucht in der Regel ca. 30 KB pro gleichzeitiger Verbindung und kann ca. 30.000 QPS pro modernem Kern aufrechterhalten, wenn Ihr Server, Ihr Betriebssystem und Ihr Netzwerk es Ihnen ermöglichen, geeignete Ebenen der Parallelität zu erreichen.
DNStrace umgeht Betriebssystem-Resolver und wird als vorgefertigte statische Binärdatei im Docker-Paket bereitgestellt. Grundlegende Latenzmessung, Ergebnisprüfung und Histogramme werden unterstützt. Derzeit werden nur A
, AAAA
und TXT
Fragen unterstützt.
$ 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.
Während dnstrace
zum Testen der Roundtrip-Latenz über öffentliche Netzwerke hilfreich ist, wurde der Code in erster Linie erstellt, um ein Tool im Apachebench-Stil zum Testen Ihrer eigenen Infrastruktur bereitzustellen.
Es ist daher sehr einfach, mit nicht standardmäßigen Einstellungen eine erhebliche DNS-Last zu erzeugen. Tun Sie dies nicht bei öffentlichen DNS-Diensten . Sie werden höchstwahrscheinlich Ihre IP markieren.
go get github.com/redsift/dnstrace
und installieren Sie die Binärdatei in Ihrem $GOPATH/bin
. Unter OS-X wird die native Binärdatei den unten aufgeführten Docker-Container, der unter HyperKit läuft, deutlich übertreffen, z. B. 30 % mehr Durchsatz, 30 % geringere Latenz und eine 4-fache Verringerung der Timing-Spreizung
Dieses Tool ist in einem vorgefertigten Image verfügbar.
docker run redsift/dnstrace --help
Wenn Sie mit Ihrem lokalen Test-Setup 50.000 QPS und mehr erreichen können, können Sie davon ausgehen, dass das Docker-Netzwerk den Overhead um ca. 2 % zum Durchsatz und ca. 8 % zur mittleren Latenz erhöht (getestet auf Linux Docker 1.12.3). Wenn dies für Ihre Zwecke von Bedeutung ist, können Sie es mit --net=host
ausführen
./dnstrace --completion-script-bash
und ./dnstrace --completion-script-zsh
erstellen Shell-Vervollständigungsskripte.
z.B
$ 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
Wenn Sie sich unter OS-X Tausenden gleichzeitiger Verbindungen nähern, kann es aufgrund unzureichender Dateihandles oder Threads zu Verbindungsfehlern kommen. Dies ist wahrscheinlich auf Prozessgrenzen zurückzuführen. Denken Sie also daran, diese Grenzen anzupassen, wenn Sie beabsichtigen, die Parallelitätsebene auf über 1000 zu erhöhen.
Beachten Sie, dass die Verwendung sudo ulimit
eine Root-Shell erstellt, ihre Grenzen anpasst und dann beendet wird, was keine wirklichen Auswirkungen hat. Verwenden Sie stattdessen zuerst launchctl
unter OS-X.
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
Bei langen Läufen kann der Benutzer über kill -1 pid
ein SIGHUP senden, um die aktuellen Fortschrittszahlen abzurufen.
$ 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