Voltar ao Diminua Blog

Artigo

Otimizando o Desempenho do Servidor: Um Guia Prático para Gerenciar o Limite de Arquivos Abertos no Ubuntu 22.04

Maximize a capacidade do seu servidor e evite erros comuns de 'too many open files' através da configuração correta no Ubuntu 22.04.

Otimizando o Desempenho do Servidor: Um Guia Prático para Gerenciar o Limite de Arquivos Abertos no Ubuntu 22.04

Introdução: O Que São Arquivos Abertos e Por Que Limitar?

Em sistemas operacionais como o Linux, tudo é tratado como um arquivo. Isso inclui não apenas documentos de texto ou imagens, mas também sockets de rede, dispositivos de hardware e até mesmo processos em execução. Cada um desses 'arquivos' consome recursos do sistema, e o sistema operacional impõe um limite ao número de arquivos que um processo ou um usuário pode ter abertos simultaneamente. Esse limite é conhecido como 'ulimit' ou 'file descriptor limit'.

Quando uma aplicação, especialmente um servidor web ou um banco de dados, experimenta um tráfego intenso, ela pode precisar abrir um grande número de conexões e arquivos. Se o limite de arquivos abertos for muito baixo, a aplicação pode começar a falhar com erros como 'too many open files'. Isso pode levar à indisponibilidade do serviço e à perda de dados. Por outro lado, um limite excessivamente alto, sem a devida consideração pelos recursos do sistema, pode levar à instabilidade geral do servidor. Portanto, é crucial encontrar um equilíbrio e configurar esses limites de forma adequada.

Identificando o Problema: Detectando o Erro 'Too Many Open Files'

O primeiro passo para resolver um problema é identificá-lo. O erro mais comum associado a limites de arquivos abertos é 'too many open files'. Esse erro pode aparecer nos logs da aplicação ou no log de erros do sistema (/var/log/syslog ou /var/log/messages).

Para verificar o número atual de arquivos abertos por um processo específico, você pode usar o seguinte comando:

sudo lsof -p  | wc -l

Substitua <PID_DO_PROCESSO> pelo ID do processo que você está investigando. O comando lsof (list open files) lista todos os arquivos abertos por um processo, e wc -l conta o número de linhas (ou seja, arquivos abertos).

Para verificar o limite de arquivos abertos para o seu usuário atual, você pode usar o comando ulimit:

ulimit -n

Este comando exibirá o limite 'soft' de arquivos abertos. O limite 'hard' é o máximo que pode ser definido para o limite 'soft'.

Entendendo os Limites: Soft vs. Hard Limits

No Linux, os limites de recursos (como o número de arquivos abertos) são divididos em dois tipos:

  • Limite Soft (Soft Limit): É o limite que o sistema operacional impõe a um processo. Um processo pode aumentar seu limite 'soft' até o limite 'hard' sem privilégios de root.
  • Limite Hard (Hard Limit): É o limite máximo que pode ser definido para um limite 'soft'. Apenas o usuário root pode aumentar o limite 'hard'.

Esses limites podem ser definidos globalmente para o sistema, para grupos de usuários ou para usuários individuais, geralmente através de arquivos de configuração do PAM (Pluggable Authentication Modules).

Configurando Limites de Arquivos Abertos no Ubuntu 22.04 (Temporariamente)

Você pode ajustar o limite de arquivos abertos para a sessão atual do terminal usando o comando ulimit. Lembre-se que esta alteração é temporária e será perdida quando você fechar o terminal.

Para aumentar o limite 'soft' (por exemplo, para 65536 arquivos abertos):

ulimit -n 65536

Para verificar se a alteração foi aplicada:

ulimit -n

Se você precisar aumentar o limite 'hard', você precisará de privilégios de root:

sudo ulimit -Hn 65536

Aviso de Segurança: Aumentar limites de forma irresponsável pode consumir excessivos recursos do sistema e torná-lo instável. Sempre ajuste os limites com base nas necessidades reais da sua aplicação e nos recursos disponíveis no seu servidor.

Configurando Limites de Arquivos Abertos no Ubuntu 22.04 (Permanentemente)

Para que as alterações sejam permanentes e aplicadas na inicialização do sistema, você precisa editar o arquivo de configuração do PAM. No Ubuntu, o arquivo relevante é geralmente /etc/security/limits.conf.

Abra o arquivo com um editor de texto como nano ou vim com privilégios de root:

sudo nano /etc/security/limits.conf

Adicione as seguintes linhas ao final do arquivo. Elas definem o limite 'soft' e 'hard' para 65536 para todos os usuários (representados por *). Você pode substituir * por um nome de usuário específico se desejar aplicar as regras apenas a ele.

*	soft	nofile	65536
*	hard	nofile	65536

Para aplicar as configurações, você precisará reiniciar o serviço relevante ou, em muitos casos, fazer logout e login novamente. Para garantir que a configuração seja aplicada corretamente a todos os serviços que iniciam com o sistema, uma reinicialização completa do servidor pode ser necessária.

Importante: Em sistemas mais recentes que utilizam systemd, as configurações de limites podem ser gerenciadas também através de arquivos de configuração de serviço específicos. Por exemplo, para um serviço chamado meu-servico.service, você criaria um arquivo /etc/systemd/system/meu-servico.service.d/limits.conf com o seguinte conteúdo:

[Service]
LimitNOFILE=65536

Após criar ou modificar esses arquivos, é necessário recarregar a configuração do systemd e reiniciar o serviço:

sudo systemctl daemon-reload
sudo systemctl restart meu-servico.service

A abordagem com limits.conf é mais genérica, enquanto a configuração via systemd oferece um controle mais granular por serviço.

Otimizando o Desempenho de Aplicações Específicas

Ajustar o limite de arquivos abertos é um passo importante, mas o desempenho de aplicações como servidores web também depende de outras configurações. Por exemplo, para o Nginx, além de aumentar o worker_connections no arquivo de configuração principal (geralmente /etc/nginx/nginx.conf), você também pode precisar ajustar o worker_rlimit_nofile dentro da diretiva events:

events {
    worker_connections 4096; # Ajuste conforme necessário
    worker_rlimit_nofile 65536; # Deve ser igual ou maior que worker_connections
}

Certifique-se de que o valor de worker_rlimit_nofile seja igual ou superior ao valor de worker_connections. Após fazer essas alterações, lembre-se de recarregar ou reiniciar o Nginx:

sudo systemctl reload nginx

Para aplicações que utilizam sockets de rede intensivamente, o ajuste do net.core.somaxconn no sysctl.conf também pode ser benéfico:

sudo sysctl -w net.core.somaxconn=65535

E para tornar essa configuração persistente, adicione a linha ao arquivo /etc/sysctl.conf:

net.core.somaxconn = 65535

Após editar sysctl.conf, aplique as alterações com:

sudo sysctl -p

Conclusão: Manutenção Proativa para Servidores Estáveis

Gerenciar o limite de arquivos abertos é uma tarefa de manutenção essencial para garantir a estabilidade e o desempenho de servidores Linux, especialmente aqueles que hospedam aplicações com alta demanda de conexões. Ao entender os limites 'soft' e 'hard', identificar corretamente os erros e aplicar as configurações permanentes através de /etc/security/limits.conf ou configurações específicas do systemd, você pode prevenir falhas comuns e otimizar o uso dos recursos do seu servidor.

Lembre-se sempre de testar suas configurações em um ambiente de homologação antes de aplicá-las em produção e de monitorar o comportamento do sistema após as alterações. Uma abordagem proativa na gestão desses limites contribui significativamente para a confiabilidade dos seus serviços online.

Foto de panumas nikhomkhai no Pexels.