Comenzamos a investigar nuestra base de datos, ya que es el componente menos escalable de nuestra infraestructura. Revisé la tabla pg_stat_statements de nuestra base de datos Postgresql con la siguiente consulta:
SELECT userid, calls, total_time, rows, 100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent, query FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
Cada vez, la misma consulta es la primera en la lista:
16386 | 21564 | 4077324.749363 | 1423094 | 99.9960264252721535 | SELECT DISTINCT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" LEFT OUTER JOIN "auth_user_groups" ON ("auth_user"."id" = "auth_user_groups"."user_id") LEFT OUTER JOIN "auth_group" ON ("auth_user_groups"."group_id" = "auth_group"."id") LEFT OUTER JOIN "auth_group_permissions" ON ("auth_group"."id" = "auth_group_permissions"."group_id") LEFT OUTER JOIN "auth_user_user_permissions" ON ("auth_user"."id" = "auth_user_user_permissions"."user_id") WHERE ("auth_group_permissions"."permission_id" = $1 OR "auth_user_user_permissions"."permission_id" = $2)
Esto suena como una verificación de permisos y, según tengo entendido, se almacena en caché en el nivel de solicitud. Me pregunto si alguien hizo un paquete para almacenarlos en caché en Memcached, por ejemplo, o si encontró una solución para reducir la cantidad de solicitudes realizadas para verificar esos permisos.
Revisé todos los índices y parecen correctos. La solicitud es un poco lenta, principalmente porque tenemos muchos permisos, pero aún así, la cantidad de llamadas es una locura.