Problem

Die Protokolldateien enthalten die Fehlermeldung „Zu viele Dateien“ und CRX reagiert nicht.

Ursache

Die Ursache ist eine von zwei Möglichkeiten:

  • Die Anwendung schließt Ressourcen wie Dateien oder Sockets nicht, nachdem sie verwendet wurden.
  • Oder die Anwendung benötigt mehr geöffnete Dateien als dies vom Prozess zugelassen wird.

Lösung

Die Lösung dieses Problems lautet:

  1. Finden Sie heraus, was dazu führt, dass das Limit für offene Dateien erreicht wird.
  2. Erhöhen Sie das Limit oder beheben Sie die Fehler in der Anwendung.

Finden Sie heraus, welche Dateien oder Sockets noch offen sind.

** Beachten Sie, dass die Beschränkungen für offene Dateien für die Gesamtzahl der offenen Dateien, Pipes und Sockets zusammen gelten, nicht nur für Dateien.

Auf der Linux-Plattform kann man mit dem Befehl lsof debuggen, welche Ressourcen durch den Prozess offen gehalten werden.

Hier ist ein Beispielskript, um nützliche lsof-Ausgaben zu sammeln:

#!/bin/bash
if [ $# -eq 0 ]
  then
    echo "No PID specified"
    echo "Run command with PID, for example:"
    echo "lsof-script.sh 12345"
    exit 2
fi

JAVA_PROCESS_PID=$1

lsof -p $JAVA_PROCESS_PID > lsof-output-$JAVA_PROCESS_PID.txt

echo "Files open by the process:"
cat lsof-output-$JAVA_PROCESS_PID.txt |  wc -l

echo "Generated output file with counts of grouped open files lsof-sorted-counts-$JAVA_PROCESS_PID.txt"
cat lsof-output-$JAVA_PROCESS_PID.txt | awk '{print $9}' | sed -e "s/\(^.*\)\(segmentstore\).*$/\1\2/" |  sed -e "s/\(^.*\)\(repository[/]index\).*$/\1\2/" | sed -e "s/\(^.*\)\(felix[/]bundle\).*$/\1\2/" |  sed -e "s/\(^.*\)\([/]lib\).*$/\1\2/" |  sed -e "s/\(^.*\)\([/]logs\).*$/\1\2/" |  sed -e "s/\(^.*\)\([/]ext\).*$/\1\2/" | sort | uniq -c | sort -rn -k1 > lsof-sorted-counts-$JAVA_PROCESS_PID.txt

echo "Total open files in OS:"
lsof | wc -l

Beispiel-Ausgabe:

$> ./lsof-script.sh 18070
Files open by the process:
    1995
Generated output file with counts of grouped open files: lsof-sorted-counts-18070.txt
Total open files in OS:
   18399

Überprüfen Sie die Ausgabe der generierten Datei lsof-sorted-counts-*.txt.  Sie zeigt an, welche Dateien oder Sockets derzeit vom Prozess offen gehalten werden.

Wenn Sie geöffnete Sockets oder Dateien finden, die noch nicht geöffnet sein sollten, liegt dies wahrscheinlich an einem Anwendungsfehler.  Aktualisieren Sie Ihren Anwendungscode, der Dateien und Sockets nach der Verwendung schließt.

Eine häufige Ursache für zurückbleibende offene Sockets ist benutzerdefinierter Code, der den Webservice herstellt.  In vielen Fällen werden Bibliotheken wie Apache Commons HttpClient verwendet, aber die Verbindungen werden von den Entwicklern nie geschlossen.  In diesem Artikel finden Sie Details zu Apache Commons HttpClient.

Erhöhen Sie das Limit für die Shell-Sitzung.

Überprüfen Sie das Limit des Benutzers für maximal geöffnete Dateien und führen Sie dann das folgende als der gleiche Benutzer aus, unter dem der AEM-Prozess läuft:

ulimit -Sn ulimit -Hn

Beim Verwenden des Standard-Startskripts von AEM/CQ folgende Schritte ausführen, um das Limit zu erhöhen:

  1. crx-quickstart/bin/start zum Bearbeiten öffnen.
  2. Die Variable CQ_MAX_OPEN_FILES am Anfang des Skripts hinzufügen:

    CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES

Wenn Sie den Fehler „-bash: ulimit: open files: cannot modify limit: Operation not permitted“ beim Starten von AEM sehen, funktioniert die obenstehende Konfiguration nicht.

Stattdessen muss das Limit in /etc/security/limits.conf erhöht werden. Nachstehend finden Sie weitere Details darüber, wie das Benutzerlimit neu konfiguriert werden kann.

Wenn Sie einen Anwendungsserver von Drittanbietern wie JBoss oder WebSphere verwenden, befolgen Sie die folgenden Abschnitten und überprüfen Sie die Dokumentation des Anbieters.

Hinweis:

Wenn keine der Konfigurationen in diesem Artikel das Problem löst, sehen Sie mit dem Kommando lsof -p nach, welche Dateien geöffnet sind (-p ist die Prozess-ID des problematischen Prozesses). Es könnte sein, dass Ihre Applikation Datei-Handles offen lässt. Wenn Sie sehen, dass die Handles vorwiegend von AEM und nicht von Ihrer Anwendung gehalten werden, wenden Sie sich an den Support.

Den Benutzergrenzwert erhöhen

Um die maximale Anzahl geöffneter Dateien für Nicht-Root-Benutzer zu ändern, bearbeiten Sie die Datei „/etc/security/limits.conf“. Sie können für jeden Benutzer einen Grenzwert festlegen:

crx_process_username soft nofile 8092

crx_process_username hard nofile 20000

Hinweis:

Diese Konfiguration tritt erst in Kraft, wenn sich der Benutzer das nächste mal anmeldet.

Den Systemgrenzwert erhöhen

Gelegentlich ist der Benutzergrenzwert hoch genug, aber das System selbst hat seine maximale Anzahl von Dateien erreicht. Führen Sie Folgendes als su- / root-Benutzer aus:

  1. Überprüfen Sie die Einstellung für die maximale Anzahl offener Dateien auf dem Betriebssystem (wenn sie unter 20.000 liegt, ist es sinnvoll, diesen Wert zu erhöhen).

    cat /proc/sys/fs/file-max

  2. Fügen Sie diese Zeile zu /etc/sysctl.conf hinzu, um den Wert für die maximale Menge geöffneter Dateien des Systems zu erhöhen:

    fs.file-max = 300000

  3. Führen Sie diesen Befehl aus:

    sysctl -p

  4. Stellen Sie sicher, dass der neue Wert angezeigt wird, wenn Sie diesen Befehl ausführen:

    cat /proc/sys/fs/file-max

Hinweis:

Diese Konfiguration tritt erst in Kraft, wenn sich der Benutzer das nächste mal anmeldet.

Weitere Informationen

Dieser Fehler tritt auf, wenn das System oder der Benutzer seine maximale Anzahl an Dateiverwendungen verwendet.

Herunterladen

Dieses Werk unterliegt den Bedingungen der Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.  Twitter™- und Facebook-Beiträge fallen nicht unter die Bedingungen der Creative Commons-Lizenz.

Rechtliche Hinweise   |   Online-Datenschutzrichtlinie