PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fuites de mémoire sur le serveur postgresql après la mise à niveau vers Rails 4

Je ne sais pas ce qui est mieux :répondre à ma question ou la mettre à jour... alors je choisis de répondre. Veuillez me faire savoir s'il est préférable de mettre à jour

Nous découvrons enfin le problème. Depuis la version 3.1, Rails a ajouté des instructions préparées sur simple demande comme User.find(id). Version 4.0, ajout d'instructions préparées aux requêtes sur les associations (has_many, exists_to, has_one).Par exemple le code suivant :

class User
  has_many :adresses
end
user.addresses

générer une requête

SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1  [["user_id", 1]]

Le problème est que Rails n'ajoute que des variables d'instruction préparées pour les clés étrangères (ici user_id). Si vous utilisez une requête sql personnalisée comme

user.addresses.where("moved_at < ?", Time.now - 3.month) 

il n'ajoutera pas de variable aux instructions préparées pour move_at. Ainsi, il génère des instructions préparées à chaque fois que la requête est appelée. Les rails gèrent les instructions préparées avec un pool de taille maximale 1000.

Cependant, les instructions préparées postgresql ne sont pas partagées entre les connexions, donc en une ou deux heures, chaque connexion a 1000 instructions préparées. Certains d'entre eux sont très grands. Cela a conduit à une consommation de mémoire très élevée sur le serveur postgreqsl.