Optimizando una web (cache, headers, etc)

523 views
Skip to first unread message

Jose Zanni

unread,
Apr 14, 2012, 4:35:39 AM4/14/12
to codeignit...@googlegroups.com
Buenas,

Por primera vez me encuentro con una web que recibe muchas visitas y veo que tengo que empezar a optimizar procesos y a utilizar las opciones de CI para mejorar el rendimiento.

He mirado las opciones que tengo:
  1. Cache de consultas a la base de datos: uno de los prinicpales problemas es que hay una consulta que tarda un huevo, quizás esté mal planteada o sea mejorable, pero mientras tanto allí esta. Asi que he activado para esa consulta el cache y el rendimiento mejoró muchisimo. Lo único es que hice un cronjobs para que limpie el cache de BD cada N tiempo, sino nunca se actualizarían los cambios que se puedan haber hecho.
    ¿Algún consejo en este sentido??
  2. Caché de HTML/vista: esto tambien es interesante, ya que activando este caché se guarda una copia de la vista en un archivo y luego al mostrarla nuevamente el sistema verifica que exista la vista en el cache y en vez de procesarla utiliza la version almacenada. En principio me parece genial ya que en lugar de hacer dos millones de cosas, consultas, y etc. simplemente se debería cargar ese HTML y mostrarlo tal cual, pero en la práctica o bien no entiendo como funciona o bien estoy haciendo algo mal, porque si bien se genera el archivo en el caché yo no noto ninguna mejora en nada, por ejemplo en el proceso que tarda en hacer una lectura en la BD sigue tardando exactamente igual, o sea que procesa todo el controlador igualmente asi que no entiendo en donde está la mejora...
    ¿Alguien sabe como va esto?
  3. Headers Expires y Cache-Control:  poniendo esto en el header del Layout ya se consigue darle un respiro al servidor ya que el explorador no va a buscar al servidor la web sino que se guarda una versión en memoria, aunque esto también es un arma de doble filo ya que solo hay que usarlo en las pantallas o secciones "estaticas" ya que ponerlo en (por ejemplo) en carro de la compra, cuando se agrega un producto este no aparece porque el explorador está mostrando una versión antigua...
    ¿Como haceis con esto??

Bueno, en definitiva hasta ahora en lo que he obtenido un resultado real ha sido al cachear las consultas a la BD, lo demás han sido mas problemas que soluciones y acepto cualquier tipo de consejos!

Daniel Carrero

unread,
Apr 14, 2012, 10:39:46 AM4/14/12
to codeignit...@googlegroups.com

Hola, has hecho ya un estudio de rendimiento, talves usando benchmark ( http://codeigniter.com/user_guide/libraries/benchmark.html ) o puedes usar eacellerator o memcache, optimizar las consutas sql por ejemplo en lugar de usa SELECT * podrias usar SELECT campo1,campo2.
Puedes hacer una optimizacion de los modelos.
Son algunas cosas que se me ocurren ahora desde el movil, ojala que en algo ayude.
Saludos y exito

Jose Zanni

unread,
Apr 14, 2012, 11:21:41 AM4/14/12
to codeignit...@googlegroups.com


El sábado, 14 de abril de 2012 16:39:46 UTC+2, Daniel Carrero. escribió:

Hola, has hecho ya un estudio de rendimiento, talves usando benchmark ( http://codeigniter.com/user_guide/libraries/benchmark.html ) o

Si, esta genial esta opción, con eso pude ver exactamente que consulta come mas tiempo, ya me tocará intentar optimizar esa consulta en particular, que hay algo mal alli para que tarde tanto, ya abriré otro tema.


 

puedes usar eacellerator o memcache,

Lo del memcache me interesa pero tengo que investigar cómo se usa y si CI tiene algun helper o algo, si es que CI tiene algo que ver con eso.

 

optimizar las consutas sql por ejemplo en lugar de usa SELECT * podrias usar SELECT campo1,campo2.

Esto si lo tengo optimizado!

Gracias, todo ayuda.

Daniel Carrero

unread,
Apr 14, 2012, 11:29:39 AM4/14/12
to codeignit...@googlegroups.com


El 14/04/2012 11:21, "Jose Zanni" <jose...@gmail.com> escribió:
>
>
>
> El sábado, 14 de abril de 2012 16:39:46 UTC+2, Daniel Carrero. escribió:
>>
>> Hola, has hecho ya un estudio de rendimiento, talves usando benchmark ( http://codeigniter.com/user_guide/libraries/benchmark.html ) o
>
> Si, esta genial esta opción, con eso pude ver exactamente que consulta come mas tiempo, ya me tocará intentar optimizar esa consulta en particular, que hay algo mal alli para que tarde tanto, ya abriré otro tema.
>
>
>  
>>
>> puedes usar eacellerator o memcache,
>
> Lo del memcache me interesa pero tengo que investigar cómo se usa y si CI tiene algun helper o algo, si es que CI tiene algo que ver con eso.
>
>  

Aca encontre algo
codeigniter.com/user_guide/libraries/caching.html#memcached
O
https://github.com/tomschlick/memcached-library

>>
>> optimizar las consutas sql por ejemplo en lugar de usa SELECT * podrias usar SELECT campo1,campo2.
>
> Esto si lo tengo optimizado!
>
> Gracias, todo ayuda.
>

De nada :)
Saludos

mariano

unread,
Apr 14, 2012, 8:08:01 PM4/14/12
to codeignit...@googlegroups.com
hola, chico, ademas de las optimizaciones del lado del servidor y todo lo demas, muchas paginas web requieren de optimizaciones más superficiales, aqui te dejo un análisis que hice a una pagina web, que te puede servir. 


Te recomiendo yslow. es tremenda herramienta para evaluar el rendimiento de una web.

Y con respecto al expires, tienes razón en lo de que si lo haces cuando hagas cambio no lo va a actualizar, por ello solo se usa con archivos estáticos, y ademas cuando es llamado se le pone un numero de versión y asi cuando lo actualices cambias la versión y con esto el navegador tiene que actualizar el archivo.

Una ultima cuestión que te puede servir para la cache del navegador es la api de AppCache de html5, que te permite especificar un manifiesto con las lista de los archivos y sus versione,s el cual me parece muy interesante y te puede servir mucho de ayuda, yo no lo e usado todavia pero tiene muy buena pinta

Daniel Carrero

unread,
Apr 14, 2012, 8:44:46 PM4/14/12
to codeignit...@googlegroups.com

Debido correo de Mariano me acorde de que puedea "tunear" apache
http://httpd.apache.org/docs/2.0/misc/perf-tuning.html
Saludos

Jimmy Collazos || acido || cuatroxl.com

unread,
Apr 15, 2012, 7:22:43 AM4/15/12
to codeignit...@googlegroups.com
Por experiencia propia, es mejor ir por partes e ir valorando paso a paso.

  1. Olvídate de Apache, Nginx es tu mejor amigo
  2. Utiliza un sistema de cache en el propio Nginx, Varnish es una opción.

    A partir de aquí ya tienes varios caminos, cada uno es más complicado que el otro


  3. Has un testeo de estrés a  cada Action, en todos los controladores

Según los resultados del estrés, puedes tener problemas de rendimiento en Base de datos (distingue inserción de lectura, es muy importante esa diferencia) o en proceso del propio PHP.

Memcache es el sistema más básico para cachear todo tipo de procesos en el back-end; funciona bastante bien si trabajas sólo con una instancia.

Si tu problema es la base de datos, revisa las consultas y el proceso que estás haciendo de los datos,  mira bien si te conviene una MyISAM o ImnoDb (dependiendo de si tu problema es lectura o escritura); recuerda que puedes cachear los datos (en caso de poder, Memcache power!)

No tires ni una sola línea de código hasta hacer esto, porque estarás mejorando a ciegas y puedes tardar muchísimo en dar con una buena configuración.

En mi caso, fué configurar bien el Nginx y cachear una consulta; con eso mejoré muchisimo, porque sólo tardaba en cargar la portada (que tenía un listado)

--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::: J i m m y  C o l l a z o s :::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Jose Zanni

unread,
Jun 2, 2012, 7:06:34 AM6/2/12
to codeignit...@googlegroups.com
Bueno, ha pasado tiempo y cumplo en comentar mas o menos cómo salí del paso.

Por empezar fueron varios factores, numero uno, detectar dónde estaba el problema, asi que poniendo mediciones de tiempo en distintos lugares encontré el que retraso estaba al hacer una consulta.
Pensando que esa consulta no se podía hacer de otra manera fui agregando distintas optimizaciones, por ejemplo:
- cacheo de consultas a la BD, eso mejoró muchísimo la velocidad, lo que pasa es que de vez en cuando hay que limpiarlo porque sino siempre tenemos los mismos resultados
- headers con tiempo de cache para que el explorador no haga las solicitudes al servidor. Un poco lo mismo que antes, al ser una pantalla con datos dinámicos es un problema pero sí que acelera.
- también agregué headers a las imagenes y restos de archivos, pero como no eran el problema en este caso daba igual

Finalmente encontré cuál era el problema, que todo lo demás era necesario pero no era el punto. Bien, el problema es que tenía un error en la definición de un par de tablas, que en su momento me olvidé de crear bien los índices y al principio iba todo bien, pero al agrandarse la base de datos las consultas se hicieron eternas al no tener índices!!!
Fue crear esos indices y todo volvió a la normalidad.

De todos modos agradezco a todos los consejos, la web está lejos de tener tantas visitas como para aplicar optimizaciones extremas, pero todo lo que aprendí ahora seguro que viene bien!.
Reply all
Reply to author
Forward
0 new messages