Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

redis bgsave falhou porque fork não pode alocar memória


Mais especificamente, no FAQ do Redis

O esquema de salvamento em segundo plano do Redis depende da semântica copy-on-write do fork em sistemas operacionais modernos:Forks do Redis (cria um processo filho) que é uma cópia exata do pai. O processo filho despeja o banco de dados no disco e finalmente sai. Em teoria, o filho deve usar tanta memória quanto o pai sendo uma cópia, mas, na verdade, graças à semântica copy-on-write implementada pela maioria dos sistemas operacionais modernos, o processo pai e filho compartilhará as páginas de memória comuns. Uma página será duplicada somente quando for alterada no filho ou no pai. Como, em teoria, todas as páginas podem mudar enquanto o processo filho está salvando, o Linux não pode dizer com antecedência quanta memória o filho levará, portanto, se a configuração overcommit_memory estiver definida como zero, o fork falhará, a menos que haja tanta RAM livre quanto necessário para duplicar realmente todas as páginas de memória pai, com o resultado de que, se você tiver um conjunto de dados Redis de 3 GB e apenas 2 GB de memória livre, ele falhará.

Definir overcommit_memory como 1 diz que o Linux relaxa e executa o fork de uma maneira de alocação mais otimista, e isso é realmente o que você deseja para o Redis.

O Redis não precisa de tanta memória quanto o sistema operacional pensa que precisa para gravar no disco, portanto, pode falhar preventivamente no fork.