Practica 5

Publicidad

Objetivo de la mejora de prestaciones


Tenemos una página web en la que preveemos que el dia X aumentarán drasticamente las visitas. Hasta el momento teniamos un servidor desde hace un par de años (denominado MEGA3) y ahora nos han traido uno nuevo (denominado GIGA4).

El objetivo es encontrar la configuración adecuada para, con los recursos disponibles, montar un servidor web (que hará uso de BD) de tal modo que maximicemos el número de peticiones a la web que se pueden atender dentro de un corto periodo de tiempo.

El servicio del sistema es actuar de servidor web. El servidor web se compone de un servidor Apache2 con soporte para PHP y otro servidor MySQL 5.0

La métrica que usaremos será número de páginas servidas por segundo

Los parametros que pueden afectar a las prestaciones son: ejecuciones paralelas de otros programas o servicios del sistema, número de peticiones que se están atendiendo en un mismo momento, número total de peticiones, carga de la red (según el caso) y la página web a servir.

El factor a estudiar será el número de páginas servidas por segundo, este valor se trata de una estimación.

La técnica de evaluación se hará como medición de un sistema real mediante la herramienta Apache Benchmark. Para las distintas evaluaciones esta herramienta se ejecutará siempre en la misma maquina en la que esté ejecutandose el servidor web apache, hay que destacar sobre esto que quizás no sea una forma del todo buena de hacerlo, lo ideal seria disponer de un tercer ordenador en red local para ejecutar Apache Benchmark pero como no disponemos de este lo hacemos de esta forma y asumimos que afectará negativamente a todas las medidas aproximadamente del mismo modo.

La carga de trabajo a la que se va a someter el sistema es a: 5000 peticiones con un máximo de 10 peticiones al mismo tiempo


Pasos en el análisis y mejora de prestaciones


1: Ejecutar Apache Benchmark en la maquina en la cual esté instalado Apache.

ab -n 5000 -c 10 http://192.168.0.34/ruta.php?pag=ruta&id=1

con 5000 peticiones, 10 peticiones al mismo tiempo y una página web (siempre la misma) basada en PHP+MySQL.


2: Tomamos los resultados.


Resultado de las medidas antes y después de la mejora de prestaciones


Vamos a hacer cuatro analisis con distintas configuraciones del sistema, con ello determinaremos cual de las configuraciones nos ofrece mejores prestaciones y con ello elegiremos la configuración más adecuada.NOTA: Las pruebas 2 y 3 tienen un factor que no tienen la 1 ni la 4 que es la conexión de red, las pruebas se han realizado sobre una red local Ethernet de 100Mbps sin carga inicial y con un "hop" entre equipos.

Caso 1: Apache2 y MySQL ejecutándose desde el servidor MEGA3


Este es el sistema "antes", tal como ha estado siempre el servidor web.
Para este caso la salida de Apache Benchmark es: Requests per second: 77.78 [#/sec] (mean)

Caso 2: Apache2 ejecutándose en MEGA3 y MySQL en GIGA4


La idea es repartir la carga del sistema en dos maquinas, esto es algo que incluso se ha comentado en clase de DyEC como método para aumentar las prestaciones de un servidor web.
En este caso: Requests per second: 140.63 [#/sec] (mean). El número ha aumentado, parece que dedicar la maquina GIGA4 a administrar la Base de Datos produce mejoras.

Caso 3: Apache2 ejecutándose en GIGA4 y MySQL en MEGA3


El mismo caso de antes pero al revés, esto lo hacemos por que no sabemos a priori cómo se comportará cada maquina según lo que ejecuten.
En este caso: Requests per second: 27.46 [#/sec] (mean). Unos resultados desastrosos, el sistema estaría peor que al principio.

Caso 4: Apache2 y MySQL en GIGA4


Aqui se deja toda la carga para la maquina nueva.
En este caso: Requests per second: 375.61 [#/sec] (mean). Observamos cómo la maquina GIGA4 se las apaña muy bien ella solita siendo la configuración que ofrece mayores prestaciones en cuanto a peticiones por segundo.

Resultados


Los datos hablan por sí solos y se pueden ver claramente en un gráfico:


A tesón de los resultados queda claro que la configuración que cumple nuestro objetivo dentro de los cuatro casos que hemos descrito y analizado es la cuarta, por tanto esta será la elegida.

Y tienes que darme el punto adicional porque...


Con esta practica he conocido la configuración adecuada para servir páginas webs con los equipos que tengo disponibles en mi casa, próximamente tendrá un uso real puesto que se de buena tinta que un proyecto en el que participo (la Paqui) tendrá un incremento de peticiones al servidor los días en los que estrenemos la segunda película.
Que sino por lo menos dame el punto por haber cargado con el MEGA3 hasta mi cuarto, instalarlo, configurarlo, etc.

Practica 2: Monitor de sistema para Ubuntu, GNU/Linux: Conky

Publicidad

Conky es un monitor del sistema local totalmente configurable, está hecho para trabajar gráficamente sobre el fondo de escritorio (estando de este modo siempre presente sin "estorbar"). Escogí probar este monitor por comentarios agradables a su favor en varios blogs

Instalación
En Ubuntu 7.04 su instalación se efectua simplemente poniendo en consola:

sudo apt-get install conky

Desde este momento se puede ejecutar con su configuración predeterminada:
conky
(ejecutar con la opción -o en caso de que queramos que aparezca en una ventana)

Configuración
Como ya hemos dicho es un monitor "altamente configurable" y es que toda su interfaz se configura en base a un fichero de texto en el que describimos lo que queremos que aparezca y cómo queremos que aparezca, este fichero admite variables propias del programa y scripts del usuario (que puede programarse uno en caso de que las funciones propias no cubran nuestras necesidades). De este modo el usuario puede diseñar el monitor del sistema a su medida sin que necesariamente tenga que ser un "experto".

Desde la página del proyecto podemos descargar ejemplos de configuración. En mi caso he construido la siguiente interfaz a partir de uno de los ejemplos:

En el que se han usado, entre otras, las siguientes variables propias de conky:
  • $nodename: Nombre del equipo
  • $kernel: Versión del Kernel
  • $uptime: Tiempo UP
  • $loadavg: Cargas del sistema
  • $cpu%: Porcentaje de uso de la CPU
  • ${cpubar}: Muestra gráfica en una barra del uso de CPU
  • ${cpugraph cpu0 32,309 000000 7f8ed3}: Muestra gráfica en linea del tiempo del uso de la CPU0
  • $mem/$memmax: Memoria RAM usada/Memoria RAM total
  • $processes: Procesos
  • $running_processes: Procesos en ejecución
  • ${downspeed eth0}: Velocidad de descarga del dispositivo eth0
  • ${upspeed eth0}: Velocidad de subida del dispositivo eth0
  • ${tcp_portmon 1 65535 count}: Conexiones TCP
  • ${fs_free /mnt/fat32/}: Capacidad libre en el dispositivo de almacenamiento /mnt/fat32
  • ${fs_size /mnt/fat32/}: Capacidad total en el dispositivo de almacenamiento /mnt/fat32
  • ${fs_bar /mnt/fat32/}: Representación en una barra de la capacidad en el dispositivo de almacenamiento /mnt/fat32
  • ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}: Nombre, PID, Uso de CPU y uso de memoria del proceso que está usando más CPU
  • ${top_mem name 1} ${top_mem pid 1} ${top_mem cpu 1} ${top_mem mem 1}: Nombre, PID, Uso de CPU y uso de memoria del proceso que está usando más Memoria
  • $diskio: Uso de la Entrada/Salida
  • ${diskiograph 32,309 000000 7f8ed3 5000}: Muestra gráfica de la Entrada/Salida
  • ${tail /var/log/apache2/access.log 15}: Muestra las últimas 15 lineas del log de accesos de Apache


A lo que hay que agregar la funcionalidad proveniente de los scripts que podemos construir e integrar en el programa.


Adjunto el fichero de configuración:
background yes
font 7x13
use_xft no
on_bottom yes

mpd_host 192.168.150.2
mpd_port 6600

update_interval 1.0

total_run_times 0

own_window no

own_window_transparent no

double_buffer yes

minimum_size 280 5

draw_shades yes
draw_outline no
draw_borders no
stippled_borders 8
border_margin 4
border_width 1

default_color black
default_shade_color black
default_outline_color black

alignment top_right

maximum_width 500

gap_x 12
gap_y 12

no_buffers yes

uppercase no

cpu_avg_samples 2
net_avg_samples 2

override_utf8_locale no

use_spacer no

# stuff after 'TEXT' will be formatted on screen

TEXT
${color #5b6dad}$nodename linux-$kernel${alignr}${time %T}

${color #5b6dad}System:
${color #5b6dad} Uptime:${color #7f8ed3} $uptime ${color #5b6dad}- Load:${color #7f8ed3} $loadavg
${color #5b6dad} CPU Frequency:${color #7f8ed3} $freq_dyn_g ${color #5b6dad} Maximum:${color #7f8ed3} $freq_g
${color #5b6dad} CPU Usage:${color #7f8ed3} $cpu% ${cpubar}
${color #000000}${cpugraph cpu0 32,495 000000 7f8ed3}
${color #000000}${cpugraph cpu1 32,495 000000 7f8ed3}
${color #5b6dad} RAM Usage:${color #7f8ed3} $mem/$memmax - $memperc% ${membar}
${color #5b6dad} Swap Usage:${color #7f8ed3} $swap/$swapmax - $swapperc% ${swapbar}
${color #5b6dad} Processes:${color #7f8ed3} $processes ${color #5b6dad}Running:${color #7f8ed3} $running_processes

${color #5b6dad}Networking:
${color #5b6dad}Down:${color #7f8ed3} ${downspeed eth0} k/s${color #5b6dad}${offset 160}Up:${color #7f8ed3} ${upspeed eth0} k/s
${color #000000}${downspeedgraph eth0 32,245 000000 7f8ed3} ${color #000000}${upspeedgraph eth0 32,245 000000 7f8ed3}
${color #5b6dad}Address: ${color #7f8ed3}${addr eth0}${alignr}${color #5b6dad}TCP Connections: ${color #7f8ed3}${tcp_portmon 1 65535 count}

${color #5b6dad}File Systems:
${color #5b6dad}/ ${color #7f8ed3}${fs_free /}/${fs_size /} ${color #7f8ed3}${fs_bar /}
${color #5b6dad}FAT32 ${color #7f8ed3}${fs_free /mnt/fat32/}/${fs_size /mnt/fat32/} ${color #7f8ed3}${fs_bar /mnt/fat32/}
${color #5b6dad}Archivos ${color #7f8ed3}${fs_free /mnt/archivos/}/${fs_size /mnt/archivos/} ${color #7f8ed3}${fs_bar /mnt/archivos/}
${color #5b6dad}SAExt3 ${color #7f8ed3}${fs_free /mnt/saext3/}/${fs_used /mnt/saext3/} ${color #7f8ed3}${fs_bar /mnt/saext3/}

${color #5b6dad}Name PID CPU% MEM%
${color #7f8ed3} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color #7f8ed3} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color #7f8ed3} ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color #5b6dad}Mem usage
${color #7f8ed3} ${top_mem name 1} ${top_mem pid 1} ${top_mem cpu 1} ${top_mem mem 1}
${color #7f8ed3} ${top_mem name 2} ${top_mem pid 2} ${top_mem cpu 2} ${top_mem mem 2}
${color #7f8ed3} ${top_mem name 3} ${top_mem pid 3} ${top_mem cpu 3} ${top_mem mem 3}

Disk IO: $diskio
${diskiograph 32,495 000000 7f8ed3 5000}

${tail /var/log/apache2/access.log 15}

Este fichero debe ser llamado a la ejecución del programa del siguiente modo:
conky -c fichero

Siendo fichero la ruta al fichero Archivo de configuración
En este blog hay también un fichero de configuración interesante para conky.


Valoración
Conky es muy util y muy adaptable para su uso en el sistema local, su funcionamiento es simple (tan simple que no existe iteracción con el usuario), consume unos recursos aceptables (alrededor de 4% en mi equipo) y admite scripts que hayamos programado nosotros extendiendo así su utilidad a nuestra capacidad de programación, tiene la desventaja de que la configuración se establece a través de un fichero de texto plano y de que pega parpadeos cuando tiene que cargar mucha información.