Behebung der Probleme „Fehler bei zu vielen geöffneten Dateien“ und „Nativer OutOfMemory aufgrund fehlgeschlagener Thread-Erstellung“ in WebSphere Application Server unter Linux

Body

image

Wir erhalten einige Problemdatensätze (PMRs) / Serviceanforderungen (SRs) für native OutOfMemory-Probleme in WebSphere Application Server, und eines der bekanntesten nativen OOM-Probleme tritt insbesondere unter Linux auf, da der Wert ulimit -u (NPROC) nicht ausreicht.
Wir erhalten auch eine gute Anzahl von PMRs für den Fehler „Zu viele offene Dateien“ für WebSphere Application Server unter Linux.
Mit einfacher Fehlerbehebung und Ulimit-Befehlsoptimierung können Sie das Öffnen eines PMR mit IBM Support für diese Probleme leicht vermeiden.

1) Was ist ulimit unter Linux?
Mit dem Befehl ulimit können Sie die Benutzerressourcenbeschränkungen im System steuern, z. B. die Größe der Prozessdaten, den virtuellen Prozessspeicher und die Größe der Prozessdatei, die Anzahl der Prozesse usw.

2) Was passiert, wenn die Einstellungen in diesem Befehl nicht richtig eingerichtet sind?
Verschiedene Probleme treten auf, z. B. nativer OutOfMemory, Fehler bei zu vielen geöffneten Dateien, Dump-Dateien werden nicht vollständig generiert usw.

3) Wie können Sie die aktuellen Ulimit-Einstellungen überprüfen?
Es gibt verschiedene Möglichkeiten, die aktuellen Einstellungen zu überprüfen:

a) Geben Sie an der Eingabeaufforderung
$ ulimit -a
Wir können eine ähnliche Ausgabe wie unten sehen.
core Dateigröße (Blöcke, -c) 0
Daten seg Größe (kbytes, -d) unbegrenzt
scheduling Priorität (-e) 0
Dateigröße (Blöcke, -f) unbegrenzt
pending Signale (-i) 32767
max gesperrt Speicher (kbytes, -l) 32
max Speichergröße (kbytes, -m) unbegrenzt
offene Dateien (- -n) 1024
Pipe-Größe (512 Byte, -p) 8
POSIX-Nachrichtenwarteschlangen (Byte, -q) 819200
Echtzeitpriorität (-r) 0
Stapelgröße (Kbyte, -s) 10240
CPU-Zeit (Sekunden, -t) unbegrenzt
maximale Benutzerprozesse (-u) 50
virtueller Speicher (Kbyte, -v) unbegrenzt
Dateisperren (-x) unbegrenzt
Dies wird angezeigt alle aktuellen Einstellungen, die für die aktuelle Anmeldesitzung festgelegt sind, und standardmäßig weiche Grenzwerte werden angezeigt. Grenzen können weich und hart sein.
Harte Grenzwerte sind die maximale Grenze, die konfiguriert werden kann. Nur der Root-Benutzer kann harte Limits erhöhen, während andere Benutzer sie verringern können. Weiche Limits können von anderen Benutzern festgelegt und geändert werden, aber sie können die harten Limits nicht überschreiten.
Wenn Sie bestimmte Grenzwerte finden möchten, geben Sie
ulimit -Sa
für den aktuellen weichen Grenzwert ein.
ulimit -Ha
für aktuellen harten Grenzwert.

b)Wenn Sie die Prozess-ID (PID) des zu untersuchenden WebSphere Application Servers kennen, können Sie auch die folgende Datei überprüfen.
Location: /proc/<PID>
File:limits
Der Inhalt dieser Datei ähnelt der Ausgabe des Befehls „ulimit -a“.
Diese Datei enthält eine Liste der Ulimit-Parameter und der zugehörigen Werte für die angegebene PID.
c) Wenn Sie die Prozess-ID des Servers kennen, auf dem Sie die aktuellen Ulimit-Einstellungen überprüfen möchten, können Sie einen Javacore erstellen, indem Sie
kill -3 <PID>
Sie können diesen Javacore in einem beliebigen Texteditor (wie NotePad ++, Ultra Edit usw.) öffnen.)
und suchen Sie nach ulimit und Sie gelangen zum Abschnitt ulimit.
Beispiel für Ulimit-Einstellungen aus einem Javacore.
Benutzerlimits (in Bytes mit Ausnahme von NOFILE und NPROC)
————————————————————–
typ soft Limit hard limit
RLIMIT_AS 11788779520 unbegrenzt
RLIMIT_CORE 1024 unbegrenzt
RLIMIT_CPU unbegrenzt unbegrenzt
RLIMIT_DATA unbegrenzt unbegrenzt
RLIMIT_FSIZE unbegrenzt unbegrenzt
RLIMIT_LOCKS unbegrenzt unbegrenzt
RLIMIT_MEMLOCK unbegrenzt unbegrenzt
RLIMIT_NOFILE 18192 18192
RLIMIT_NPROC 79563 79563
RLIMIT_RSS 8874856448 unbegrenzt
RLIMIT_STACK 33554432 unbegrenzt
Wenn Sie die globalen Einstellungen finden möchten, überprüfen Sie die folgende Datei unter Linux.
/etc/Sicherheit/Grenzen.conf.
Alle Änderungen an diesen globalen Konfigurationsgrenzwertdateien sollten von Ihrem Systemadministrator vorgenommen werden.
Weitere Informationen zu den einzelnen Einstellungen im Befehl ulimit und zum Befehl ulimit unter verschiedenen Betriebssystemen finden Sie in dieser Technote: Richtlinien zum Festlegen von Ulimits (WebSphere Application Server)

4) Welche Art von nativem OOM wird aufgrund unzureichender Ulimit-Einstellungen erwartet?
Ein out of memory Dump-Ereignis mit einem „Failed to create a thread“ wird passieren.
Beispiel: Die folgende Nachricht wird in Javacore angezeigt.
„systhrow“ (00040000) Detail „java/ lang/OutOfMemoryError“
„Fehler beim Erstellen eines Threads: retVal -1073741830, errno 12“ received
errno 12 ist ein tatsächliches natives OOM in einem Startthread.
Manchmal wird das Erstellen eines Threads fehlgeschlagen auch in Serverprotokollen wie SystemOut angezeigt.protokoll, SystemErr.protokoll usw., und auch in FFDC-Protokollen und dieser Fehler zeigt an, dass ein nativer OutOfMemory während der Erstellung eines neuen Threads aufgetreten ist.

5) Was ist der Grund für diesen Fehler?
Der Grund dafür ist, dass der aktuelle ulimit -u(NPROC) Wert zu niedrig ist.
Das nproc-Limit zählt normalerweise nur Prozesse auf einem Server, um diese Anzahl zu bestimmen. Linux-Systeme mit WebSphere Application Server sind ein besonderer Fall. Das nproc-Limit unter Linux zählt die Anzahl der Threads in allen Prozessen, die für einen bestimmten Benutzer vorhanden sein können. In den meisten Fällen älterer Linux-Versionen wird dieser Wert standardmäßig auf etwa 2048 festgelegt. Für Red Hat Enterprise Linux (RHEL) 6 wird der Standardwert für nproc auf 1024 gesetzt.
Diese niedrige Standardeinstellung für größere Systeme lässt nicht genügend Threads in allen Prozessen zu.

6) Wie behebe ich dieses Problem?
Die WebSphere Application Server-Unterstützung empfiehlt, bei der Ausführung unter Linux ulimit -u oder nproc auf den Wert 131072 zu setzen, um alle gegabelten Threads innerhalb von Prozessen, die erstellt werden könnten, sicher zu berücksichtigen.
Es kann vorübergehend für die aktuelle Sitzung erhöht werden, indem
ulimit -u 131072
gesetzt wird, wodurch der Wert für Soft limit festgelegt wird.
Um sowohl weiche als auch harte Grenzwerte festzulegen, geben Sie
ulimit -Su 131072 für Soft Limit aus.
ulimit -Hu 131072 für harte Grenze.
Um es global zu setzen, muss der Linux-Systemadministrator
/etc/security/limits bearbeiten.conf
Wir haben diese Technote, die dies erklärt: Unzureichender ulimit -u (NPROC) -Wert trägt zum nativen OutOfMemory bei

7) Was ist mit dem Fehler „Zu viele geöffnete Dateien“?
Dieser Fehler zeigt an, dass alle verfügbaren Dateihandles für den Prozess verwendet wurden (dies schließt auch Sockets ein).
Beispiel: Fehler ähnlich wie unten werden Serverprotokolle angezeigt.
java.io.IOException: Zu viele geöffnete Dateien
prefs W Benutzereinstellungen konnten nicht gesperrt werden. UNIX-Fehlercode 24.

8) Warum tritt dieser Fehler auf?
Dies kann passieren, wenn die aktuelle Anzahl der geöffneten Dateien zu niedrig ist oder wenn dies darauf zurückzuführen ist, dass Dateihandles von einem Teil der Anwendung durchgesickert sind.

9) Wie kann ich das beheben?
Der IBM Support empfiehlt für WebSphere Application Server, der unter Linux ausgeführt wird, den Wert ulimit -n für die Anzahl der geöffneten Dateien als 65536 für Soft- und Hardlimits.
ulimit -Sn 65536
ulimit -Hn 65536

10) Was ist, wenn in der Anwendung ein Dateideskriptorleck vorliegt?
Unter Linux können wir feststellen, ob bestimmte geöffnete Dateien über einen bestimmten Zeitraum wachsen, indem wir die folgenden Daten mit dem Befehl lsof regelmäßig mit der problematischen JVM-Prozess-ID vergleichen.
lsof -p -r > lsof.out
Die Ausgabe liefert Ihnen alle geöffneten Dateien für die angegebene PID. Sie können feststellen, welche Dateien geöffnet werden und welche Dateien im Laufe der Zeit wachsen.
Alternativ können Sie den Inhalt der Dateideskriptoren als Liste symbolischer Links im folgenden Verzeichnis auflisten, wobei Sie PID durch
die Prozess-ID ersetzen. Dies ist besonders nützlich, wenn Sie keinen Zugriff auf den Befehl lsof haben:
ls -al /proc/PID/fd
Verwandte technote: Zu viele geöffnete Dateien Fehlermeldung

11) Gibt es noch etwas zu tun?
Wir haben eine weitere Einstellung, die wir unter Linux mit pid_max einstellen können, was selten ist und nur in großen Umgebungen vorkommt. Wenn Sie keine große Umgebung verwenden, können Sie diesen Schritt überspringen.
Die Einstellung pid_max ist die interne Grenze für die maximale Anzahl eindeutiger Prozesskennungen, die Ihr System unterstützt.
Der Standardwert ist 32.768 und dies ist für die meisten Kunden ausreichend.
In großen Umgebungen mit einer großen Anzahl von Prozessen besteht die Möglichkeit, dass dieses Limit erreicht wird und
native OutOfMemory mit einer ähnlichen Meldung in
Javacore mit Fehler beim Erstellen des Threads errno 11 auftritt.
Beispiel:
Dump-Ereignis „systhrow“ (00040000) Detail „java/ lang/OutOfMemoryError“
„Fehler beim Erstellen eines Threads: retVal -106040066, errno 11“ received
Zum Ermitteln des aktuellen pid_max-Werts unter Linux.
cat /proc/sys/kernel/pid_max
Um es zu erhöhen,geben Sie
sysctl -w kernel .pid_max= <Value>
Manchmal kann der Standardwert 32.768 aufgrund eines Thread-Lecks erreicht werden, was zu nativem OOM führt. In diesem Fall müssen Sie dieses Thread-Pool-Leck beheben, um das native OOM zu beheben.
Verwandte Technotes:
Fehlerbehebung bei Problemen mit nativem Speicher
Mögliche Verwendung von nativem Speicher in WebSphere Application Server-Thread-Pools
Zusammenfassung:
Stellen Sie sicher, dass die folgenden Ulimit-Einstellungen unter Linux vorhanden sind, um Probleme mit „Zu vielen geöffneten Dateien“ und „nativem Speicher“ zu vermeiden, da kein Thread erstellt werden konnte.
Benutzerlimits (in Bytes mit Ausnahme von NOFILE und NPROC)
soft_limit hard_limit
RLIMIT_NOFILE 65536 65536
RLIMIT_NPROC 131072 131072

12) Gibt es noch etwas zu überprüfen?
Der IBM Support empfiehlt die folgenden Werte für alle Ulimit-Einstellungen für WebSphere Application Server unter Linux, einschließlich der Einstellungen, die wir bisher besprochen haben.
Benutzerlimits (in Bytes außer NOFILE und NPROC)
Typ Soft Limit hard Limit
RLIMIT_AS unbegrenzt unbegrenzt
RLIMIT_CORE unbegrenzt unbegrenzt
RLIMIT_CPU unbegrenzt unbegrenzt
RLIMIT_DATA unbegrenzt unbegrenzt
RLIMIT_FSIZE unbegrenzt unbegrenzt
RLIMIT_LOCKS unbegrenzt unbegrenzt
RLIMIT_MEMLOCK 65536 65536
RLIMIT_NOFILE 65536 65536
RLIMIT_NPROC 131072 131072

13) Was kommt als nächstes?
Stellen Sie sicher, dass die oben beschriebenen Einstellungen auf allen WebSphere Application Server-JVMs wie DMGr, NodeAgent und AppServers vorhanden sind, und starten Sie die JVMs neu, wenn die Einstellungen global vorgenommen wurden, oder melden Sie sich ab und wieder mit demselben Benutzer an, wenn die Änderungen vorgenommen wurden in der aktuellen Sitzung (Shell).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.