Estamos experimentando algunos desafíos de escalamiento graves para nuestro motor de búsqueda inteligente/agregador. Nuestra base de datos contiene alrededor de 200k objetos. Desde perfiles y newrelic parece que la mayoría de nuestros problemas pueden provenir de la base de datos. Estamos utilizando la base de datos dedicada más pequeña que ofrece Heroku (Ronin).¿Se necesita experiencia en el rendimiento de la base de datos de Heroku?
Hemos estado investigando la indexación y el almacenamiento en caché. Hasta ahora logramos resolver nuestros problemas reduciendo las llamadas a la base de datos y el almacenamiento en caché del contenido de forma inteligente, pero ahora incluso esto parece llegar a su fin. Constantemente nos preguntamos si nuestro código/configuración es lo suficientemente bueno o si simplemente no estamos usando suficiente "hardware".
Sospechamos que la solución de base de datos que compramos en Heroku puede estar funcionando de manera insuficiente. Por ejemplo, solo haciendo un conteo simple (sin uniones, sin nada) en los artículos de 200k toma alrededor de 250ms. Esto parece un tiempo largo, aunque postgres es conocido por su mal rendimiento en los conteos?
También hemos empezado a usar las búsquedas de geolocalización basadas en la latitud/longitud. Ambas columnas son flotantes indexados. Hacer un cálculo de distancia implica matemática bastante complicada, pero estamos usando la muy recomendada geocoder
gema que se sospecha que ejecuta muy consultas optimizadas. Incluso el geocodificador tarda entre 4 y 10 segundos en realizar una búsqueda en, digamos, 40,000 objetos, devolviendo solo un límite de los primeros 10. Suena de nuevo como mucho tiempo, y todas las personas con experiencia que consultamos dicen que suena muy extraño, de nuevo insinuando el rendimiento de la base de datos.
Así que, básicamente, nos preguntamos: ¿Qué podemos esperar de la base de datos? ¿Podría haber un problema? ¿Y qué podemos esperar si decidimos actualizar?
Una pregunta adicional que tengo es: Leo here que podemos mejorar el rendimiento al cargar toda la base de datos en la memoria. ¿Se supone que debemos configurar esto y, si es así, cómo?
ACTUALIZACIÓN SOBRE LA ÚLTIMA PREGUNTA: tengo esto desde el pueblo votos en apoyo Heroku:
"Lo que esto significa es tener suficiente memoria (una lo suficientemente grande dedicada base de datos) para almacenar el calor conjunto de datos en la memoria. Esto no es algo que tiene que hacer manualmente, Postgres se configura automáticamente utilizar todos memoria disponible en nuestras bases de datos dedicados.
me tomó un vistazo a su base de datos y parece que eres actualmente usando aproximadamente 1.25 GB de RAM, por lo que aún no ha maximizado su uso de memoria ".
ACTUALIZACIÓN SOBRE LAS números y figuras
Bueno por lo que ahora que he tenido tiempo para mirar en los números y las figuras, y voy a tratar de contestar las siguientes preguntas de la siguiente manera:
- En primer lugar, el db consta de alrededor de 29 tablas con muchas relaciones. Pero en realidad, la mayoría de las consultas se realizan en una sola tabla (se unen algunos recursos adicionales para proporcionar toda la información necesaria para las vistas).
- La tabla tiene 130 columnas.
- Actualmente contiene alrededor de 200k registros, pero solo 70k están activos, por lo tanto, todos los índices se realizan como índices parciales en este "estado".
- Todas las columnas que buscamos están indexadas correctamente y ninguna es de tipo texto, y muchas son solo booleanas.
Las respuestas a las preguntas:
- Hmm el rendimiento de referencia que es un poco difícil de decir, que tienen tan muchas selecciona diferentes. El tiempo que toma varía típicamente de 90ms a 250ms seleccionando un límite de 20 filas. Tenemos MUCHOS conteos en la misma mesa, todos varían de 250ms a 800ms.
- Hmm, eso es difícil de decir porque no lo intentarán.
- Tenemos alrededor de 8-10 usuarios/clientes ejecutando solicitudes al mismo tiempo.
- Nuestra carga de consulta: En los informes de base de datos nueva de reliquias que dice esto acerca de las últimas 24 horas:
throughput: 9.0 cpm, total time: 0.234 s, avg time: 25.9 ms
- Sí se han examinado los planes de consulta de nuestras consultas de larga duración. Las consultas de recuento son especialmente lenta, a menudo más de 500 ms para una bastante simple recuento de los 70k registros realizado en columnas indizadas con un resultado alrededor de 300
he creado un par de aplicaciones en Heroku, utilizando la misma configuración exacta y el código como mi aplicación de producción, que terminó siendo lento como el infierno sin razón aparente. Comenzaría simple y consideraría que podría estar en una mala máquina. – iwasrobbed
Entonces, ¿qué hosting está utilizando en su lugar? ¿Y tienes algún comentario directamente sobre el rendimiento del postgres db? –
¿También está ejecutando el sistema en un entorno de ensayo? Si es así, ¿funciona a la misma velocidad lenta? Podría valer la pena comparar un escenario y un entorno de producción que sean idénticos entre sí para comprobar, por ejemplo, si es el código o el host el problema. – Pete