2017-02-28 2 views
4

Ich habe zwei Redis-Server auf dem gleichen Rechner ausgeführt. Das Protokoll der zweiten Datei hat mehrere Instanzen mit Mitteilungen wie diese:Kann nicht im Hintergrund speichern (Redis-Server)

[50818] 19 Feb 06:41:05.007 * 10 changes in 300 seconds. Saving... 
[50818] 19 Feb 06:41:05.007 # Can't save in background: fork: Cannot allocate memory 

Im Gegensatz dazu wird die Log-Dateien des ersten enthalten nur erfolgreich DB speichert. Wenn ich nicht mehr in der Lage wäre, würden beide ähnliche Logs haben. Es verwirrt mich, dass nur einer dieses Problem hat, der andere nicht. Irgendwelche Leads?

Außerdem führte mich Forschung zu this blog post, die behauptet, dass das Problem verbessert werden kann, wenn ich sysctl vm.overcommit_memory=1 auf der Kommandozeile tun. Es gibt keine Erklärung dafür, wie das hilft. Kann jemand erklären, was hier im Zusammenhang mit Redis passiert?

+4

Mögliches Duplikat von [redis bgsave ist fehlgeschlagen, da fork Speicher nicht zuordnen kann] (http://stackoverflow.com/questions/11752544/redis-bgsave-failed-because-fork-cannot-allocate-memory) – kennytm

Antwort

14

Wie Per Redis FAQs:

Hintergrund Einsparung ist mit einem fork() Fehler unter Linux Fehler, auch wenn ich viel freier RAM haben!

Kurze Antwort: echo 1 > /proc/sys/vm/overcommit_memory :)

Und nun die lang:

Redis Hintergrund Speicher Schema auf der Copy-on-Write-Semantik Gabel in modernen Betriebssystemen beruht: Redis Gabeln (erstellt ein Kind Prozess), das ist eine exakte Kopie des Elternteils. Der untergeordnete Prozess sichert die Datenbank auf Platte und beendet schließlich. Theoretisch sollte das Kind als viel Speicher verwenden, da das Elternteil eine Kopie ist, aber dank der Copy-on-Write-Semantik, die von den meisten modernen Betriebssystemen implementiert wird, teilen sich der Eltern- und Kindprozess die gemeinsamen Speicherseiten. Eine Seite wird nur dann dupliziert, wenn sie sich im Child oder im Parent ändert. Da sich theoretisch alle Seiten ändern können, während der Kind Prozess speichert, kann Linux im Voraus nicht sagen, wie viel Speicher das Kind braucht, also wenn die overcommit_memory Einstellung auf 0 gesetzt ist fork wird fehlschlagen, es sei denn es gibt so viel frei RAM wie erforderlich, um wirklich alle übergeordneten Speicherseiten zu duplizieren, mit dem Ergebnis, dass, wenn Sie einen Redis Datensatz von 3 GB und nur 2 GB freien Speicher haben, wird es fehlschlagen. Einstellung overcommit_memory zu 1 sagt Linux zu entspannen und führen die Gabel in einer optimistischen Allokation Mode, und das ist in der Tat was Sie für Redis wollen.

Eine gute Quelle zu verstehen, wie Linux Virtual Memory Arbeit und andere Alternativen für overcommit_memory und overcommit_ratio diese Klassiker von Red Hat Magazine ist "Virtual Memory verstehen". Vorsicht, Dieser Artikel hatte 1 und 2 Konfigurationswerte für overcommit_memory umgekehrt: die verfügbaren Werte finden Sie in der proc(5) man-Seite für die richtige Bedeutung von .

Verwandte Themen