Fel: För många öppna filer | AEM

Artikeln åtgärdar ett problem där loggfilerna innehåller felet För många filer, vilket innebär att Adobe Experience Manager (AEM) inte svarar.

Beskrivning description

Miljö

Adobe Experience Manager

Problem/symtom

Loggfilerna innehåller felet För många filer och Adobe Experience Manager (AEM) svarar inte.

Upplösning resolution

Lösningen på problemet är:

  1. Ta reda på vad som gör att gränsen för antalet öppna filer nås
  2. Öka gränsen eller åtgärda programfelen.

A. Söka efter vilka filer eller socketar som lämnas öppna

Obs! Gränserna för öppna filer gäller för det totala antalet öppna filer, rör och socketar, inte bara för filer.

På Linux-plattformen kan kommandot Lista över öppna filer (lsof) användas för att felsöka vilka resurser som är öppna av processen.

Här följer ett exempelskript för att samla in användbara lsof-utdata:

#!/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

Exempelutdata:

$> ./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

Inspect utdata för den genererade lsof-sorted-counts-*.txt-filen.  Den visar vilka filer eller socketar som för närvarande är öppna av processen.

Om du hittar öppna socketar eller filer i listan som inte ska vara öppna beror det troligtvis på ett programfel. Uppdatera programkoden så att filer och socketar stängs när du har använt dem.

En vanlig orsak till att öppna socketar behålls är anpassad kod som gör webbtjänsten. I många fall används bibliotek som Apache Commons HttpClient, men anslutningar stängs aldrig av utvecklarna. Mer information om Apache Commons HttpClient finns i den här artikeln.

B. Öka gränsvärdet för gränssnittssessionen

Kontrollera användarens gräns för maximalt antal öppna filer och kör sedan följande som samma användare som AEM processen körs som:

ulimit -Sn ulimit -Hn

När du använder standardstartskriptet för AEM/CQ ökar du gränsen genom att göra följande:

  1. Öppna crx-quickstart/bin/start för redigering
  2. Lägg till variabeln CQ_MAX_OPEN_FILES högst upp i skriptet: CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES

Om felet -bash: ulimit: open files: cannot modify limit: Operation not permitted visas när du startar AEM fungerar inte konfigurationen ovan.

Du måste i stället öka gränsen i /etc/security/limits.conf. Nedan finns mer information om hur du konfigurerar om användargränsen.

Om du använder en tredjepartsprogramserver som JBoss eller Websphere, följer du avsnitten nedan och kontrollerar med leverantörens dokumentation.

Obs! Om ingen av konfigurationerna i den här artikeln löser problemet kan du se vilka filer som är öppna med kommandot lsof -p (-p är process-ID:t för den problematiska processen). Det kan bero på att programmet lämnar filhandtagen öppna. Om du ser att handtagen i huvudsak hålls av AEM och inte av ditt program kontaktar du support.

C. Öka användarens gränser

Ändra file/etc/security/limits.conf om du vill ändra det maximala antalet öppna filer för icke-rotanvändare. Du kan ange gränsen per användare:

crx_process_username soft nofile 8092

crx_process_username hard nofile 20000

Obs! Den här konfigurationen börjar inte gälla förrän nästa gång användaren loggar in.

D. Öka systemgränsen

Ibland är användargränsen tillräckligt hög, men systemet har nått det maximala antalet filer. Kör följande som su/root-användare:

  1. Kontrollera inställningen för högsta antal öppna filer i operativsystemet (om den är under 20000 bör du öka den här inställningen).
    cat /proc/sys/fs/file-max
  2. Lägg till den här raden i /etc/sysctl.conf för att öka systemets högsta tillåtna värde för öppna filer:
    fs.file-max = 300000
  3. Kör det här kommandot:
    sysctl -p
  4. Kontrollera att det nya värdet visas när du kör det här kommandot:
    cat /proc/sys/fs/file-max

Obs! Den här konfigurationen börjar inte gälla förrän nästa gång användaren loggar in.

Orsak

Orsaken är en av två möjligheter:

  • Programmet stänger inte resurser som filer eller socketar när de har använts.
  • Eller så kräver programmet fler öppna filer än vad processen tillåter.

Ytterligare information

Det här felet inträffar när systemet eller användaren använder det maximala antalet filhanterare.

Du kan också göra följande:

  1. Logga in på http://localhost:4502/crxde som administratör.
  2. Bläddra till /libs/granite/monitoring/config
  3. Högerklicka och ta bort varje undernod till /libs/granite/monitoring/config
  4. Klicka på Spara alla. Starta om CQ.
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f