Cómo diagnosticar un sitio lento

Events happening in the community are now at Drupal community events on www.drupal.org.
EduardoMercovich's picture

Buenos días a todos.

Tengo un sitio de un proyecto sin fines de lucro al que estoy ayudando en Dreamhost que está bastante lento, especialmente durante la edición. El otro día en la reunión surgió el tema de que al tener el servidor de base de datos en otra máquina, es bastante lento.

Querría ver el origen de tal lentitud y -siguiendo el consejo de Víctor y Leo- instalé y configuré el excelente módulo Devel, que muestra una tonelada de estadísticas al final de cada página (entre otras cosas).

Si bien entiendo la idea general (queries duplicados y operaciones de más miliseg son malas), me cuesta usar esta información para ubicar el origen y definir si es el host, o es el armado de este sitio en particular.

Por ejemplo, en la carga más lenta, me dice (ordenado por tiempo de ejecución, desde la mas lenta):

Executed 7724 queries in 147447.51 milliseconds. Queries taking longer than 50 ms and queries executed more than once, are highlighted.Page execution time was 150581.68 ms.
ms   #   where   query
677.5 6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
629.89    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
383.83    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
351.3 6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
330.32    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
318.53    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
311.64    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
299.55    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
290.45    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
289.6   6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
289.48    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
286.68    1   cache_get   SELECT data, created, headers, expire FROM mapeo_cache WHERE cid = 'locale:es'
282.55 6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
282.49    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
281.51    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
278.54    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
277.47    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
276.83    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
271.56    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
270.42    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
270.33  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
269.76    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
269.71    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
268.38    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
268.11    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
267.06    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
266.14    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
264.02  1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
262.63  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
262.15    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
261.23  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
260.52    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
258.39    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
257.52  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
256.87    6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
254.4 6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
254.4 6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
252.43    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
250.27  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
250.14    1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
249.56  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''
246.9 1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
246.74  1516    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = '--'
246.17  6064    _views_load_view    SELECT v.* FROM mapeo_view_view v WHERE v.name = ''

¿Qué hago con esta información?

Me ofrezco a pulir lo que hagamos acá para publicarlo luego, ya que buscando no encontré nada para no-programadores.

Desde ya, muchas gracias y saludos a todos...

Comments

dreamhost ideas

greggles's picture

dreamhost databases son lentos. si tienes comunidad sitio donde mucha gente estan escribiendo dreamhost es un host mala (pero no tengo otro barata sugerencia).

yo uso dreamhost solo por mis sitios con pocos personas que escriban. y entonces puedo usar el "cache" que ayuda mucho con los sitios que tienen visitantes anonymo.

--- (and in my native english...)
dreamhost database servers do tend to be slow. if you have a community site with lots of people editing then dreamhost is probably a bad choice for that site (but I don't have any similarly cheap suggestions).

i use dreamhost only for my sites with one or two or three editors. and in those cases I use the "cache" which helps a lot with sites that have primarily anonymous users.

--
Knaddisons Denver Life | mmm Free Range Burritos

150% agree

adminfor@inforo.com.ar's picture

I agree with you... Don't forget crawlers. As per my stats, crawlers activity is like anonymous users by three, this means, near half a million visits monthly. This is the reason I leaved DH, didn't want more HTTP 500.
Gustavo

Gustavo

Por qué no...?

Rosamunda's picture

Hola Eduardo!
La verdad que esa cantidad de tiempo asusta.
Si mal no recuerdo, habías dicho que tenías elementos que en lugar de usar autocomplete, lo seleccionabas de una lista (una lista larga ;).
Si tenés varios elementos así en la página te va a tardar un montón de tiempo.
Por qué no probás cambiando todas las listas por los campos autocompletables? Creo que vas a notar un enorme progreso.
Si llegás a hacer eso, o a tomar auna otra solución, por favor contála aquí.

Saludos!!
Victoria

Autocompletar

EduardoMercovich's picture

Hola a todos.

Cambié los campos de un select a autocompletar luego de enviar el mensaje. Ya está mucho más rápido y creo que el problema principal era que buscaba todos los actores para completar los select (algo mas de 700) para cada referencia, que eran una media docena.

Ahora anda mucho mejor. La misma página (editar un actor con muchas referencias) da:

Executed 178 queries in 518.72 milliseconds. Queries taking longer than 50 ms and queries executed more than once, are highlighted.Page execution time was 1144.7 ms.
ms  #   where   query
53.18 1   locale  SELECT s.lid, t.translation FROM mapeo_locales_source s INNER JOIN mapeo_locales_target t ON s.lid = t.lid WHERE s.source = 'Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.' AND t.locale = 'es'
50.34 1   cache_get   SELECT data, created, headers, expire FROM mapeo_cache WHERE cid = 'locale:es'
43.82  1   locale  SELECT s.lid, t.translation FROM mapeo_locales_source s INNER JOIN mapeo_locales_target t ON s.lid = t.lid WHERE s.source = 'Optionally specify an alternative URL by which this node can be accessed. For example, type \"about\" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.' AND t.locale = 'es'
34.29 1   locale  SELECT s.lid, t.translation FROM mapeo_locales_source s INNER JOIN mapeo_locales_target t ON s.lid = t.lid WHERE s.source = 'Changes made to the attachments are not permanent until you save this post. The first \"listed\" file will be included in RSS feeds.' AND t.locale = 'es'
29.44  1   cache_get   SELECT data, created, headers, expire FROM mapeo_cache WHERE cid = 'menu:1:es'
16.32  1   nodereference_widget    SELECT n.title FROM mapeo_node n WHERE n.nid = 246
16.13    16  _filter_tips    SELECT * FROM mapeo_filter_formats WHERE format = 2

Lo que ha mejora mucho el tiempo de respuesta. Así que muchas gracias a todos por este cambio. Pasamos de

7724 queries in 147447.51 milliseconds

a

178 queries in 518.72 milliseconds

sólo con un cambio de widget. Es decir, una mejora de varios órdenes de magnitud.

Sin embargo, me gustaría seguir con la propuesta inicial. ¿Cómo saber qué significa cada cosa para ver dónde tocar? Para los que no somos programadores, algunas nociones de cómo funciona el cache (entre otras cosas) podría ser muy útil.

Por ejemplo, las 7 primeras y más lentas son operaciones llamadas locale, cache_get, nodereference_widget, y _filter_tips. Entre ellas suman la mitad del tiempo (243.5 milisegundos). ¿Cuáles son mejorables y cuáles no? ¿Cuáles dependen del host y cuáles pueden ser mejoradas por otros medios? ¿Qué medios?

O por lo menos, algunas fuentes piolas donde uno pueda beber ya que aún sin aprender a programar, sí se puede entender cómo funcionan las cosas.

Desde ya, mil gracias por la ayuda y la comprensión. :-)

Saludos para todos...

--
Eduardo Mercovich

--
Eduardo Mercovich

147477?????!!!!!

vanveen's picture

Pero qué hace tu sitio???? Calcula la probabilidad de que nos choque un cometa?? Busca un remedio para el sida? Resuelve el misterio de la relación entre el hombre y la mujer?

Si yo no me equivoco, 147447 ms son unos dos minutos y medio. That's a lot, boy. Con esos tiempos es un milagro que Dreamhost no te mate el proceso y llegues a ver algo.

Dreamhost podrá ser lento y todo lo que quieran, pero evidentemente también hay un problema con el diseño del sistema, porque 7700 queries para generar una página son una barbaridad aquí y en la luna. Agregale a eso que con cada una de ellas estás pagando el costo de la simpatía de views, y ahí tenés el resultado.

Como regla general, no deberían haber consultas que duren más de 50 ms. Eso ya es la veinteava parte de un segundo. Una página que tarda 1000 ms = 1 s en generarse ya es una página lenta.

Conclusión: en este caso, cambiar de hosting puede dar una mejora marginal, pero yo pondría el acento en revisar la arquitectura del sistema, que es donde se encuentran los verdaderos problemas.

Leonardo Solaas
solaas.com.ar

Leonardo Solaas
solaas.com.ar

Por otra parte...

vanveen's picture

... qué son estas consultas:

SELECT v.* FROM mapeo_view_view v WHERE v.name = ''

?

Vos borraste algo de ahí, o efectivamente estás buscando un montón de veces una cadena vacía? Y varias veces también dos guiones: '--'. No me imagino qué sentido puede tener eso.

Leonardo Solaas
solaas.com.ar

Leonardo Solaas
solaas.com.ar

Búsquedas de "--"

EduardoMercovich's picture

Hola Leo.

Le estuve dando vueltas y creo que es para armar los select que citan otros actores para las referencias. Es lo único que se me ocurre.

Abrazo.

--
Eduardo Mercovich

--
Eduardo Mercovich

Argentina

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: