Pruebas de estrés de DNS con DNSPerf y ResPerf

DNSPerf y ResPerf son dos herramientas de Nominum que permiten realizar pruebas de carga a servidores DNS e interpretar sus datos con informes y gráficas. Vamos a ver su instalación y ejemplos de uso.

Instalación

# wget ftp://ftp.nominum.com/pub/nominum/dnsperf/2.0.0.0/dnsperf-2.0.0.0-1-rhel-6-x86_64.tar.gz
# tar -xzvf dnsperf-2.0.0.0-1-rhel-6-x86_64.tar.gz

Instalamos el RPM a través de yum para que resuelva automáticamente todas las dependencias necesarias (en caso de que las haya, no tiene porqué). También está disponible para otras distribuciones y arquitecturas:

# yum install dnsperf-2.0.0.0-1.el6.x86_64.rpm

Hay que tener en cuenta que dnsperf se instala en un path fuera de nuestro $PATH:

# ls -l /usr/local/nom/bin/
total 1348
-rwxr-xr-x. 1 root root 692911 Mar  2  2012 dnsperf
-rwxr-xr-x. 1 root root 676597 Mar  2  2012 resperf
-rwxr-xr-x. 1 root root   1943 Mar  2  2012 resperf-report

Si queremos ejecutarlo sin especificar la ruta, añadimos «/usr/local/nom/bin/» a nuestro $PATH.

PATH="$PATH:/usr/local/nom/bin/"

Después, nos podemos bajar los ficheros de ejemplo que usaremos para los tests. Se trata de ficheros con consultas aleatorias que se ejecutarán contra el DNS, hay de 3 y 10 millones de consultas por fichero:

ftp://ftp.nominum.com/pub/nominum/dnsperf/data/

ftp> ls
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 ftp      ftp      75956910 Mar  7  2012 queryfile-example-10million-201202.gz
-rw-r--r--   1 ftp      ftp           370 Mar  7  2012 queryfile-example-3million.gz
lrwxrwxrwx   1 ftp      ftp            37 Mar  7  2012 queryfile-example-current.gz -> queryfile-example-10million-201202.gz
-rw-r--r--   1 ftp      ftp           556 Mar  7  2012 README

Podemos generar nosotros mismos estos ficheros, siempre y cuando tengan la misma estructura, ejemplo:

thumbs2.ebaystatic.com.	AAAA
mountaineerpublishing.com.	MX
www.mediafire.com.	A
s-static.ak.fbcdn.net.	A
lachicabionica.com.	A
www.freemarket.com.	A

DNSPerf

Ya sólo nos queda comenzar a hacer pruebas de stress contra el servidor DNS que queramos. La ayuda nos dará información sobre los parámetros y posibilidades de la herramienta:

# /usr/local/nom/bin/dnsperf -h
DNS Performance Testing Tool
Nominum Version 2.0.0.0

Usage: dnsperf [-f family] [-s server_addr] [-p port] [-a local_addr]
               [-x local_port] [-d datafile] [-c clients] [-n maxruns]
               [-l timelimit] [-b buffer_size] [-t timeout] [-e] [-D]
               [-y [alg:]name:secret] [-q num_queries] [-Q max_qps]
               [-S stats_interval] [-u] [-v] [-h]
  -f address family of DNS transport, inet or inet6 (default: any)
  -s the server to query (default: 127.0.0.1)
  -p the port on which to query the server (default: 53)
  -a the local address from which to send queries
  -x the local port from which to send queries (default: 0)
  -d the input data file (default: stdin)
  -c the number of clients to act as
  -n run through input at most N times
  -l run for at most this many seconds
  -b socket send/receive buffer size in kilobytes
  -t the timeout for query completion in seconds (default: 5)
  -e enable EDNS 0
  -D set the DNSSEC OK bit (implies EDNS)
  -y the TSIG algorithm, name and secret
  -q the maximum number of queries outstanding (default: 100)
  -Q limit the number of queries per second
  -S print qps statistics every N seconds
  -u send dynamic updates instead of queries
  -v verbose: report each query to stdout
  -h print this help

DNSPerf simula tráfico DNS y reporta información relativa al número de consultas completadas, fallidas, latencia, códigos de respuesta, etc. Por ejemplo, podemos ejecutarlo contra el servidor 10.0.0.100, usando el fichero de queries descargado:

#  /usr/local/nom/bin/dnsperf -s 10.0.0.100 -p 53 -d queryfile-example-current
DNS Performance Testing Tool
Nominum Version 2.0.0.0

[Status] Command line: dnsperf -s 10.0.0.100 -p 53 -d queryfile-example-current
[Status] Sending queries (to 10.0.0.100)
[Status] Started at: Sat Dec 29 09:54:39 2012
[Status] Stopping after 1 run through file
...
...
...
[Status] Testing complete (interruption)

Statistics:

  Queries sent:         230
  Queries completed:    131 (56.96%)
  Queries lost:         0 (0.00%)
  Queries interrupted:  99 (43.04%)

  Response codes:       NOERROR 120 (91.60%), NXDOMAIN 11 (8.40%)
  Average packet size:  request 37, response 232
  Run time (s):         0.383002
  Queries per second:   342.034767

  Average Latency (s):  0.123774 (min 0.002237, max 0.252755)
  Latency StdDev (s):   0.069324

ResPerf

Por otro lado tenemos ResPerf, que lo que hace es simular un servidor de cacheo (Caching name-server) , aumentando progresivamente el ratio de consultas por segundo y monitorizando su respuesta. Como véis, podemos especificar el número máximo de queries por segundo (-m):

# /usr/local/nom/bin/resperf -s 10.0.0.100 -d queryfile-example-current -m 50
DNS Resolution Performance Testing Tool
Nominum Version 2.0.0.0

[Status] Command line: resperf -s 10.0.0.100 -d queryfile-example-current -m 50
[Status] Sending
[Status] Waiting for more responses
[Status] Testing complete

Statistics:

  Queries sent:         1500
  Queries completed:    1500
  Queries lost:         0
  Run time (s):         100.000004
  Maximum throughput:   50.000000 qps
  Lost at that point:   0.00%

Con Resperf, el resultado se guarda en un fichero resperf.gnuplot que podemos utilizar para graficar los resultados de la prueba:

# yum install gnuplot

Pero todavía hay otra utilidad, que nos generará automáticamente el informe en formato HTML y con los gráficos insertados, básicamente ejecutamos lo mismo que antes pero con el comando resperf-report:

# /usr/local/nom/bin/resperf-report -s 10.0.0.100 -d queryfile-example-current -m 50
...
...
Done, report is in 20121229-1007.html

Y ya tendremos el reporte 20121229-1007.html disponible para su visualización:

ResPerf DNS

A partir de aquí se trata de jugar con los valores y parámetros del comando y simultaneamente del servidor DNS para mejorar su rendimiento.