Erro: Muitos arquivos abertos | AEM

Descrição

Ambiente
Adobe Experience Manager

Problema/Sintomas
Os arquivos de log contêm o erro 'Excesso de arquivos e o Adobe Experience Manager (AEM) não responde.

Resolução

A solução para esse problema é:

  1. Descobrir o que está fazendo com que o limite de arquivos abertos seja atingido
  2. Aumentar o limite ou corrigir os bugs do aplicativo.

A. Descubra quais arquivos ou soquetes são deixados abertos

Observação - os limites de arquivo aberto se aplicam ao total de arquivos abertos, barras e soquetes combinados, não apenas aos arquivos.

Na plataforma Linux, a variável Lista de arquivos abertos (lsof) pode ser usado para depurar quais recursos são mantidos abertos pelo processo.

Este é um exemplo de script para coletar informações úteis lsof output:

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

Saída de exemplo:

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

Inspecione 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 isso 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 o 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. Aumente o limite da sessão do shell

Verifique o limite máximo de arquivos abertos do usuário e execute o seguinte como o mesmo usuário que AEM processo é executado como:

ulimit -Sn ulimit -Hn

Ao usar o script de inicialização padrão do AEM/CQ, faça o seguinte para aumentar o limite:

  1. Abra o crx-quickstart/bin/start para edição
  2. 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 com 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 é o 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. Aumente os limites do usuário

Para alterar o número máximo de arquivos abertos para usuários não raiz, altere a variável 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 usuário su/root:

  1. 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
  2. Adicione esta linha a /etc/sysctl.conf para aumentar o valor máximo do arquivo de abertura do sistema:
    fs.file-max = 300000
  3. Execute este comando:
    sysctl -p
  4. 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 identificadores de arquivos.

Você também pode fazer o seguinte:

  1. Faça logon em http://localhost:4502/crxde como usuário administrador.
  2. Navegue até /libs/granite/monitoring/config
  3. Clique com o botão direito do mouse e exclua cada subnó de /libs/granite/monitoring/config
  4. Clique em Salvar tudo. Reinicie o CQ.

Nesta página