Acelerar cakePHP. Mi aplicación funciona muy lenta

564 views
Skip to first unread message

Jesús Ángel

unread,
Jan 14, 2010, 5:06:08 PM1/14/10
to cakep...@googlegroups.com
Hola

Mi aplicación funciona muy lenta. He leído métodos para mejorar el rendimiento:

http://www.pseudocoder.com/archives/2009/03/17/8-ways-to-speed-up-cakephp-apps/

La aplicación la estoy probando en el servidor de desarrollo. No es un mal equipo: Intel core 2 duo @2.53GHz 6GB RAM. El caso es que una página tarda en generarse entre 3 y 4 segundos de media, aunque hay veces que es mucho peor, llegando a tardar más de 9 segundos.

No creo que sea problema de la base de datos. En el ejemplo que indico a continuación, se hacen 41 consultas y la más lenta tarda 3 ms. El resto oscila entre 0 y 1 ms.

En cuanto al consumo de memoria y tiempo de cada acción:

Memory Current Memory Use 21,00 MB


Peak Memory Use 21,00 MB


Timers

Total Request Time: 3,681751 (seconds)


Message
Time in seconds

Component initialization and startup 0,156310
Controller Action 0,343630
Render Controller Action 0,255050
Rendering View 0,247930
Rendering APP/views/resources/view.ctp 0,202970
Rendering APP/views/elements/resources/badges_block.ctp 0,004200
Rendering APP/views/elements/resources/details_block.ctp 0,010160
Rendering APP/views/elements/resources/user_block.ctp 0,001730
Rendering APP/views/elements/resources/status_block.ctp 0,004580
Rendering APP/views/elements/resources/categories_block.ctp 0,011290
Rendering APP/views/elements/resources/tags_block.ctp 0,003470
Rendering APP/views/elements/resources/attachments.ctp 0,000550
Rendering APP/views/elements/resources/authors.ctp 0,000330
Rendering APP/views/layouts/default.ctp 0,042250
Rendering APP/views/elements/search.ctp 0,021230

El caso es que sumando esos tiempos sólo me da 1,3 s. ¿De donde salen los 2,38 s restantes?

He hecho alguna prueba con xdebug para intentar determinar el código responsable de la lentitud, aunque todavía no controlo demasiado la función de "profile" de xdebug y no me aclaro demasiado.

Entiendo que la cache pueda ayudar sobre todo cuando la aplicación esté en producción y haya muchos usuarios accediendo a ella, pero de entrada no me cuadra que funcione tan mal.

¿Se os ocurre algún motivo por el que la aplicación vaya tan lenta?


Luis Leiva

unread,
Jan 14, 2010, 5:12:36 PM1/14/10
to cakep...@googlegroups.com
usas ajax embebido en la pagina?

Saludos Cordiales

Luis Enrique Leiva Bazan
Analista Desarrollador Senior Java Oracle JDeveloper
Mail: luis....@mdp.com.pe

MDP Consulting S.A.C.
Las Begonias 2638 - Lince
Tel: 98517-9130


--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.


Jesús Ángel

unread,
Jan 14, 2010, 5:37:26 PM1/14/10
to cakep...@googlegroups.com
En algunas páginas, sí, pero en otras no. En concreto, en esa que he
puesto de ejemplo, no hay nada de ajax. En el Firebug aparece que la
petición de la página tarda unos 3,5 s en procesarse. Después descarga
algunas imágenes, javascript, css, etc. Pero lo que es la generación y
envío (sólo ocupa 6 KB) de la página lleva los 3,5 s.

¿Por qué lo preguntas? No creo que importe.

Joaquin Windmüller

unread,
Jan 14, 2010, 5:40:37 PM1/14/10
to cakep...@googlegroups.com
Los otros segundos podrian ser la latencia del solicitud y los demas elementos de la pagina (scripts, imagenes...)

2010/1/14 Luis Leiva <teng...@gmail.com>

José Lorenzo

unread,
Jan 14, 2010, 8:32:39 PM1/14/10
to cakep...@googlegroups.com
No tienes configurado ningun tipo de cache? Me refiero a si tienes permisos de escritura sobre tmp/, porque bien el framework se puede tomar ese tiempo en leer todos los archivos para cada request si no tienes ningun cache activado. En modo desarrollo el cache dura 30 segundo, puedes hacer peticiones sucesivas y ver si el tiempo disminuye,



2010/1/14 Joaquin Windmüller <joaqu...@gmail.com>

Juazisco

unread,
Jan 15, 2010, 12:13:54 AM1/15/10
to cakep...@googlegroups.com
tube le mismo problema pero por no configurar mi DB, habilite el cache en mysdql e implemente indices necesarios.

Saludos,
jose'Q

2010/1/14 José Lorenzo <jose...@gmail.com>



--
-------------------------------
Jose Quiñones Enciso
Blog: http://joseq.inkax.org
-------------------------------
Apesol:
http://www.apesol.org
-------------------------------

Pedro Arana

unread,
Jan 15, 2010, 2:33:02 AM1/15/10
to cakep...@googlegroups.com
2010/1/14 Jesús Ángel <jesusange...@gmail.com>

>
> Hola
>
> Mi aplicación funciona muy lenta. He leído métodos para mejorar el rendimiento:
>
> http://www.pseudocoder.com/archives/2009/03/17/8-ways-to-speed-up-cakephp-apps/
>
> La aplicación la estoy probando en el servidor de desarrollo. No es un mal equipo: Intel core 2 duo @2.53GHz 6GB RAM. El caso es que una página tarda en generarse entre 3 y 4 segundos de media, aunque hay veces que es mucho peor, llegando a tardar más de 9 segundos.
>
> No creo que sea problema de la base de datos. En el ejemplo que indico a continuación, se hacen 41 consultas y la más lenta tarda 3 ms. El resto oscila entre 0 y 1 ms.

¿Cual es el tamaño de la pagina y la velocidad de transferencia de la
conexion a tu server?
41 consultas por pagina es un numero muy elevado. ¿tienes pool de
conexiones a la BD?
¿que elementos manejas en la pagina? (#imgs, css , ajax)
Instala firebug y activa la pestaña de red, ¿cuanto tiempo tardas en
servir cada elemento?
¿que otros procesos corren en el server? (log de bd, respaldos)

Saludos
Pedro Arana

--
Defiende tu derecho a pensar, porque incluso pensar de manera errónea
es mejor que no pensar.
-Hipatia de Alejandría

Daniel Ceillán

unread,
Jan 15, 2010, 9:08:53 AM1/15/10
to cakep...@googlegroups.com
Yo un problema que tuve fue en operatoria de arrays en php, no era mucha informacion, pero cuando hacia pasajes entre arrays la app se moria... 

lo descubri desafectando bloque por bloque hasta que encontre el bloque de codigo que me generaba el retraso

operaciones de arreglos como sort, array_push, array_pop o

$un_array['un-indice'] = $otro_array['otro-indice']['otro-indice-mas'];

todo este tipo de cosas pueden llegar a generar retrasos... si tenes que hacer operatorias complejas entre datos, seria recomendable utilizar algun tipo de solucion dinamica como listas o arboles. 

Salut...

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.






--
Daniel Ceillan
TSSI
skype: codigodaniel
msn: codigo...@live.com.ar
Facebook: http://www.new.facebook.com/codigodaniel
http://proyectohelado.com.ar
http://tuproyectoya.com.ar

Vendo Notebook Bangho Core 2 Duo +  Geforce 1 año de Garantia... escucho ofertas...

Jesús Ángel

unread,
Jan 15, 2010, 2:16:19 PM1/15/10
to cakep...@googlegroups.com
Hola

Muchas gracias por intentar ayudarme. Os contesto a vuestras preguntas:

Joaquín dijo:


> Los otros segundos podrian ser la latencia del solicitud y los demas
> elementos de la pagina (scripts, imagenes...)

La página completa HTML + elementos como js, imgs, etc. tarda más de los
3 s en cargarse, pero lo que me preocupa es que el apache tarda 3 s en
procesar el PHP y devolver el HTML al navegador.

José Lorenzo dijo:


>No tienes configurado ningun tipo de cache? Me refiero a si tienes
>permisos de escritura sobre tmp/, porque bien el framework se puede
> tomar ese tiempo en leer todos los archivos para cada request si no
>tienes ningun cache activado. En modo desarrollo el cache dura 30
>segundo, puedes hacer peticiones sucesivas y ver si el tiempo
>disminuye,

El apache sí que puede escribir en el directorio tmp. Normalmente tengo
el debug activado, aunque lo he desactivado y el rendimiento no ha
mejorado. Recargando la página varias veces, el tiempo que tarda en
responder el servidor no varia apenas, estando en torno a los 3 s. En el
directorio cache aparecen los modelos y en el persistent también hay
algunos ficheros.

Juazisco dijo:
> tuve le mismo problema pero por no configurar mi DB, habilite el cache


en mysdql e implemente indices necesarios.

Las consultas de la base de datos devuelven pocos registros. Tengo los
índices creados. En el log de consultas realizadas, el tiempo acumulado
no supera los 50 ms.

Pedro arana dijo:


> ¿Cual es el tamaño de la pagina y la velocidad de transferencia de la
> conexion a tu server?

6 KB. Apache local (http://localhost). Transferencia >> 100 Mbps

> 41 consultas por pagina es un numero muy elevado. ¿tienes pool de
> conexiones a la BD?

Utilizo el driver mysqli para conectar a la MySQL. De las 41 consultas,
19 corresponden a los describe que hace el framework. 4 son de las ACL y
2 son las que obtienen los datos que muestro en la página.

> ¿que elementos manejas en la pagina? (#imgs, css , ajax)

Es la generación del HTML lo que tarda los 3 s. Después hay que
descargar el resto de elementos, pero en eso ya no influye cakePHP.

> Instala firebug y activa la pestaña de red, ¿cuanto tiempo tardas en
> servir cada elemento?

Lo tengo instalado. 2,96 s en obtener la página (2,93 s: waiting for
response, +29 ms receiving data). La página carga por completo en 7,74
s, pero es que tengo que quitar un montón de javascript que me sobran.
Pero ahora mismo lo que quiero es reducir los 2,93 s que tarda el apache
en generar la página.

> ¿que otros procesos corren en el server? (log de bd, respaldos)

Es el ordenador de desarrollo. Core 2 duo @2.53Ghz con 6GB RAM y con
apenas carga. He probado en un servidor de un hosting (servage) y va
todavía más lento.

Ricardo Mun~oz A.

unread,
Jan 15, 2010, 2:39:25 PM1/15/10
to cakep...@googlegroups.com
2010/1/15 Jesús Ángel <jesusange...@gmail.com>:

[...]

> La página completa HTML + elementos como js, imgs, etc. tarda más de los
> 3 s en cargarse, pero lo que me preocupa es que el apache tarda 3 s en
> procesar el PHP y devolver el HTML al navegador.

has hecho cambios a la configuracion del Apache?
a la configuracion del PHP?
quizas algo relacionado con el sistema operativo? (cual usas?)
probaste en distintos navegadores?

> José Lorenzo dijo:
>>No tienes configurado ningun tipo de cache? Me refiero a si tienes
>>permisos de escritura sobre tmp/, porque bien el framework se puede
>> tomar ese tiempo en leer todos los archivos para cada request si no
>>tienes ningun cache activado. En modo desarrollo el cache dura 30
>>segundo, puedes hacer peticiones sucesivas y ver si el tiempo
>>disminuye,
>
> El apache sí que puede escribir en el directorio tmp. Normalmente tengo
> el debug activado, aunque lo he desactivado y el rendimiento no ha
> mejorado. Recargando la página varias veces, el tiempo que tarda en
> responder el servidor no varia apenas, estando en torno a los 3 s. En el
> directorio cache aparecen los modelos y en el persistent también hay
> algunos ficheros.

podrias tratar de probar de alguna forma medir cuanto se demora Apache
en mostrar una pagina estatica. o un controlador de Cake sin consultas
a la BD y con una vista simple.

> Juazisco dijo:
>> tuve le mismo problema pero por no configurar mi DB, habilite el cache
> en mysdql e implemente indices necesarios.
>
> Las consultas de la base de datos devuelven pocos registros. Tengo los
> índices creados.

si tienes pocos registros probablemente MySQL ni use los indices...

> En el log de consultas realizadas, el tiempo acumulado
> no supera los 50 ms.

probaste ejecutar las mismas consultas directamente en MySQL? (prueba
con la mas "lenta")

> Pedro arana dijo:
>> ¿Cual es el tamaño de la pagina y la velocidad de transferencia de la
>> conexion a tu server?
>
> 6 KB. Apache local (http://localhost). Transferencia >> 100 Mbps
>
>> 41 consultas por pagina es un numero muy elevado. ¿tienes pool de
>> conexiones a la BD?
>
> Utilizo el driver mysqli para conectar a la MySQL. De las 41 consultas,
> 19 corresponden a los describe que hace el framework. 4 son de las ACL y
> 2 son las que obtienen los datos que muestro en la página.

las de los describe no se ejecutan cuando debug esta en 0.

>> ¿que elementos manejas en la pagina? (#imgs, css , ajax)
>
> Es la generación del HTML lo que tarda los 3 s. Después hay que
> descargar el resto de elementos, pero en eso ya no influye cakePHP.
>
>> Instala firebug y activa la pestaña de red, ¿cuanto tiempo tardas en
>> servir cada elemento?
>
> Lo tengo instalado. 2,96 s en obtener la página (2,93 s: waiting for
> response, +29 ms receiving data). La página carga por completo en 7,74
> s, pero es que tengo que quitar un montón de javascript que me sobran.
> Pero ahora mismo lo que quiero es reducir los 2,93 s que tarda el apache
> en generar la página.

estas seguro que por ejemplo en alguna parte del HTML no estas
incluyendo codigo javascript directamente desde Internet?

>> ¿que otros procesos corren en el server? (log de bd, respaldos)
>
> Es el ordenador de desarrollo. Core 2 duo @2.53Ghz con 6GB RAM y con
> apenas carga. He probado en un servidor de un hosting (servage) y va
> todavía más lento.

yo diria que tu problema no es Cake.

--
Ricardo Mun~oz A.

Pedro Arana

unread,
Jan 15, 2010, 2:49:53 PM1/15/10
to cakep...@googlegroups.com
> Lo tengo instalado. 2,96 s en obtener la página (2,93 s: waiting for
> response, +29 ms receiving data). La página carga por completo en 7,74
> s, pero es que tengo que quitar un montón de javascript que me sobran.
> Pero ahora mismo lo que quiero es reducir los 2,93 s que tarda el apache
> en generar la página.

Crea una vista que solo contenga la instruccion phpinfo(). Corre y
mide el tiempo.
Crea un test.php con phpinfo() y correlo fuera de cake, mide el tiempo

¿que esta alenteciendo tu pagina?

Apache mal configurado: no hay mucha diferencia entre tiempo en ambas pruebas
Cake haciendo "algo" : la vista tarda mucho mas que test.php
Codigo que tu hiciste: Ambos tardan muy poco tiempo en comparación a tu pagina

Si estas trabajando sobre linux/unix podrias intentar usar microtime()
para rastrear donde estas perdiendo tiempo.

Jesús Ángel

unread,
Jan 15, 2010, 6:25:09 PM1/15/10
to cakep...@googlegroups.com
Hola

El phpinfo() sin pasar por cake: 33 ms (14 ms esperando la respuesta y
19 ms recibiendo datos).

El phpinfo en una vista. He añadido la acción phpinfo a un controlador,
vacío, y en la vista llamo a phpinfo(). En este caso 2,59 s (2,27 s +
316 ms).

He quitado todos los componentes del app_controller.php, también los
helpers, pero la vista con el phpinfo sigue tardando 2,37 s.

Tendré que investigar a fondo a ver donde se va el tiempo. Trabajo bajo
linux. Voy a ver si aprendo a usar la función de "profiling" de xdebug y
detecto la "fuga".

Gracias

Nachopitt

unread,
Jan 15, 2010, 6:28:25 PM1/15/10
to cakep...@googlegroups.com
Las consultas DESCRIBE son bastante costosas. Estas deberían desaparecer al momento de cambiarte de desarrollo a producción, exceptuando en los casos donde no tengas el scheme.php para tus db en app/config/sql o que no se estén guardando las cachés para tus modelos.

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.






--
Ignacio Alberto Zamora Esqueda
Ingeniero de Software
Corporación Tectronic, S.A. De C.V.
Tels: (33) 3615-44-11 y 36-15-45-11
Fax: (33) 3615-46-11
sist...@tectronic.com.mx
www.tectronic.com.mx

Jesús Ángel

unread,
Jan 15, 2010, 7:34:54 PM1/15/10
to cakep...@googlegroups.com
Con el xdebug he visto que la función de PHP array_merge se llama 3.465
veces, lo que representa un total de 665 ms. El método Folder->read se
llama 1.621 veces (631 ms), el método Folder->__tree se llama 1.622
veces (570 ms), el método Folder->slashTerm se llama 8.367 veces (309
ms). Después hay otros 6 métodos que se llevan unos 100 ms cada uno.

En mi aplicación uso un plugin llamado searchable para el motor de
búsqueda Lucene. Este plugin es responsable de muchas de las llamadas a
array_merge. Si lo quito, el número de llamadas a array_merge se reduce
a 1.765 y el tiempo total baja a 112 ms. El plugin incluye un behaviour
asociado a uno de mis modelos.

Acabo de localizar la causa del problema en el setup del behaviour del
plugin anterior, concretamente en una llamada a App::import:

App::import('Vendor', 'Zend/Search/Lucene', array('file' =>
'Zend'.DS.'Search'.DS.'Lucene.php'));

En el directorio vendors tengo un montón de carpetas (todo el framework
de Zend más otras cosas). No se por qué razón, el método App::import
debe estar recorriendo todo el árbol de carpetas del sistema de archivos
bajo la carpeta vendors.

Si sustituyo el import anterior por un include_once, entonces desaparece
el montón de llamadas a Folder->read, Folder->__tree y array_merge

include_once '/home/user/workspace/app/vendors/Zend/Search/Lucene.php';

Ahora el phpinfo de la vista me tarda 700 ms. Sigue siendo mucho más que
un simple phpinfo(), pero el framework conlleva bastante sobrecarga.

Gracias por vuestra ayuda. Si alguien sabe como hacer que el App:import
cargue el archivo igual que el include, su ayuda será bienvenida :-)

El vie, 15-01-2010 a las 13:49 -0600, Pedro Arana escribió:

José Lorenzo

unread,
Jan 15, 2010, 8:44:57 PM1/15/10
to cakep...@googlegroups.com
Ahhhhh! con razón

En mi primer email te iba a preguntar si estabas incluyendo alguna librería del zend framework. Este es un problema conocido de lentitud.

El zend framework tiene tantas carpetas y archivos que la clase Folder se tarda eternidades recorriendola. Este es un error que se termina definitivamente poniendo el debug en 0 (las ubicaciones de los archivos se guardan en cache y este recorrido no ocurre más)

Me sorprende que hayas dicho que la aplicacion no mejora su rendimiento al poner debug en 0. tendras que verificar que efectivamente se esté guardando el cache (si es así el numero de llamadas los metodos de folder deberia reducirse dramaticamente)

2010/1/15 Jesús Ángel <jesusange...@gmail.com>

Adrian Ariza

unread,
Jan 15, 2010, 11:16:23 PM1/15/10
to cakep...@googlegroups.com
Pregunta estupida, que version de Cake estas usando? No lo encontre en
los mensajes... sepand disculpar, pregunto solo por si acaso.
Saludos!

Jesús Ángel

unread,
Jan 16, 2010, 6:58:55 AM1/16/10
to cakep...@googlegroups.com
Hola

Pues probé con el debug a 0, pero no observé ninguna mejora en el
rendimiento. Me temo que tenía deshabilitada la caché y por eso no
funcionaba aunque desactivase el debug :-(

Configure::write('Cache.disable', true);

Ahora mismo se me ha roto algo del componente ACL, supongo que por
cambios que hice para encontrar el problema de la clase Folder. Cuando
lo arregle probaré a poner otra vez los App::import y ver si con la
caché se evitan las numerosas llamadas a los métodos de Folder.

Saludos y gracias

Jesús Ángel

unread,
Jan 16, 2010, 11:05:59 AM1/16/10
to cakep...@googlegroups.com
El vie, 15-01-2010 a las 21:14 -0430, José Lorenzo escribió:
> En mi primer email te iba a preguntar si estabas incluyendo alguna
> librería del zend framework. Este es un problema conocido de lentitud
>
> Me sorprende que hayas dicho que la aplicacion no mejora su
> rendimiento al poner debug en 0. tendras que verificar que
> efectivamente se esté guardando el cache (si es así el numero de
> llamadas los metodos de folder deberia reducirse dramaticamente)


Activando la cache y desactivando el modo debug, a pesar de mantener los
App::import, la aplicación ya no tarda tanto en generar las páginas.
Ahora basta con unos 700 ms.

Misterio resuelto :-)


Luis Leiva

unread,
Jan 16, 2010, 10:45:52 PM1/16/10
to cakep...@googlegroups.com
el Lucene es para realizar busquedas de resultados html?
no has probado algo del Sphinx?
seugn cmentan es mucho mas rapido q el Lucene y consume mucho menos memoria


Saludos Cordiales

Luis Enrique Leiva Bazan
Analista Desarrollador Senior Java Oracle JDeveloper
Mail: luis....@mdp.com.pe

MDP Consulting S.A.C.
Las Begonias 2638 - Lince
Tel: 98517-9130


Jesús Ángel

unread,
Jan 17, 2010, 4:25:55 AM1/17/10
to cakep...@googlegroups.com
Sí, también hace eso, aunque yo lo que indexo son los registros que meto
en la base de datos. También se pueden usar índices del tipo fulltext en
la B.DD., pero encontré la solución de Lucene y me resultó bastante
rápida. No he probado Sphinx.

Salu2

jordicakephp

unread,
Jan 17, 2010, 12:14:52 PM1/17/10
to CakePHP en Español

On 17 ene, 04:45, Luis Leiva <tengu...@gmail.com> wrote:
> el Lucene es para realizar busquedas de resultados html?
> no has probado algo del Sphinx?

Yo tampoco he usado Sphinx. Hasta donde yo sé, Lucene es un buscador
full-text, que dicen, que resuelve el (nada trivial) problema de
realizar búsquedas por relevancia de cualquier tipo mediante una
sencilla interfaz. Para ello, se vale de un índice que, como Google,
trabaja con algoritmos que manipulan espacios métricos de alta
disponibilidad al que puedes añadirle documentos formados por campos
de varios tipos (que son los que contienen la información indexable).
En resumen, Lucene nos facilita la vida.

Reply all
Reply to author
Forward
0 new messages