sql >> Databáze >  >> NoSQL >> Redis

redis bgsave se nezdařilo, protože fork nemůže alokovat paměť

Konkrétněji z Redis FAQ

Schéma ukládání na pozadí Redis se v moderních operačních systémech opírá o sémantiku typu fork typu copy-on-write:Redis forks (vytváří podřízený proces), který je přesnou kopií rodiče. Podřízený proces vypíše DB na disk a nakonec se ukončí. Teoreticky by dítě mělo využívat tolik paměti, kolik jeho rodič je kopie, ale ve skutečnosti díky sémantice kopírování při zápisu implementované většinou moderních operačních systémů budou nadřazený a podřízený proces sdílet společné paměťové stránky. Stránka bude duplikována pouze tehdy, když se změní v podřízeném nebo nadřazeném prvku. Protože se teoreticky všechny stránky mohou během ukládání podřízeného procesu změnit, Linux nemůže předem říct, kolik paměti dítě zabere, takže pokud je nastavení overcommit_memory nastaveno na nulu, rozvětvení selže, pokud není tolik volné paměti RAM jako vyžaduje skutečně duplikovat všechny stránky rodičovské paměti, takže pokud máte datovou sadu Redis o velikosti 3 GB a pouze 2 GB volné paměti, selže.

Nastavení overcommit_memory na 1 říká, že se Linux uvolní a provede fork optimističtějším způsobem alokace, a to je skutečně to, co od Redis chcete.

Redis nepotřebuje k zápisu na disk tolik paměti, kolik si OS myslí, že potřebuje, takže fork může preventivně selhat.



  1. Plánování a správa schémat v MongoDB (i když je bez schémat)

  2. Dynamické atributy s Rails a Mongoid

  3. Blokovat přístup ke klíči Redis (ServiceStack)

  4. Sdružení MongoDB Many-to-Many