Redis
 sql >> Database >  >> NoSQL >> Redis

redis bgsave non riuscito perché fork Impossibile allocare memoria

Più precisamente, dalle FAQ Redis

Lo schema di salvataggio in background di Redis si basa sulla semantica copy-on-write di fork nei sistemi operativi moderni:Redis fork (crea un processo figlio) che è una copia esatta del genitore. Il processo figlio scarica il DB su disco e alla fine esce. In teoria il bambino dovrebbe usare tanta memoria quanta il genitore è una copia, ma in realtà grazie alla semantica copy-on-write implementata dalla maggior parte dei moderni sistemi operativi il processo genitore e figlio condivideranno le pagine di memoria comuni. Una pagina verrà duplicata solo quando cambia nel figlio o nel genitore. Poiché in teoria tutte le pagine possono cambiare durante il salvataggio del processo figlio, Linux non può dire in anticipo quanta memoria occuperà il figlio, quindi se l'impostazione overcommit_memory è impostata su zero fork fallirà a meno che non ci sia tanta RAM libera quanto necessario per duplicare davvero tutte le pagine di memoria principali, con il risultato che se hai un set di dati Redis di 3 GB e solo 2 GB di memoria libera fallirà.

L'impostazione di overcommit_memory su 1 dice a Linux di rilassarsi ed eseguire il fork in un modo di allocazione più ottimista, e questo è davvero ciò che vuoi per Redis.

Redis non ha bisogno della quantità di memoria necessaria per la scrittura su disco del sistema operativo, quindi potrebbe fallire preventivamente il fork.