Google Wave consume mucho

Google Wave Logo

Logotipo de Google Wave

Sobre consumos y remedios.

Llevo ya un tiempo usando (más bien experimentando) con Google Wave. El principal uso que le he dado ha sido para depurar y probar mi wavejordomo Jeffrey.

Google Wave ha sido concebido como un sistema colaborativo en “tiempo real”.

Como sabéis el “tiempo real” es relativo. Tiempo real significa que el sistema tiene que responder como máximo en un tiempo determinado. Para una conversación en Messenger ese “tiempo real” puede ser 10s, mientras que para el programa de seguimientos de misiles de un F-18 puede ser 50ms.

¿Cual es el valor umbral de tiempo real para Google Wave? Pues no sé que valor tendrá como meta el equipo de desarrollo de Wave. Puede que entre 5s o 10s.

No sé si habéis usado ya Wave,  pero yo he experimentado tiempos mayores a 10s e incluso cuelgues temporales durante más de medio minuto.

Una de las características de Wave consiste en retransmitir la pulsación de cada tecla que un usuario escribe. El servidor reenvía dicha pulsación a todos los usuarios de la Wave. Esto crea la sensación de colaboración en tiempo real: Un mismo “documento” (wave) es editado a la vez por múltiples frentes.

He decidido comprobar los consumos actuales de Wave: tiempo de CPU y ancho de banda.

AVISO: La prueba que he realizado ha sido muy sencilla y es “aproximada”. Sólo quiero tener una idea cercana a la real.

El test consiste en crear una wave, invitar a mis amigos y empezar todos a “hablar” a la vez.

El sistema operativo es un GNU/Linux Ubuntu 9.04 con kernel 2.6.28-16-generic.

Las herramientas que he usado son:

  • Firefox 3.0.15 Ubuntu Edition 1.0 como navegador web.
  • vmstat, para recoger el consumo de CPU. Tiene muy poco consumo de CPU.
  • Firebug 1.4.5, para ver los mensajes Ajax que intercambia Wave.
  • Wireshark 1.0.7, para capturar y ver el tamaño total de los paquetes de “wave”.
  • awk, para procesar la salida de vmstat.
  • gnuplot, para generar los gráficos de uso de CPU (salida de vmstat filtrada por awk).

Consumo de CPU

El proceso para estudiar el consumo de CPU por wave ha sido:

  1. Lanzar vmstat con la siguiente orden:
     vmstat -n 1 1000000 | tee wave_usag 

    Con “-n” hacemos que no se reimprima la cabecera cada ‘x’ impresiones. “1 10000000” indica que se tomen 10000000 muestras cada segundo. “tee wave_usag” sirve para volcar los datos al fichero “wave_usag” a la vez que lo mostramos por pantalla.

  2. Abrir Firefox. Entrar en Wave. Crear una nueva wave. Añadir a mis amigos. Empezar a escribir todo el mundo durante unos minutos.
  3. Interrumpir “vmstat” con Ctrl+C.
  4. Filtrar la salida con ‘awk’
     cat wave_usag | awk  'BEGIN { i = 1 } { print  i++ "\t " (100-$15)*4 }'  > wave_filtrado 

    Lo que hago es crear dos columnas, en la primera represento el número de muestra, y en la segunda el porcentaje de CPU usado “por core“. En la columna $15 se imprime el porcentaje de estado “idle” el procesador. Para ver su uso, resto dicha cantidad a 100. El procesador que uso tiene 4 cores y las invocaciones de Firefox se ejecutan en un solo thread. Por tanto el proceso de Firefox va a consumir a lo sumo el 100% de un core. Por ese motivo multiplico por 4. Cuando alcanza el 100%, significa que necesitaría mayor velocidad para procesar las transacciones en 1s. Debido a esto se experimenta un “cuelgue” temporal del proceso.

  5. Generar la gráfica con gnuplot
    echo 'set terminal png size 500, 200; set title "CPU Wave usage"; set xlabel "seconds" ; set ylabel "% CPU usage" ; set output "wave_usage.jpg"; plot "wave_filtrado" using 1:2 lt 3 title "% CPU usage" with lines' | gnuplot
    

    Esto genera la gráfica en el fichero “wave_usage.jpg”. La gráfica (retocada con GIMP para marcar los puntos donde el uso de CPU es 100%) es la siguiente:

    Uso de CPU por Wave

    Uso de CPU por Wave

  6. Como se aprecia en la gráfica, Wave suele tener un consumo discreto durante su ejecución. En casos puntuales alcanza un 50-60% de ocupación de CPU según la carga de proceso “ajax“. Se observa también dos momentos, señalados con los círculos rojos, donde el navegador no es capaz de procesar toda la información que recibe. Estos momentos corresponden con la creación e inclusión de participantes en la wave y el instante donde cada participante añade widgets a la vez que escribe.

Consumo de ancho de banda
Como comenté antes, cada vez que se pulsa una tecla, se produce una petición ajax hacia el servidor de Wave, mandando la información de la tecla pulsada.

Con Firebug (usado normalmente para depurar aplicaciones webs) podemos ver cada uno de estos mensajes.

Captura peticiones Ajax Wave

Captura peticiones Ajax Wave

Cada petición de “pulsación tecla” consta de 2 mensajes de respuesta “ACK”, cada uno con un tamaño de payload de 26 bytes. En total son 52 bytes por “tecla pulsada”. Voy a hacer una simplificación del tamaño del paquete total. Las comunicaciones de Wave van sobre HTTPS, voy a suponer que NO lo son.

A los 26 bytes de carga útil, tenemos que añadir el tamaño de las cabeceras de HTTP, las de TCP y las de IP (voy a ignorar las del frame ethernet).

¿Que overhead obtendremos?

Paquete 1:

Tamaño del encabezado (request+response+TCP header+IP header): 1952 bytes
Carga “útil” (post+response):   281+26 bytes
Overhead: 1-(281+26)/(1952+281+26) => 86%

Paquete 2:

Tamaño del encabezado (request+response+TCP header+IP header): 1953 bytes
Carga “útil” (post+response):  435+26 bytes
Ovehead: 1-(435+26)/(1953+435+26) => 81%

El “desperdicio” del ancho de banda es increíble, más del 85% (y eso que no he contado con SSL).

La pregunta es: ¿esta haciendo algo Google para resolver esto? , como era de esperar viniendo de Google.

Google no para de sacar nuevos productos que afectan en mayor o menor medida a la eficiencia de Wave. Resumo alguno de ellos:

  • SPDY: El nuevo protocolo para transporte de webs, mensajes ajax, etc. Compatible con HTTP, persigue reducir el tamaño de las cabeceras de HTTP y mejorar el rendimiento en la comunicación. Sus principales objetivos son:
    • Reducir en un 50% el tiempo de carga de las páginas.
    • Facilidad de implantación. No es necesario cambiar TCP, SPDY va sobre TCP. Basta con cambiar el browser y los servidores webs.
    • Disminuir la latencia.

    Esta claro que Wave será uno de los mayores beneficiarios de SPDY: reduce el tamaño y la latencia de los mensajes.

  • Chrome: El navegador web de Google. Su principal objetivo es la carga y renderizado rápido de páginas. Todavía le cuesta imponerse.
    No hay nada mejor como controlar el propio browser para que Wave se integre perfectamente con éste.
  • Android: El sistema operativo apoyado (co-creado) por Google. Al igual que pasa por Chrome, controlar el sistema operativo de los teléfono móviles (más que futuro, un presente a más) supone poder añadir facilidades para la integración de Wave.
  • GoLang: El nuevo lenguaje de programación de Google. Ahora mismo esta en fase experimental. Busca la flexibilidad de un lenguaje como Python y la rapidez de ejecución de C. Hay que destacar entre sus características la inclusión de un compilador para ARM. Los procesadores tipo ARM se incluyen en la mayoría de teléfonos móviles. Poder hacer programas rápidamente que corran sobre ARM, puede suponer que en un futuro se tenga un cliente de Wave para Android (y otros tipos de terminales) que aproveche mejor el procesador.
  • Servidores DNS de Google:  Los servidores DNS son la columna vertebral de Internet. Desconocidos para muchos, la resolución de nombres a IP es fundamental en cualquier comunicación por Internet. Extender el uso de los servidores DNS de Google entre los usuarios significa poder priorizar las resoluciones de los nombres de los servidores de Google sobre el resto (seguro que ponen a Bing al final de la cadena🙂 ).
    Esto reduciría el tiempo de acceso a los servicios de Google, y por extensión, a Wave.

No sé si Google Wave, cumplirá las previsiones que sus profetas anuncian, pero para hacerlo creo que es necesario mucho tiempo y minimizar sus requisitos de ejecución. Los nuevos productos mencionados anteriormente creo que ayudaran bastante, aunque es complicado estimar si serán suficientes si realmente todo el mundo usa Wave para comunicarse.

En cualquier caso, Wave está en pañales y le queda mucho camino por delante. Tiempo al tiempo.

Translate to:English
MenefanteMenéame TwitterTwitter

3 Responses to Google Wave consume mucho

  1. Pingback: Trackback

  2. Óscar dice:

    Esos valores altos de CPU es posible que sea cosa de Wave, pero ten en cuenta que Firefox no es ninguna maravilla en recursos (CPU y memoria..)

    Un buen blog! te añado a mis RSS

    • Chema dice:

      Gracias Óscar.
      Si es cierto. Firefox demanda demasiados recursos. Con Chrome la cosa es algo mejor, aunque no se nota una diferencia significativa (con las primeras versiones beta via launchpad sí).
      Espero que pronto utilicen múltiples threads para hacer los Ajax requests.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: