Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[C] Estructuras vs mysql

Estas en el tema de [C] Estructuras vs mysql en el foro de C/C++ en Foros del Web. Buenas a todos! Estoy haciendo un servidor sencillo basado en C. El sistema simplemente atiene a varios clientes que crean sencillas consultas respondidas por el ...
  #1 (permalink)  
Antiguo 05/02/2015, 08:40
 
Fecha de Ingreso: mayo-2011
Mensajes: 214
Antigüedad: 12 años, 11 meses
Puntos: 16
Pregunta [C] Estructuras vs mysql

Buenas a todos!

Estoy haciendo un servidor sencillo basado en C. El sistema simplemente atiene a varios clientes que crean sencillas consultas respondidas por el servidor. (vía sockets TCP)

Para guardar tal cantidad de datos y por si fuera necesario reiniciar el servidor me veo obligado a crear una base de datos.

La consulta que les quería hacer es sobre eficiencia del servidor, sobretodo para el caso de que hubiera mucha gente conectada a la vez, que seria mejor, hacer consultas en la base de datos cada vez que necesitara algún dato o almacenarlo todo en estructuras internas al inicializar el servidor?

En caso de que la respuesta fuera: si! mysql, por supuesto!, disminuiría el uso de recursos de forma significativa tener la base de datos y el servidor en maquinas independientes?

Quiero encontrar un equilibrio entre recursos que consume el servidor y velocidad a la que el usuario accede a los recursos.

Muchas gracias a todos!
  #2 (permalink)  
Antiguo 05/02/2015, 09:09
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: [C] Estructuras vs mysql

Sin información concreta es complicado dar una respuesta... pero vamos, que yo de momento no me preocuparía tanto por el tema de la eficiencia. Tu primero consigue que el sistema funcione y después dedícate a putearlo y ver hasta donde aguanta... entonces lo mismo te das cuenta que con el diseño que tiene cumple expectativas.

Suele ser algo recurrente el hecho de que la gente se agobie con el tema de la eficiencia antes de tener nada terminado... en serio, no merece la pena. Otra cosa es que me digas que programas fatal y eliges el peor algoritmo del mercado... entonces si, preocúpate un poco por programar mejor, pero no por la eficiencia.

Por otro lado, el tener la información cacheada, si bien puede mejorar enormemente los tiempos de respuesta, supone también un elevado consumo de memoria, lo que podría llevar incluso a que el equipo se saturase ante un número pequeño de peticiones. En este caso también, mi sugerencia es que primero hagas el diseño básico y, a base de pruebas, lo vayas adaptando a tus necesidades específicas.

Ten en cuenta también que el uso de cachés puede dar problemas si están mal implementadas... si la arquitectura es buena debería ser transparente el uso o no de una caché, luego lo suyo es programar el sistema sin cachés y esperar a ver si hacen falta en el futuro.

Otro punto a favor de postponer el uso de cachés es que es posible que no te convenga tener toda la información cacheada a la vez, por lo que elegir el mecanismo más óptimo para que las cachés se vayan regenerando dependerá de la naturaleza de los datos y del uso normal que se le haga al servicio.

Resumiendo:

* Primero consigue que el servidor funcione conectado a una base de datos y sin cachés... todo en el mismo equipo
* Si el servidor no da para tanto, utiliza un "profiler" para ver donde se consume el tiempo de ejecución y mira a ver si esas partes se pueden optimizar
* Si aun necesitas más recursos... mueve la base de datos a otro servidor
* Si aún necesitas más velocidad, plantéate el cacheo de todos o parte de la información

Un saludo
  #3 (permalink)  
Antiguo 06/02/2015, 14:13
 
Fecha de Ingreso: mayo-2011
Mensajes: 214
Antigüedad: 12 años, 11 meses
Puntos: 16
Respuesta: [C] Estructuras vs mysql

Muchas gracias por la explicación!

Me ha quedado claro el 99% de lo que quería resolver aquí!

El servidor en si ya funciona, y el cliente, y la conexión entre ambos. El servidor aun esta en desarrollo, hace lo mínimo e indispensable para que todo el tinglado pueda funcionar mientras ampliamos el negocio xD

Nuestro punto de vista es que el usuario que lo vaya a usar es el que tiene que gozar de la mejor experiencia que nosotros le podamos dar. De aquí que preguntara si es mejor tener datos locales y no depender todo el rato de la base de datos.
Por lo que si hace falta seguiré todos tus conejos y de la experiencia sacaré el mejor resultado que pueda.

Pero por otra parte ahora viene el momento en que tenemos que contratar un servicio o comprar un servidor para sacar la aplicación a la luz, y para eso me tengo que hacer a la idea de lo que consume ahora y lo que consumirá mas adelante.

Bueno, ya te he soltado todo el rollaco ;) así que vayamos a la pregunta: en tu savia opinión, cachear la información es una perdida de recursos, es 100% necesario o ya ampliaré el servidor si algún día lo necesito de verdad?

Muchas gracias!

P.D.: Soy algo novatillo en estos temas, podrías darme mas información sobre eso que has comentado del "profiler"?
  #4 (permalink)  
Antiguo 07/02/2015, 02:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: [C] Estructuras vs mysql

Cita:
Iniciado por moro666 Ver Mensaje
cachear la información es una perdida de recursos, es 100% necesario o ya ampliaré el servidor si algún día lo necesito de verdad?
Como norma general, si optimizas en tiempo es a costa de memoria y si optimizas en memoria es a costa del tiempo.

Si tu cacheas información obviamente reduces el tiempo necesario para localizar la información puesto que ya la tienes cargada, no hay que pedírsela a la base de datos... pero claro, eso consume memoria y los servidores comerciales te imponen límites al consumo de memoria.

Por otro lado, si pasas de cachear la información, el servidor tendrá que hacer constantes búsquedas en la base de datos, y eso aumentará el tiempo que tarda la aplicación en contestar.

¿Qué es mejor? Pues haber, depende de varios factores que hacen complicado dar una respuesta a priori:

* Recursos disponibles en el servidor
* Velocidad del servidor web y del servidor de bases de datos
* Cantidad de información a cachear
* Forma en la que se va a usar la aplicación
* Cantidad de usuarios que debe soportar
* ...

Por eso te digo que es mejor ir adaptando la aplicación según las necesidades. Tomar el camino incorrecto solo por adelantarte a los acontecimientos te puede hacer perder tiempo y dinero de una forma muy sencilla.

Una forma de probar las prestaciones del servidor es crear una aplicación cliente que sea capaz de ejecutar una serie de peticiones que simulen un uso real (lo suyo sería tener varios casos de uso y que la aplicación eligiese uno al azar) y lanzar instancias paralelas de la aplicación para medir los tiempos de respuesta (puedes simular 4.000 usuarios simultáneos con pocos recursos).

Cita:
Iniciado por moro666 Ver Mensaje
P.D.: Soy algo novatillo en estos temas, podrías darme mas información sobre eso que has comentado del "profiler"?
Si tiras por Linux, tienes valgrind, que es una herramienta muy recomendable, además de gratuita (también las hay de pago y para Windows, esto solo intenta ser un ejemplo).

¿Qué cosas puedes hacer con esta herramienta?

* Detectar lagunas de memoria
* Depurar código
* Detectar en qué se consume el tiempo de ejecución del programa

Los profiler son herramientas muy recomendadas en las fases de producción y desarrollo, así que te recomiendo acostumbrarte a su uso.

Un saludo

Etiquetas: mysql, servidor, sockets
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 09:40.