manolo-rocks / django-manolo

Manolo buscador de visitantes a las entidades del Estado peruano
http://manolo.rocks
Other
2 stars 0 forks source link

Tunear la BD #136

Closed ni-jvaldivia closed 3 years ago

ni-jvaldivia commented 3 years ago

Por ahora tenemos la db dentro de un container en docker (puede encontrarse en docker-compose) y se deployea todos los containers en un servidor con 4GB de RAM (creo que @aniversarioperu tiene la info completa de los specs del server).

Hay queries que terminan matando al server: image

y terminan retornando un Timeout al usuario.

Mi propuesta seria revisar si es que la bd se esta consumiendo todo (que asumo que es lo mas probable), tunearlo (configuracion basica de tuneo se puede sacar de pgTune(https://pgtune.leopard.in.ua/#/)) y separarlo a otro servidor si es que se come todo de la aplicacion cosa que podemos tener mejor performance al hacer las requests + scrappear.

aniversarioperu commented 3 years ago

creo que @manubellido tenia algunas ideas de como hacer esto?

manubellido commented 3 years ago

@ni-jvaldivia sabes qué tipos de requests o algún ejemplo? Independientemente recomiendo integrar sentry (https://sentry.io/for/django/). Tienen un tutorial muy bueno acerca de con integrar con django: https://docs.sentry.io/platforms/python/guides/django/.

manubellido commented 3 years ago

Otra cosa a considerar es: cómo están funcionando las búsquedas actualmente? Ya se está usando el nuevo campo de full text search?

josevaldiviaromero commented 3 years ago

Si @manubellido es una buena idea tener sentry, eso nos va a ayudar a tener idea de los errores en prod. Voy a crear un issue tambien para eso.

Con respecto a la request, no recuerdo exactamente la request (y por eso deberiamos tener sentry jaja). Pero he estado probando en mi local environment: http://localhost:8000/search/?q=pcm esta query demora artito:

image

Por lo que veo las busquedas se hacen con el campo de full text search.

lisbeth-s4 commented 3 years ago

A mí me parece que la demora es en python no en la base de datos. Ver imagen adjunta. Es posible que la demora se origine durante el procesamiento de 93k registros durante la paginación.

Screen Shot 2020-11-28 at 10 20 20
lisbeth-s4 commented 3 years ago

Bueno, otras queries también demoran en el SQL. Curioso que demore a pesar que la query (motivo) esté dentro del full search index.

Screen Shot 2020-11-28 at 10 27 12
manubellido commented 3 years ago

Excelente @lisbeth-s4! Ese es un gran hint. Ya sé lo que pasa, aunque no tengo pruebas, tampoco tengo dudas:

Cada búsqueda es ordenada por date: https://github.com/manolo-rocks/django-manolo/blob/master/visitors/views.py#L88

y esto es super lento si es que no se tiene un index en ese campo como es el caso: https://github.com/manolo-rocks/django-manolo/blob/master/visitors/models.py#L89 (lo que sucede es que la función tratará de ordenar los 93k registros antes de darte la página indicada.

Si añadimos el index, db_index = True en ese campo, las cosas mejorarán.

josevaldiviaromero commented 3 years ago

Claro, tiene mucho sentido...

aniversarioperu commented 3 years ago

sigue lenta la pagina cuando la busqueda devuelve demasiados resultados a pesar del indice en date

Estuve probando y parece que es la paginacion la que consume bastantes recursos y demora en ejecutarse. Supongo que no es de mucha utilidad retornar al usuario paginacion de 59k paginas ya que no podra examinar todas y seguro que hara busquedas mas especificas que devuelvan menos paginas y seran las que al final llegue a examinar.

Creo que sera necesario limitar el numero de paginas que se devuelvan al usuario.

manubellido commented 3 years ago

el problema estaba en el paginator al momento de calcular el número de resultados. En el PR #143 explico un poco más.