Dic 302012
 

El tiempo total desde que el navegador de un usuario realiza la solicitud de una página a un servidor web hasta que termina de cargarse depende de una serie de factores. En este artículo revisamos los factores que intervienen, y las posibilidades de optimización que existen para cada uno de ellos.

Análisis preliminar

La herramienta de análisis online que ofrece pingdom presenta una representación gráfica en cascada de cada uno de los elementos que intervienen en el tiempo total de carga de la página. Accediendo a http://tools.pingdom.com/fpt e introduciendo la url de nuestro blog “http://blog.openalfa.com”, obtenemos: pingdom-1

 

Como vemos, el gráfico presenta, ordenados segun la secuencia en que son cargados, cada uno de los elementos (HTML, CSS, Javascript, imágenes,…) que el cliente solicita al servidor para componer la página. Para cada uno de ellos, se visualiza mediante un código de colores el tiempo requerido por cada una de las fases de la petición:

pingdom-2

  • DNS (Domain Name Service) –  Cuando el navegador del cliente quiere acceder a una URL “http://www.dominio.com/…”, lo primero que tiene que hacer es obtener la dirección IP correspondiente al nombre “www.dominio.com”. Para ello, realiza una petición al servidor DNS que tenga configurado. El servidor DNS puede tener que realizar la petición al siguiente servidor en la jerarquía, y así recursivamente hasta llegar al servidor que contiene la información del dominio solicitado.
  • SSL (Secure Sockets Layer) – Esto sólo se aplica a las conexiones seguras, que son aquellas en donde la url comienza por “https”. El establecimiento de una conexión segura requiere un intercambio preliminar de información (handshake) entre el cliente y el servidor
  • Connect – Las conexiones entre un navegador y un servidor web utilizan el protocolo TCP, que requiere el establecimiento de una conexión.
  • Wait – Es el tiempo que tarda el servidor en generar la información que va a entregar al cliente. Para generarla, el servidor puede tener que leer ficheros del disco, hacer consultas a una base de datos, etc…
  • Receive – Es el tiempo que tarda en transmitirse la información que el servidor envía al cliente, y depende en gran medida del ancho de banda disponible entre ellos.
  • Send – Es el tiempo tarda en transmitirse la información que el cliente envía al servidor. Normalmente, es un tiempo muy pequeño en comparación con “Receive”, porque el volumen de información a transmitir es mucho menor, a menos que se trate de una solicitud “POST” de envío de un fichero al servidor (p.ej., la subida (upload) de una imagen)

Número de conexiones

Uno de los resultados quizá más sorprendentes del análisis realizado con pingdom es el número de conexiones que se realizan al solicitar una única página. En el ejemplo de arriba, son necesarias un total de 72 conexiones para obtener la página home de nuestro blog “http://blog.openalfa.com”. El establecimiento de una conexión entre el cliente y el servidor es una operación relativamente costosa, por lo que si queremos disminuir el tiempo de carga de las páginas de nuestro sitio, una buena forma de comenzar es estudiar la posibilidad de disminuir el número de conexiones requeridas:

– Una de las maneras de hacerlo es combinar en un único fichero el contenido de los distintos ficheros CSS que se cargan, de modo que se realice una única solicitud para todo el código CSS de la página.

– La misma técnica se puede aplicar a los distintos ficheros javascript, combinándolos en un único fichero que contiene todo el código javascript que necesita la página.

– Por último, se puede estudiar la posibilidad de utilizar “sprites”. Un sprite es el resultado de combinar todas las pequeñas imágenes (logos, iconos, etc,…) que normalmente hay en la página, en una única imagen. Después, cada icono se visualiza definiendo mediante CSS un “viewport” sobre la imagen combinada, con el offset y las dimensiones correspondientes.

Tiempo de proceso

El tiempo que aparece en el gráfico de pingdom como “Wait” es el tiempo que dedica el servidor a preparar la información a transmitir al cliente. Un tiempo elevado puede deberse a muchas razones distintas. Para optimizar el tiempo hay que revisar todos los aspectos que pueden afectar al rendimiento del servidor, entre los cuales están:

La configuración del servidor web. Por ejemplo, configurar un número adecuado de procesos hijo, para aumentar el número de peticiones que se pueden atender en paralelo, sin sobrecargar los recursos hardware disponibles en el servidor.

La configuración de la base de datos. Configurar el tamaño de los buffers, y definir los índices necesarios en las tablas utilizadas por la aplicación, para evitar que las sentencias “select” tengan que hacer un recorrido completo de toda la tabla, sobre todo cuando la consulta implica varias tablas unidas mediante “join”.

El uso de caches. Uno de los mayores impactos en el rendimiento del servidor se puede conseguir utilizando un mecanismo “cache” que guarde el código HTML de las páginas solicitadas, de tal manera que la siguiente petición que se haga de la misma página no requiera el volver a realizar todo el proceso de generación del código. Algunos gestores de contenido, incluyendo WordPress, implementan esta funcionalidad mediante plugins fáciles de instalar y configurar.

Tiempo de transmisión de los datos

El tiempo de transmisión depende directamente del volumen de los datos a transmitir, y del ancho de banda disponible. Como administrador de un servidor web no tenemos control sobre el ancho de banda de los clientes, pero podemos influir directamente sobre el volumen de datos:

– Utilizando al máximo CSS y javascript para implementar el diseño de la página, disminuyendo así el código HTML de la misma. El código CSS y javascript se puede colocar en ficheros “.css” y “.js”, y asignar a estos ficheros un tiempo de validez grande, de modo que los servidores proxy que puedan intervenir en la comunicación, y el propio navegador del usuario, puedan guardarlos en cache y reutilizarlos en los siguientes accesos al servidor.

– Comprimiendo los datos antes de la transmisión. Si el servidor web es apache, esto se puede hacer muy fácilmente habilitando y configurando el módulo “mod_deflate”.

 Publicado por en 11:04 am

 Deja un comentario

(requerido)

(requerido)