Redis
 sql >> Base de données >  >> NoSQL >> Redis

redis bgsave a échoué car fork ne peut pas allouer de mémoire

Plus précisément, à partir de la FAQ Redis

Le schéma d'enregistrement en arrière-plan de Redis repose sur la sémantique de copie sur écriture de fork dans les systèmes d'exploitation modernes :Redis forks (crée un processus enfant) qui est une copie exacte du parent. Le processus enfant vide la base de données sur le disque et se termine finalement. En théorie, l'enfant devrait utiliser autant de mémoire que le parent étant une copie, mais en réalité, grâce à la sémantique de copie sur écriture implémentée par la plupart des systèmes d'exploitation modernes, les processus parent et enfant partageront les pages de mémoire communes. Une page ne sera dupliquée que lorsqu'elle change dans l'enfant ou dans le parent. Étant donné qu'en théorie, toutes les pages peuvent changer pendant l'enregistrement du processus enfant, Linux ne peut pas dire à l'avance combien de mémoire l'enfant prendra, donc si le paramètre overcommit_memory est défini sur zéro, la fourche échouera à moins qu'il n'y ait autant de RAM libre que nécessaire pour vraiment dupliquer toutes les pages de mémoire parent, avec pour résultat que si vous avez un jeu de données Redis de 3 Go et seulement 2 Go de mémoire libre, cela échouera.

Définir overcommit_memory sur 1 indique que Linux se détend et effectue le fork de manière plus optimiste, et c'est en effet ce que vous voulez pour Redis.

Redis n'a pas besoin d'autant de mémoire que le système d'exploitation pense qu'il en a besoin pour écrire sur le disque, il peut donc faire échouer le fork de manière préventive.