Ferramenta de benchmark de DNS de linha de comando desenvolvida para testar a resistência e medir o desempenho de servidores DNS com hardware comum. Essa ferramenta normalmente consome aproximadamente 30 KB por conexão simultânea e pode manter aproximadamente 30.000 QPS por núcleo moderno se seu servidor, sistema operacional e rede permitirem que você alcance níveis adequados de simultaneidade.
O DNStrace ignora os resolvedores do sistema operacional e é fornecido como um binário estático pré-construído empacotado no Docker. Medição básica de latência, verificação de resultados e histogramas são suportados. Atualmente, apenas perguntas A
, AAAA
e TXT
são suportadas.
$ 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.
Embora dnstrace
seja útil para testar a latência de ida e volta por meio de redes públicas, o código foi criado principalmente para fornecer uma ferramenta no estilo Apachebench para testar sua própria infraestrutura.
Portanto, é muito fácil criar uma carga DNS significativa com configurações não padrão. Não faça isso com serviços DNS públicos . Você provavelmente sinalizará seu IP.
go get github.com/redsift/dnstrace
para instalar o binário em seu $GOPATH/bin
. No OS-X, o binário nativo superará significativamente o contêiner Docker abaixo executado no HyperKit, por exemplo, 30% mais taxa de transferência, 30% menos latência e uma redução de 4x na distribuição de tempo
Esta ferramenta está disponível em uma imagem pré-construída.
docker run redsift/dnstrace --help
Se sua configuração de teste local permitir atingir 50k QPS e acima, você pode esperar que a rede do docker adicione ~2% de sobrecarga à taxa de transferência e ~8% à latência média (testado no Linux Docker 1.12.3). Se isso for significativo para seus propósitos, você pode querer executar com --net=host
./dnstrace --completion-script-bash
e ./dnstrace --completion-script-zsh
criarão scripts de conclusão de shell.
por exemplo
$ 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
À medida que você se aproxima de milhares de conexões simultâneas no OS-X, você pode encontrar erros de conexão devido a identificadores de arquivos ou threads insuficientes. Provavelmente, isso se deve aos limites do processo, portanto, lembre-se de ajustar esses limites se pretender aumentar os níveis de simultaneidade além de 1.000.
Observe que usar sudo ulimit
criará um shell root, ajustará seus limites e sairá, sem causar nenhum efeito real. Em vez disso, use launchctl
primeiro no OS-X.
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
Para execuções longas, o usuário pode enviar um SIGHUP via kill -1 pid
para obter as contagens de progresso atuais.
$ 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