Einrichten des Speichermangel-Killers in Linux für PostgreSQL

Einrichten des Speichermangel-Killers in Linux für PostgreSQL

Wenn in Linux Der Datenbankserver wurde unerwartet beendet, und die Ursache muss ermittelt werden. Dafür kann es mehrere Gründe geben. Zum Beispiel: SIGSEGV – Fehler aufgrund eines Fehlers im Backend-Server. Aber das ist selten. Meistens geht Ihnen einfach der Speicherplatz oder der Arbeitsspeicher aus. Wenn Ihnen der Speicherplatz ausgeht, gibt es nur einen Ausweg: Geben Sie Speicherplatz frei und starten Sie die Datenbank neu.

Out-of-Memory-Killer

Wann Server oder dem Prozess geht der Speicherplatz aus. Linux Der Out-of-Memory-Killer bietet zwei Lösungen: das gesamte System zum Absturz bringen oder den Prozess (die Anwendung) beenden, der/die den Speicher belegt. Es ist natürlich besser, den Prozess zu beenden und so einen Systemabsturz zu verhindern. Kurz gesagt: Der Out-of-Memory-Killer ist ein Prozess, der eine Anwendung beendet, um den Kernel vor einem Absturz zu bewahren. Er opfert die Anwendung, um das Betriebssystem am Laufen zu halten. Zunächst erklären wir die Funktionsweise von OOM und wie man es kontrollieren kann. Anschließend betrachten wir, wie der OOM-Killer entscheidet, welche Anwendungen beendet werden.

Eine der Hauptaufgaben Linux — Speicher wird Prozessen erst dann zugewiesen, wenn diese ihn anfordern. Normalerweise fordert ein Prozess oder eine Anwendung Speicher vom Betriebssystem an, nutzt ihn aber nicht vollständig. Würde das Betriebssystem jedem, der Speicher anfordert, Speicher zuweisen, ohne ihn tatsächlich zu verwenden, würde das System schnell an seine Speichergrenzen stoßen und abstürzen. Um dies zu verhindern, reserviert das Betriebssystem Speicher für einen Prozess, weist ihn aber nicht direkt zu. Speicher wird erst dann zugewiesen, wenn ein Prozess ihn tatsächlich nutzen möchte. Manchmal verfügt das Betriebssystem nicht über freien Speicher, weist aber dennoch einem Prozess Speicher zu. Benötigt der Prozess diesen, weist das Betriebssystem ihn – sofern möglich – zu. Der Nachteil besteht darin, dass das Betriebssystem manchmal Speicher reserviert, aber zum benötigten Zeitpunkt kein freier Speicher vorhanden ist, was zu einem Systemabsturz führt. In diesem Szenario spielt der OutOfMemoryError (OOM) eine entscheidende Rolle, indem er Prozesse beendet, um einen Kernel-Panic zu verhindern. Wird der PostgreSQL-Prozess zwangsweise beendet, erscheint die folgende Meldung im Protokoll:

Out of Memory: Killed process 12345 (postgres).

Wenn im System nur noch wenig Arbeitsspeicher vorhanden ist und dieser nicht freigegeben werden kann, wird die Funktion aufgerufen out_of_memory. Zu diesem Zeitpunkt muss sie nur noch eines tun: einen oder mehrere Prozesse abschließen. Sollte OOM-Killer den Prozess sofort beenden oder kann er warten? Wenn out_of_memory aufgerufen wird, liegt dies offensichtlich daran, dass auf einen E/A-Vorgang oder eine Auslagerung auf die Festplatte gewartet wird. Daher muss der OOM-Killer zunächst Prüfungen durchführen und auf dieser Grundlage entscheiden, dass der Prozess beendet werden muss. Wenn alle unten aufgeführten Prüfungen positiv ausfallen, bricht OOM den Vorgang ab.

Prozessauswahl

Wenn der Speicher erschöpft ist, wird die Funktion aufgerufen out_of_memory(). Es hat eine Funktion select_bad_process(), der von der Funktion eine Auswertung erhält badness(). Der „schlimmste“ Prozess wird ins Visier genommen. Funktion badness() wählt einen Prozess nach bestimmten Regeln aus.

  1. Der Kernel benötigt für sich selbst etwas Mindestspeicher.
  2. Sie müssen viel Speicher freigeben.
  3. Es besteht keine Notwendigkeit, Prozesse zu beenden, die wenig Speicher verbrauchen.
  4. Es müssen Mindestprozesse abgeschlossen werden.
  5. Komplexe Algorithmen, die die Abschlusschancen derjenigen Prozesse erhöhen, die der Benutzer selbst abschließen möchte.

Nachdem alle diese Prüfungen abgeschlossen sind, prüft OOM die Punktzahl (oom_score). OOM weist zu oom_score jeden Prozess und multipliziert diesen Wert dann mit der Speichermenge. Prozesse mit größeren Werten fallen eher dem OOM-Killer zum Opfer. Prozesse, die dem Root-Benutzer zugeordnet sind, haben eine niedrigere Bewertung und müssen mit geringerer Wahrscheinlichkeit beendet werden.

postgres=# SELECT pg_backend_pid();
pg_backend_pid 
----------------
    3813
(1 row)

Die Postgres-Prozess-ID ist 3813, daher ist es in einer anderen Shell möglich, den Score mithilfe dieses Kernel-Parameters abzurufen oom_score:

vagrant@vagrant:~$ sudo cat /proc/3813/oom_score
2

Wenn Sie nicht möchten, dass OOM-Killer den Prozess überhaupt abbricht, gibt es eine weitere Kernel-Option: oom_score_adj. Fügen Sie einen großen negativen Wert hinzu, um die Wahrscheinlichkeit zu verringern, dass ein von Ihnen geschätzter Prozess abgeschlossen wird.

sudo echo -100 > /proc/3813/oom_score_adj

Um einen Wert festzulegen oom_score_adj, legen Sie OOMScoreAdjust im Serviceblock fest:

[Service]
OOMScoreAdjust=-1000

Oder verwenden oomprotect in einer Mannschaft rcctl.

rcctl set <i>servicename</i> oomprotect -1000

Beendigung eines Prozesses erzwingen

Wenn bereits ein oder mehrere Prozesse ausgewählt sind, ruft OOM-Killer die Funktion auf oom_kill_task(). Diese Funktion sendet ein Beendigungssignal an den Prozess. Bei Speichermangel oom_kill() Ruft diese Funktion auf, um ein SIGKILL-Signal an den Prozess zu senden. Eine Meldung wird in das Kernel-Protokoll geschrieben.

Out of Memory: Killed process [pid] [name].

So steuern Sie OOM-Killer

В Linux Sie können den OOM-Killer aktivieren oder deaktivieren (wobei Letzteres nicht empfohlen wird). Verwenden Sie dazu den Parameter. vm.oom-kill. Um OOM-Killer zur Laufzeit zu aktivieren, führen Sie den Befehl aus sysctl.

sudo -s sysctl -w vm.oom-kill = 1

Um OOM-Killer zu deaktivieren, geben Sie im selben Befehl den Wert 0 an:

sudo -s sysctl -w vm.oom-kill = 0

Das Ergebnis dieses Befehls wird nicht für immer gespeichert, sondern nur bis zum ersten Neustart. Wenn Sie mehr Persistenz benötigen, fügen Sie diese Zeile zur Datei hinzu /etc/sysctl.conf:

echo vm.oom-kill = 1 >>/etc/sysctl.conf

Eine andere Möglichkeit zum Aktivieren und Deaktivieren besteht darin, eine Variable zu schreiben panic_on_oom. Der Wert kann jederzeit eingecheckt werden /proc.

$ cat /proc/sys/vm/panic_on_oom
0

Wenn Sie den Wert auf 0 setzen, kommt es nicht zu einer Kernel-Panik, wenn der Speicher knapp wird.

$ echo 0 > /proc/sys/vm/panic_on_oom

Wenn Sie den Wert auf 1 setzen, kommt es zu einer Kernel-Panik, wenn der Speicher knapp wird.

echo 1 > /proc/sys/vm/panic_on_oom

Der OOM-Killer kann, wie bereits erwähnt, ein- und ausgeschaltet werden. Linux Es kann mehr Speicher für Prozesse reservieren, als verfügbar ist, diesen aber nicht tatsächlich zuweisen, und dieses Verhalten wird durch einen Kernelparameter gesteuert. LinuxDie Variable ist dafür verantwortlich. vm.overcommit_memory.

Sie können dafür folgende Werte angeben:

0: Der Kernel selbst entscheidet, ob zu viel Speicher reserviert wird. Dies ist in den meisten Versionen der Standardwert. Linux.
1: Der Kernel reserviert immer zusätzlichen Speicher. Dies ist riskant, da der Speicher möglicherweise knapp wird, da die Prozesse ihn höchstwahrscheinlich eines Tages benötigen werden.
2: Der Kernel reserviert nicht mehr Speicher als im Parameter angegeben overcommit_ratio.

Mit diesem Parameter geben Sie den Prozentsatz des Speichers an, der überreserviert werden darf. Wenn kein Platz dafür vorhanden ist, wird kein Speicher zugewiesen und die Reservierung wird verweigert. Dies ist die sicherste für PostgreSQL empfohlene Option. OOM-Killer wird von einem weiteren Element beeinflusst – der Austauschfähigkeit, die durch die Variable gesteuert wird cat /proc/sys/vm/swappiness. Diese Werte teilen dem Kernel mit, wie er mit Paging umgehen soll. Je höher der Wert, desto unwahrscheinlicher ist es, dass OOM den Prozess beendet. Aufgrund von I/O-Vorgängen hat dies jedoch negative Auswirkungen auf die Datenbank. Und umgekehrt – je niedriger der Wert, desto höher ist die Wahrscheinlichkeit eines OOM-Killer-Eingriffs, aber auch die Datenbankleistung ist höher. Der Standardwert ist 60, aber wenn die gesamte Datenbank in den Speicher passt, ist es besser, den Wert auf 1 zu setzen.

Ergebnisse

Lassen Sie sich vom „Killer“ in OOM-Killer nicht einschüchtern. In diesem Fall wird der Mörder der Retter Ihres Systems sein. Es „tötet“ die schlimmsten Prozesse und bewahrt das System vor einem Absturz. Um zu vermeiden, dass OOM-Killer zum Beenden von PostgreSQL verwendet werden muss, setzen Sie auf vm.overcommit_memory Wert 2. Dies garantiert nicht, dass OOM-Killer nicht eingreifen muss, verringert aber die Wahrscheinlichkeit, dass der PostgreSQL-Prozess zum Beenden gezwungen wird.

Source: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz und VPS-VDS-Servern 🔥 Kaufen Sie zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster