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:
- Ta reda på vad som gör att gränsen för antalet öppna filer nås
- Ö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:
- Öppna
crx-quickstart/bin/start
för redigering - 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:
- 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
- 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
- Kör det här kommandot:
sysctl -p
- 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:
- Logga in på http://localhost:4502/crxde som administratör.
- Bläddra till
/libs/granite/monitoring/config
- Högerklicka och ta bort varje undernod till
/libs/granite/monitoring/config
- Klicka på Spara alla. Starta om CQ.