Lösung für den ES-Speicherüberlauf beim Starten von Docker

Lösung für den ES-Speicherüberlauf beim Starten von Docker

Fügen Sie die Datei jvm.options zur Elasticsearch-Konfiguration hinzu, ändern Sie die Stapelgröße (der Standardwert beträgt 2 GB) und starten Sie es direkt, um sicherzustellen, dass die Konfigurationsdatei zuvor zugeordnet wurde.

-Xms5g
-Xmx5g

Die vollständige Datei jvm.options sieht wie folgt aus:

## JVM-Konfiguration
################################################################
## WICHTIG: JVM-Heapgröße
################################################################
##
## Sie sollten immer den minimalen und maximalen JVM-Heap festlegen
## size auf den gleichen Wert. Um beispielsweise
## den Heap auf 4 GB, setzen Sie:
##
## -Xms4g
## -Xmx4g
##
## Siehe https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## für weitere Informationen
##
################################################################
# Xms stellt die anfängliche Größe des gesamten Heap-Speichers dar
# Xmx stellt die maximale Größe des gesamten Heap-Speichers dar
-Xms5g
-Xmx5g
################################################################
## Experteneinstellungen
################################################################
##
## Alle Einstellungen unterhalb dieses Abschnitts werden berücksichtigt
## Experteneinstellungen. Verändern Sie diese nicht, es sei denn,
## Sie verstehen, was Sie tun
##
################################################################
## GC-Konfiguration
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
## Optimierungen
# von der JVM während der Initialisierung verwendete Pre-Touch-Speicherseiten
-XX:+ImmerPreTouch
## Grundlegend
# Server-VM erzwingen (auf 32-Bit-Client-JVMs entfernen)
-Server
# Stapelgröße explizit festlegen (auf 32-Bit-Client-JVMs auf 320 KB reduzieren)
-Xss1m
# auf Headless eingestellt, nur für den Fall
-Djava.awt.headless=true
# UTF-8-Kodierung standardmäßig sicherstellen (z. B. Dateinamen)
-Dfile.encoding=UTF-8
# verwenden Sie immer unsere bereitgestellte JNA und nicht die System-JNA
-Djna.nosys=true
# Dateiberechtigungen im alten Stil auf JDK9 verwenden
-Djdk.io.permissionsUseCanonicalPath=true
# Flags zum Konfigurieren von Netty
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
## Heap-Dumps
# einen Heap-Dump generieren, wenn eine Zuweisung vom Java-Heap fehlschlägt
# Heap Dumps werden im Arbeitsverzeichnis der JVM erstellt
-XX:+HeapDumpBeiSpeicherfehler
# einen alternativen Pfad für Heap Dumps angeben
# Stellen Sie sicher, dass das Verzeichnis vorhanden ist und über ausreichend Speicherplatz verfügt
#-XX:HeapDumpPath=${heap.dump.path}
## GC-Protokollierung
#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+DruckeGCDatumStempel
#-XX:+KlassenHistogramm drucken
#-XX:+DruckenTenuringDistribution
#-XX:+PrintGCApplicationStoppedTime
# GC-Status mit Zeitstempeln in eine Datei protokollieren
# Stellen Sie sicher, dass das Verzeichnis vorhanden ist
#-Xloggc:${loggc}
# Standardmäßig wird die GC-Protokolldatei nicht rotiert.
# Durch das Entfernen der Kommentarzeichen aus den folgenden Zeilen wird die GC-Protokolldatei
# wird alle 128 MB höchstens 32 Mal rotiert.
#-XX:+UseGCLogFileRotation
#-XX:AnzahlGCLogFiles=32
#-XX:GCLogFileSize=128M
# Elasticsearch 5.0.0 löst bei nicht in Anführungszeichen gesetzten Feldnamen in JSON eine Ausnahme aus.
# Wenn Dokumente bereits in einer früheren Version mit nicht zitierten Feldern indexiert wurden
# von Elasticsearch, einige Vorgänge können Fehler verursachen.
#
# ACHTUNG: Diese Option wird in Elasticsearch 6.0.0 entfernt und wird bereitgestellt
# nur für Migrationszwecke.
#-Delasticsearch.json.allow_unquoted_field_names=true

Ergänzung: Speicherlimit für Docker-Container

Docker-Speicherlimit

docker run -d -i -t -m 256M --memory-swap 512M --name centos2.12 centos /bin/bash

Zeigen Sie das Speicherlimit der Container-Instanz an:

Begrenzen Sie die Containerspeichergröße.

docker run -d -i -t -m 256M --memory-swap 512M --name centos centos /bin/bash

-m, --memory 
# Speicherbegrenzungsgröße, die Einheit kann b, k, M, g sein; das Minimum beträgt 4M
--memory-swap
#Gesamtspeicherlimit + Größe der Swap-Partition --memory-reservation #Reservierte Speichergröße; Mindestspeicher, der vom Container auf dem Host belegt wird;
--oom-kill-deaktivieren
# Out-of-Memory-Speicherüberlauf; Begrenzung des Beendens von Containerprozessen, standardmäßig nicht festgelegt --oom-score-adj
# Die Priorität des Containers, der vom OOM-Killer getötet wird, der Bereich ist [-1000, 1000], der Standardwert ist 0
--memory-swappiness
# Wird verwendet, um das Steuerungsverhalten des virtuellen Speichers des Containers festzulegen. Der Wert ist eine Ganzzahl zwischen 0 und 100 --kernel-memory
Kernspeichergrenze, Minimum ist 4 M.

1. Speicher legt die Containerspeichergröße fest;

--memory-swap ist nicht die Swap-Partition, sondern die Größe von Speicher + Swap;
Die Swap-Partition des Containers Swap = Speicher-Swap - Speicher

2. Die Größe der Docker-Standardcontainer-Swap-Partition entspricht der Speichergröße

Memory-Swap ist nicht festgelegt oder auf 0 gesetzt;
Die Swap-Größe des Containers entspricht der Größe des Speichers.
Maximaler vom Containerprozess genutzter Speicher = Speicher + Swap

3. Speicherauslagerungseinstellungen

Wenn der Speicheraustausch auf -1 gesetzt ist;
Die Containerspeichergröße ist die vom Speicher festgelegte Größe.
Die Größe der Swap-Partition ist die Swap-Größe des Hostcomputers.
Der maximale Speicher, den der Containerprozess verwenden kann = Speicher + Host-Swap-Größe;

4. Speicherüberlauf

--oom-kill-deaktivieren
Begrenzen Sie den Kill-Container-Prozess. (Muss nach der Speicherbegrenzung eingestellt werden.)
docker run -d -i -t -m 256M --oom-kill-disable --name Centos-1 centos /bin/bash

5. Kernelspeicher und Benutzerspeicher

Der Unterschied zwischen Kernelspeicher und Benutzerspeicher besteht darin, dass der Kernelspeicher nicht ausgelagert werden kann.

Durch die fehlende Möglichkeit zum Auslagern können Container durch den zu hohen Speicherverbrauch einige Systemdienste blockieren.

Der Hauptspeicher umfasst:
Seiten stapeln
Plattenseiten
Sockel Speicher Druck
TCP-Speicherdruck

Dieser Speicher kann durch die Festlegung von Kernelspeichergrenzen eingeschränkt werden.

Jeder Prozess verbraucht einige Stapelseiten und durch die Begrenzung des Kernelspeichers können Sie verhindern, dass neue Prozesse erstellt werden, wenn die Kernelspeichernutzung zu hoch wird.

docker run -d -i -t -m 500M --kernel-memory 128M --name Centos-2 centos /bin/bash
Begrenzen Sie den Containerspeicher auf 256 MB; begrenzen Sie den Kernspeicher auf 128 MB.
docker run -d -i -t --kernel-memory 128M --name Centos-3 centos /bin/bash
Der Speicher ist die Größe des Hostspeichers und der Kernspeicher ist auf 128 MB begrenzt

6. Seite zum Recycling des Swappiness-Speichers

Der Kernel des Containers kann einen bestimmten Prozentsatz anonymer Seiten auslagern.

--memory-swappiness wird verwendet, um dieses Verhältnis festzulegen.
--memory-swappiness kann von 0 bis 100 eingestellt werden.
# 0 bedeutet, dass der anonyme Seitenaustausch deaktiviert wird.
# 100 bedeutet, dass alle anonymen Seiten ausgetauscht werden können. Wenn --memory-swappiness nicht angewendet wird, wird der Wert standardmäßig vom übergeordneten Prozess übernommen.
docker run -d -i -t --memory-swappiness=0 --name Centos-4 centos /bin/bash
Wenn Sie --memory-swappiness auf 0 setzen, bleibt der Arbeitssatz des Containers erhalten und die Leistungseinbußen des Swap-Agenten werden vermieden.

Je größer der Swappiness-Wert, desto aktiver wird die Swap-Partition verwendet, und je kleiner der Wert, desto aktiver wird der physische Speicher verwendet. Standardmäßige Auslagerungshäufigkeit = 60

sysctl vm.swappiness = 100 
# Katze /proc/sys/vm/swappiness

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Docker View JVM-Speichernutzung
  • Docker-Speicherüberwachung und Stresstestmethoden
  • Docker View-Prozess, Speicher und Cup-Verbrauch
  • Problem „Nicht genügend Speicher“ und Lösung, wenn Docker Elasticsearch startet
  • So begrenzen Sie den für einen Container in Docker verfügbaren Speicher
  • Docker führt Vorgänge mit dem angegebenen Speicher aus

<<:  Detaillierte Darstellung des MySQL 5.7.33-Installationsprozesses

>>:  CSS3 realisiert das Papierflugzeug aus der Kindheit

Artikel empfehlen

JavaScript-Canvas zum Erzielen von Regentropfeneffekten

In diesem Artikelbeispiel wird der spezifische Co...

So implementieren Sie eine MySQL-Datenbanksicherung in Golang

Hintergrund Navicat ist das beste MySQL-Visualisi...

JavaScript zur Implementierung eines Sprachwarteschlangensystems

Inhaltsverzeichnis einführen Hauptmerkmale Effekt...

CSS3 realisiert Partikelanimationseffekte beim Matching von Königen

Beim Codieren werden Sie feststellen, dass viele ...

Vier Möglichkeiten zum Wechseln von Registerkarten in VUE

Inhaltsverzeichnis 1. Statische Implementierungsm...

TortoiseSvn Little Turtle Installation Neuestes ausführliches Grafik-Tutorial

Bei der Installation von tortoiseGit gab es immer...

Tutorial zur Installation des GreasyFork-JS-Skripts auf dem Mobiltelefon

Inhaltsverzeichnis Vorwort 1. Iceraven-Browser (F...

Kurze Einführung und Verwendung von Table und div

Web-Frontend 1 Studierendenausweis Name Geschlech...

js native Karussell-Plugin-Produktion

In diesem Artikel wird der spezifische Code für d...

Ausführliche Erklärung zu MySQL vom Einstieg bis zum Aufgeben - Installation

Was Sie lernen werden 1. Softwareinstallation und...

Analyse der Prinzipien von MySQL Dirty Page Flush und Shrinking Table Space

MySQL-Dirty-Pages Aufgrund des WAL-Mechanismus er...