Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Como reduje el consumo en más de 350%

Estas en el tema de Como reduje el consumo en más de 350% en el foro de Mysql en Foros del Web. Hola a todos, Llevo con mi proyecto más de dos años pero fué en los últimos meses en que comenzó a crecer de forma desproporcionada ...
  #1 (permalink)  
Antiguo 22/02/2014, 18:45
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Como reduje el consumo en más de 350%

Hola a todos,

Llevo con mi proyecto más de dos años pero fué en los últimos meses en que comenzó a crecer de forma desproporcionada y comenzó a escapar de mi contról.

Que sucedió

Básicamente, jugué bién algunos movimientos estratégicos que mejoraron las visitas de mi aplicación que se embebe en otros sitios web, como el botón de "me gusta" de facebook, por ejemplo.

Esta "buena jugada" generó que en menos de una semana pase de 100 visitas por día a 25 mil, en 2 semanas 35 mil, en 3 semanas 50 mil y así sucesivamente hasta que a día de hoy genero más de 130 mil por día de estas "aplicaciones embebidas".

El problema

Claramente, este tipo de cosas no sucede todos los días y no siempre uno piensa en "escalar". Por ello me ví en varios problemas, primero y principal fué que mi hosting compartido me botó. Algo que me dió la pauta de implementar servidores de respaldo.

Esto funciona de la siguiente manera: tu sitio web que tiene la aplicación instalada envia una petición al servidor principal y si este servidor responde envia una petición allí, caso contrario escoje de forma random uno de los 3 servidores de respaldo.

Luego de pasarme a un VPS, me ví en un serio problema de costos, escalé el VPS de manera muy rápida. Más precisamente, en menos de 3 semanas escalé al Level 9 de Hostgator, dicho nivel, supuestamente entrega más de 5Ghz de procesamiento, algo que tampoco me alcanzaba.

La solución (o eso creia)

Creí que Hostgator me mentía y multiplicaba mi consumo por ende decidí mover a una solución cloud, pensando siempre a futuro, claro está.

Moví todo a la solución cloud, invertí en la puesta a punto, tiempo, esfuerzo y dinero y me topé con la sopresa que mi consumo de procesador se redujo en un 50%, esto puede ser por dos cosas:
  • El procesador de la plataforma Cloud es más potente que el de Hostgator
  • Hostgator me estuvo mintiendo todo este tiempo

De todos modos, no se si no lo quize ver o que, el problema seguía. Cuando activaba el servidor principal y toda la carga recaía sobre él, dicho servidor se iba a 400% de procesador.

El verdade problema

El 85% de mi consumo estaba en las consultas MySQL. Era taaaaan pero taaan simple que solo me compadece el hecho de que cuando comencé con el proyecto no era tan "vivo" con la escalabilidad ni pensé que sucedería algo así.

El problema fué que utilizaba en las búsquedas un identificativo generado por HASH, recortado mas un salt. Esto hacia que cada día al agregarse más de 4 millones de filas, la búsqueda cada día dure más y más.

Ejecutando la consulta, ví que llegaba a durar de 1 segundo a 0.8, 0.5 segundos, si lo multiplico por 5 o 6 consultas, dá el tiempo de carga que tenía actualmente.

La verdadera solución

La solución final fué pasar las búsquedas a columnas autoincrementales, las cuales las tenía pero no sé si por pereza o que no las utilizaba. En realidad las usaba para cuando quería ordenar las filas en phpmyadmin y ver la última generada (bueno, también podia usar la fecha, ahora que lo pienzo).

Una buena práctica que siempre utilizé fué crear un autoincrement en TODAS las tablas, algo que hago automáticamente, pero que generalmente no utilizo, en cambio, utilizo un UUID alfanumerico. Y esto, fué lo que me ahorró más de 350% de consumo, el pasar las consultas a Autoincrement.

Otras cosas también bajaron aún más mi consumo, como por ejemplo, no utilizar SELECT COUNT(*) sinó SELECT COUNT(columnaautoincrement), por ejemplo. Pero, principalmente, fué lo primero.

La lección

SIEMPRE utilizar autoincrement de forma activa. Ya sea para seleccionar en un WHERE, para UPDATE o lo que sea. Siempre!
  #2 (permalink)  
Antiguo 22/02/2014, 20:27
 
Fecha de Ingreso: febrero-2010
Mensajes: 49
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Como reduje el consumo en más de 350%

No entendí bien el concepto.
¿Te refieres a que al crear la tabla, siempre crear un campo con atributo autoincrement?
¿O al hacer una consulta sql hacerlo tambien a dicho campo?
  #3 (permalink)  
Antiguo 23/02/2014, 08:32
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Respuesta: Como reduje el consumo en más de 350%

Cita:
Iniciado por yamatadvd2000 Ver Mensaje
No entendí bien el concepto.
¿Te refieres a que al crear la tabla, siempre crear un campo con atributo autoincrement?
¿O al hacer una consulta sql hacerlo tambien a dicho campo?
Ámbas cosas. SIEMPRE tener una columna autoincrement, y utilizar dicha columna activamente, para todos los SELECT, UPDATE, DELETE.
  #4 (permalink)  
Antiguo 23/02/2014, 09:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como reduje el consumo en más de 350%

Cita:
Iniciado por dezagus Ver Mensaje
Ámbas cosas. SIEMPRE tener una columna autoincrement, y utilizar dicha columna activamente, para todos los SELECT, UPDATE, DELETE.
Es relativo.
Las columnas autoincrementales son, las más de las veces, parches de programador a modelo de datos no muy bien diseñados. No son necesariamente buenas soluciones.
Es mejor un correcto modelado de datos, con consultas optimizadas, así como relevar los requerimientos del sistema y la eficiencia de la aplicación, que usar AI como solución mágica.

La solución que encontraste ´puede parecerte a ti eficiente y efectiva, pero desde nuestro lado no podemos saber con certeza si la decisión que tomaste es del todo correcta porque en realidad no conocemos ni tu modelo de datos, ni las queries que usas, ni tampoco lo bien o mal diseñada que está esa aplicación. Es información insuficiente para poder dar una opinión adecuada.
Tal es así, que a pesar de la solución que implementaste, a mi, esta frase:
Cita:
El 85% de mi consumo estaba en las consultas MySQL.
me habla de tres defectos probables: exceso o mal manejo de conexiones, ineficiencia en el uso de consultas, y falta de optimización de la aplicación. Todos elementos que podrían corregirse sin necesidad de implementar AIs.
Lo que hace, si, el uso de AI como base de JOINs más eficiente es por que el acceso por claves numéricas es siempre más rápido que por claves alfanuméricas. Eso si.
Pero el hablar de claves numéricas no implica hablar de AI. Podríamos estar hablando en realidad de numeros de documento, o telefónicos, e igualmente obtener el mismo nivel de mejora.
Además, si la clave no es parte del resultado a utilizar, puedes estar usando accesos a disco innecesarios, y eso podría ser mejorado de otro modo.
Claro que estoy especulando, pero especulo en base a mi experiencia en BBDD, y he visto cambios brutales de eficiencia en consultas sin necesidad de implementar AIs...

Todo depende del contexto del sistema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/02/2014, 12:22
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Respuesta: Como reduje el consumo en más de 350%

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es relativo.
Las columnas autoincrementales son, las más de las veces, parches de programador a modelo de datos no muy bien diseñados. No son necesariamente buenas soluciones.
Es mejor un correcto modelado de datos, con consultas optimizadas, así como relevar los requerimientos del sistema y la eficiencia de la aplicación, que usar AI como solución mágica.

La solución que encontraste ´puede parecerte a ti eficiente y efectiva, pero desde nuestro lado no podemos saber con certeza si la decisión que tomaste es del todo correcta porque en realidad no conocemos ni tu modelo de datos, ni las queries que usas, ni tampoco lo bien o mal diseñada que está esa aplicación. Es información insuficiente para poder dar una opinión adecuada.
Tal es así, que a pesar de la solución que implementaste, a mi, esta frase:

me habla de tres defectos probables: exceso o mal manejo de conexiones, ineficiencia en el uso de consultas, y falta de optimización de la aplicación. Todos elementos que podrían corregirse sin necesidad de implementar AIs.
Lo que hace, si, el uso de AI como base de JOINs más eficiente es por que el acceso por claves numéricas es siempre más rápido que por claves alfanuméricas. Eso si.
Pero el hablar de claves numéricas no implica hablar de AI. Podríamos estar hablando en realidad de numeros de documento, o telefónicos, e igualmente obtener el mismo nivel de mejora.
Además, si la clave no es parte del resultado a utilizar, puedes estar usando accesos a disco innecesarios, y eso podría ser mejorado de otro modo.
Claro que estoy especulando, pero especulo en base a mi experiencia en BBDD, y he visto cambios brutales de eficiencia en consultas sin necesidad de implementar AIs...

Todo depende del contexto del sistema.
Por supuesto, todo depende del contexto. Pero esto es un TIP para un proyecto como muchos que inicia siendo amateur y comienza a ganar terreno.

Si hablamos desde el lado StartUp: Existe un "limbo" en el cual no te dá suficiente ganancia como para subcontratar todo o pagar full time. Ese período es el período de monetización en el que uno tiene que absover costos, mejorar el perfíl público del proyecto y permitirse funcionar correctamente en el aquí y ahora. Uno como emprendedor tiene múltiples conocimientos de cientas de ramas, pero no se especializa practicamente en ninguna. Ese es mi perfíl, por ejemplo. No soy Ing en Software, pero pude optimizarlo en un 350%. Se que se puede aún más, pero ya escapa de mi conocimiento y de mi necesidad, como bién dijiste: es relativo.

Obviamente, mi base de dátos no es eficiente ni en lo más mínimo, pero para proyectos similares que inician de manera similar creo que es un buén TIP el que doy. Uno cuando inicia un proyecto por su cuenta, generalmente no optimiza al extremo (generalmente no lo hace) ya que requiere más tiempo y más esfuerzo y en ocaciones dinero.

En mi caso, no optimizé al comienzo por falta de conocimiento y porque era una prueba más que otra cosa. Hoy, tiene otro enfoque.

Lo que planteo aca NO ES la panacea, sinó dos o tres pequeños TIPs que ayudan a que proyectos a nivel web crezcan más con menos. Solo eso.

============ Otro Tip ============

Lo que me sucedía es que a las 4AM se ejecutaba un cron el cual limpiaba la DB de registros con más de 5 días. Bueno, en esos 5 días puede haber más de 650 mil filas (en mi caso). Pero ántes, tenia que hacer unos COUNT de dichas filas y luego borrarlas. Eran 3 o 4 COUNTS. Como no puedo optimizar en este momento dichos count, lo que realizé fué ponerle varios sleep para separar entre count y count y evitar cuellos de botella.
  #6 (permalink)  
Antiguo 23/02/2014, 13:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Como reduje el consumo en más de 350%

Cita:
Lo que me sucedía es que a las 4AM se ejecutaba un cron el cual limpiaba la DB de registros con más de 5 días. Bueno, en esos 5 días puede haber más de 650 mil filas (en mi caso). Pero ántes, tenia que hacer unos COUNT de dichas filas y luego borrarlas. Eran 3 o 4 COUNTS. Como no puedo optimizar en este momento dichos count, lo que realizé fué ponerle varios sleep para separar entre count y count y evitar cuellos de botella.
Bueno, esa es una actividad habitual para tablas transaccionales, pero siempre se hace con la base OFF LINE.
¿Así lo realizabas, o lo hacías en caliente?

Cita:
En mi caso, no optimizé al comienzo por falta de conocimiento y porque era una prueba más que otra cosa. Hoy, tiene otro enfoque.
Llegado a ese punto, te recomiendo reingeniería, aunque te lleve un año o más de desarrollo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: consumo, php, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:07.