jueves, 11 de octubre de 2012

Análisis de rendimiento de servidores GNU/Linux ( y parte II)

De la serie: Manos a la obra


Del anterior articulo de la serie Rendimiento de servidores GNU/Linux (Parte I)


Repasemos las tareas planificadas con su estado de ejecución:
  1. (Realizada) Selección del hardware para la comparación.
  2. (Realizada) Instalación y configuración del sistema operativo en los servidores, evidentemente GNU/Linux.
  3. (Realizada) Instalación y configuración del software de estudio de rendimiento y revisión de configuración.
  4. (Realizada) Definición de los juegos de pruebas a realizar.
  5. (No realizada) Ejecución de la prueba.
  6. (No realizada) Análisis de resultados y conclusiones.

En esta 2a parte (y final) se documentarán las tareas 5 y 6.


Ejecución de la prueba


Utilizando los valores de ejecución de la entrada anterior se generan los siguientes resultados para cada una de las pruebas ejecutadas:

CPU
Para el hardware HP8200:


$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 20000


Test execution summary:
    total time:                          23.5936s
    total number of events:              10000
    total time taken by event execution: 23.5928
    per-request statistics:
         min:                                  2.28ms
         avg:                                  2.36ms
         max:                                  5.08ms
         approx.  95 percentile:               2.46ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   23.5928/0.00

Para el hardware virtual:

$ sysbench --test=cpu --cpu-max-prime=20000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 20000


Test execution summary:
    total time:                          24.9474s
    total number of events:              10000
    total time taken by event execution: 24.9460
    per-request statistics:
         min:                                  2.48ms
         avg:                                  2.49ms
         max:                                  3.23ms
         approx.  95 percentile:               2.55ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   24.9460/0.00



Se ha remarcado el dato más interesante en fondo azul.



Threads
Para el hardware HP8200:


$ sysbench --num-threads=128 --test=threads --thread-yields=200 --thread-locks=4 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 128

Doing thread subsystem performance test
Thread yields per test: 200 Locks used: 4
Threads started!
Done.


Test execution summary:
    total time:                          0.5518s
    total number of events:              10000
    total time taken by event execution: 70.0153
    per-request statistics:
         min:                                  0.05ms
         avg:                                  7.00ms
         max:                                 61.09ms
         approx.  95 percentile:              23.76ms

Threads fairness:
    events (avg/stddev):           78.1250/7.49
    execution time (avg/stddev):   0.5470/0.00


Para el hardware virtual:

$ sysbench --num-threads=128 --test=threads --thread-yields=200 --thread-locks=4 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 128

Doing thread subsystem performance test
Thread yields per test: 200 Locks used: 4
Threads started!
Done.


Test execution summary:
    total time:                          0.6431s
    total number of events:              10000
    total time taken by event execution: 80.9499
    per-request statistics:
         min:                                  0.05ms
         avg:                                  8.09ms
         max:                                317.48ms
         approx.  95 percentile:              29.18ms

Threads fairness:
    events (avg/stddev):           78.1250/9.55
    execution time (avg/stddev):   0.6324/0.00



Se ha remarcado el dato más interesante en fondo azul.


Entrada/Salida de ficheros

Esta prueba requiere de un poco de preparación:
  1. Se verifica que tengamos disponible la cantidad de espacio con el que se quiere realizar la prueba. Yo la realizaré con un fichero de 5GB, por ello verifico que en el filesystem en el que me encuentre disponga de este espacio.
  2. Se crean el/los ficheros para realizar la prueba mediante en comando:
    sysbench --test=fileio --file-total-size=5G prepare
    Una vez ejecutado han aparecido (en mi caso) 128 ficheros 'test_file.NN'. Se pueden observar las opciones de ejecución para este test con el comando:
    sysbench --test=fileio help   
    Se debe tener en cuenta que es muy importante que la medida del fichero debe ser mayor que la memoria RAM disponible para que este no quepa en la memoria RAM e invalide las pruebas.
  3. Ahora ya se puede ejecutar el comando de la prueba:
    sysbench --test=fileio --file-total-size=5G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run      
  4. ¿Que os parece que nos falta?. Nos hemos dejado los ficheros de prueba, nos estaran ocupando (en este caso) 5GB del disco. Ejecutamos:
    rm test_file.*



Para el hardware HP8200:

 sysbench --test=fileio --file-total-size=5G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from timer.


Extra file open flags: 0
128 files, 40Mb each
5Gb total file size
Block size 16Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Time limit exceeded, exiting...
Done.

Operations performed:  13736 Read, 9157 Write, 29184 Other = 52077 Total
Read 214.62Mb  Written 143.08Mb  Total transferred 357.7Mb  (1.1923Mb/sec)
   76.31 Requests/sec executed

Test execution summary:
    total time:                          300.0076s
    total number of events:              22893
    total time taken by event execution: 191.3679
    per-request statistics:
         min:                                  0.00ms
         avg:                                  8.36ms
         max:                                226.02ms
         approx.  95 percentile:              26.28ms

Threads fairness:
    events (avg/stddev):           22893.0000/0.00
    execution time (avg/stddev):   191.3679/0.00

Para el hardware virtual:

 $ sysbench --test=fileio --file-total-size=5G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1
Initializing random number generator from timer.


Extra file open flags: 0
128 files, 40Mb each
5Gb total file size
Block size 16Kb
Number of random requests for random IO: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Time limit exceeded, exiting...
Done.

Operations performed:  87491 Read, 58327 Write, 186624 Other = 332442 Total
Read 1.335Gb  Written 911.36Mb  Total transferred 2.225Gb  (7.5945Mb/sec)
  486.05 Requests/sec executed

Test execution summary:
    total time:                          300.0063s
    total number of events:              145818
    total time taken by event execution: 262.3669
    per-request statistics:
         min:                                  0.00ms
         avg:                                  1.80ms
         max:                                415.03ms
         approx.  95 percentile:               8.66ms

Threads fairness:
    events (avg/stddev):           145818.0000/0.00
    execution time (avg/stddev):   262.3669/0.00


Se ha remarcado el dato más interesante en fondo azul.

Análisis de resultados y conclusiones

De forma general, se puede se han visto alguna de las características de la utilidad sysbench. Esta herramienta se creó por parte de MySQL AB para el análisis de rendimiento de su base de datos con licencia GPLv2 (cabe recordar que esta empresa sueca fue comprada por Sun Microsystems y esta en el 2009 fue comprada por Oracle Corporation). Existen 2 opciones mas de análisis que no han sido exploradas (una de ellas si comentada), con las tres ejecutadas he tenido suficiente para verificar el (bastante) buen comportamiento del servidor virtual respecto al físico.

CPU

 Los resultados son muy parecidos,incluso en el percentíl del 95% el servidor virtual se comporta bastante bien. En este punto hubiera esperado más diferencia.


Threads
 En este aspecto, así como en el de la CPU, las diferencias de resultados son bastante contenidas. Cabe destacar el elevado tiempo de respuesta máximo para alguna de las operaciones, probablemente muy pocas ya que el percentíl sigue siendo bastante parejo al de la máquina física.


 Entrada/Salida de ficheros
 Este es el indicador sorpresa, a pesar del elevadísimo tiempo de respuesta máximo para alguna de las operacionesel percentíl 95% ya es mejor, pero el resultado de la tasa de transferencia es del orden de 7 veces más entre la máquina física y la virtual. En este indicador la diferencia entre el disco ata del PC físico y los super discos del armario de almacenamiento de la cabina de máquinas virtuales juega un papel muy importante.


En definitiva, se puede afirmar que, aunque exista una pequeña perdida de rendimiento unitario en el sistema huésped, los beneficios de la administración de sistemas de forma global supera con creces esa pequeña perdida de rendimiento. En el aspecto económico de optimización de sistemas también ya que permite un mejor aprovechamiento de los recursos. Sin comentarios en cuanto a la alta disponibilidad de los sistemas, tiempos de recuperación, de backups, restauraciones y un largo etcétera.

Con esto se finalizan las tareas planificadas:
  1. (Realizada) Selección del hardware para la comparación.
  2. (Realizada) Instalación y configuración del sistema operativo en los servidores, evidentemente GNU/Linux.
  3. (Realizada) Instalación y configuración del software de estudio de rendimiento y revisión de configuración.
  4. (Realizada) Definición de los juegos de pruebas a realizar.
  5. (Realizada) Ejecución de la prueba.
  6. (Realizada) Análisis de resultados y conclusiones.


Un saludo a mis 2 o 3 lectores!



2 comentarios:

  1. Hola,

    Una pregunta: ¿puedes indicar las líneas de comando ejecutadas para el test de entrada y salida? Creo que es el único que no has indicado.

    Gracias.

    ResponderEliminar
  2. Hola Sergi, tienes razón. He actualizado la parte del test de entrada/salida.

    Muchas gracias por la indicación.

    Animo a todos a enviar más test con los mismos parámetros que he utilizado para ir comparando resultados y rendimientos.

    Un saludo,

    Joan.

    ResponderEliminar