PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perdite di memoria sul server postgresql dopo l'aggiornamento a Rails 4

Non so cosa sia meglio:rispondi alla mia domanda o aggiornala... quindi scelgo di rispondere. Per favore fatemi sapere se è meglio aggiornare

Scopriamo finalmente il problema. Dalla versione 3.1, Rails ha aggiunto istruzioni preparate su semplice richiesta come User.find(id). La versione 4.0 ha aggiunto istruzioni preparate alle richieste sulle associazioni (has_many, appartiene_a, ha_uno). Ad esempio il codice seguente:

class User
  has_many :adresses
end
user.addresses

genera richiesta

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

Il problema è che Rails aggiunge solo variabili di istruzione preparate per chiavi esterne (qui user_id). Se utilizzi una richiesta sql personalizzata come

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

non aggiungerà una variabile alle istruzioni preparate per move_at. Quindi genera una dichiarazione preparata ogni volta che viene chiamata la richiesta. Rails gestisce le istruzioni preparate con un pool di dimensioni massime 1000.

Tuttavia, le istruzioni preparate da Postgresql non vengono condivise attraverso la connessione, quindi in una o due ore ogni connessione ha 1000 istruzioni preparate. Alcuni di loro sono molto grandi. Ciò porta a un consumo di memoria molto elevato sul server postgreqsl.