Erro: muitos arquivos abertos | AEM
O artigo aborda o problema em que os arquivos de log contêm o erro 'Muitos arquivos', em virtude do qual o Adobe Experience Manager (AEM) não responde.
Descrição description
Ambiente
Adobe Experience Manager
Problema/Sintomas
Os arquivos de log contêm o erro 'Muitos arquivos' e o Adobe Experience Manager (AEM) não responde.
Resolução resolution
A solução para esse problema é:
- Descobrir o que está fazendo com que o limite de arquivos abertos seja atingido
- Aumentar o limite ou corrigir os bugs do aplicativo.
A Descobrir quais arquivos ou soquetes foram deixados abertos
Nota: Os limites de arquivos abertos se aplicam ao total de arquivos abertos, barras e soquetes combinados, não apenas arquivos.
Na plataforma Linux, o comando List of Open File (lsof
) pode ser usado para depurar quais recursos são mantidos abertos pelo processo.
Este é um exemplo de script para coletar informações úteis de saída do lsof
:
#!/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
Exemplo de saída:
$> ./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 a saída do arquivo lsof-sorted-counts-*.txt
gerado. Ele mostra quais arquivos ou soquetes estão abertos no momento pelo processo.
Se você encontrar soquetes ou arquivos abertos listados que ainda não devem estar abertos, é provável que seja devido a um bug do aplicativo. Atualize o código do aplicativo para fechar arquivos e soquetes após usá-los.
Uma causa comum de soquetes abertos persistentes é o código personalizado que faz o serviço da Web. Em muitos casos, bibliotecas como Apache Commons HttpClient
são usadas, mas as conexões nunca são fechadas pelos desenvolvedores. Consulte este artigo para obter detalhes sobre o Apache Commons HttpClient
.
B Aumentar o limite da sessão de shell
Verifique o limite do usuário para o máximo de arquivos abertos e execute o seguinte como o mesmo usuário com o qual o processo AEM é executado:
ulimit -Sn ulimit -Hn
Ao usar o script de inicialização padrão do AEM/CQ, faça o seguinte para aumentar o limite:
- Abra o
crx-quickstart/bin/start
para edição - Adicione a variável
CQ_MAX_OPEN_FILES
na parte superior do script:CQ_MAX_OPEN_FILES=8192 export CQ_MAX_OPEN_FILES
Se você vir o erro -bash: ulimit: open files: cannot modify limit: Operation not permitted
ao iniciar o AEM, a configuração acima não funciona.
Em vez disso, é necessário aumentar o limite no /etc/security/limits.conf
. Consulte as informações abaixo para obter detalhes sobre como reconfigurar o limite de usuários.
Se você estiver usando um servidor de aplicativos de terceiros, como JBoss ou Websphere, siga as seções abaixo e verifique a documentação do fornecedor.
Observação: se nenhuma das configurações neste artigo resolver o problema, veja quais arquivos estão abertos usando o comando lsof -p
(-p é a ID do processo problemático). Pode ser que seu aplicativo esteja deixando os manipuladores de arquivo abertos. Se você perceber que os manipuladores estão sendo mantidos principalmente pelo AEM e não pelo seu aplicativo, entre em contato com o suporte.
C Aumentar os limites do usuário
Para alterar o número máximo de arquivos abertos para usuários não raiz, altere o file/etc/security/limits.conf
. É possível definir o limite por usuário:
crx_process_username soft nofile 8092
crx_process_username hard nofile 20000
Observação: essa configuração não terá efeito até a próxima vez que o usuário fizer logon.
D Aumentar o limite do sistema
Às vezes, o limite do usuário é alto o suficiente, mas o próprio sistema atingiu o número máximo de arquivos. Execute o seguinte como su/root user:
- Verifique a configuração máxima de arquivos abertos no sistema operacional (se estiver abaixo de 20.000, faz sentido aumentar essa configuração):
cat /proc/sys/fs/file-max
- Adicione esta linha a /etc/sysctl.conf para aumentar o valor máximo do arquivo aberto do sistema:
fs.file-max = 300000
- Execute este comando:
sysctl -p
- Verifique se o novo valor é exibido ao executar este comando:
cat /proc/sys/fs/file-max
Observação: essa configuração não terá efeito até a próxima vez que o usuário fizer logon.
Causa
A causa é uma das duas possibilidades:
- O aplicativo não está fechando recursos como arquivos ou soquetes após usá-los.
- Ou o aplicativo requer mais arquivos abertos do que o permitido pelo processo.
Informações adicionais
Esse erro ocorre quando o sistema ou usuário está usando o número máximo de manipuladores de arquivos.
Você também pode fazer o seguinte:
- Faça logon em http://localhost:4502/crxde como usuário administrador.
- Navegar até
/libs/granite/monitoring/config
- Clique com o botão direito do mouse e exclua cada subnó de
/libs/granite/monitoring/config
- Clique em Salvar tudo. Reinicie o CQ.