Outil de référence DNS en ligne de commande conçu pour tester et mesurer les performances des serveurs DNS avec du matériel standard. Cet outil consomme généralement environ 30 Ko par connexion simultanée et peut maintenir environ 30 000 QPS par cœur moderne si votre serveur, votre système d'exploitation et votre réseau vous permettent d'atteindre des niveaux de concurrence appropriés.
DNStrace contourne les résolveurs de système d'exploitation et est fourni sous la forme d'un binaire statique prédéfini emballé dans Docker. La mesure de latence de base, la vérification des résultats et les histogrammes sont pris en charge. Actuellement, seules les questions A
, AAAA
et TXT
sont prises en charge.
$ 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.
Bien que dnstrace
soit utile pour tester la latence aller-retour via les réseaux publics, le code a été principalement créé pour fournir un outil de style Apachebench permettant de tester votre propre infrastructure.
Il est ainsi très simple de créer une charge DNS importante avec des paramètres autres que ceux par défaut. Ne faites pas cela avec les services DNS publics . Vous signalerez très probablement votre adresse IP.
go get github.com/redsift/dnstrace
installera le binaire dans votre $GOPATH/bin
. Sous OS-X, le binaire natif surpassera considérablement le conteneur Docker ci-dessous fonctionnant sous HyperKit, par exemple 30 % de débit en plus, 30 % de latence en moins et une diminution de 4 fois de l'étalement du temps.
Cet outil est disponible dans une image prédéfinie.
docker run redsift/dnstrace --help
Si votre configuration de test locale vous permet d'atteindre 50 000 QPS et plus, vous pouvez vous attendre à ce que la mise en réseau Docker ajoute environ 2 % de surcharge au débit et environ 8 % de latence moyenne (testé sur Linux Docker 1.12.3). Si cela est important pour vos besoins, vous souhaiterez peut-être exécuter avec --net=host
./dnstrace --completion-script-bash
et ./dnstrace --completion-script-zsh
créeront des scripts de complétion de shell.
par exemple
$ 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
À mesure que vous approchez des milliers de connexions simultanées sur OS-X, vous pouvez rencontrer des erreurs de connexion en raison de descripteurs de fichiers ou de threads insuffisants. Cela est probablement dû aux limites du processus, alors n'oubliez pas d'ajuster ces limites si vous avez l'intention d'augmenter les niveaux de simultanéité au-delà de 1 000.
Notez que l'utilisation sudo ulimit
créera un shell racine, ajustera ses limites, puis quittera sans aucun effet réel. Utilisez plutôt launchctl
d'abord sur OS-X.
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
Pour les longues courses, l'utilisateur peut envoyer un SIGHUP via kill -1 pid
pour obtenir le nombre de progrès actuel.
$ 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