Sobre squid e descritores de arquivos e seus limites
Outro dia tive um problema onde o arquivo de log do cache do squid ( cache.log ) estava apresentando a seguinte mensangem.
“WARNING! Your cache is running out of filedescriptors”
O.o logo pensei bom é só aumentar o número de descritores de arquivos que o squid precisa. Certo blza tratei de procurar sobre e encontrei um ótimo link [1] falando sobre o assunto, mas antes de falar sobre a solução uma breve abordagem sobre descritor de arquivos.
“De forma geral, um descritor de arquivo é um índice para um registro de uma estrutura de dados do núcleo que contém detalhes de todos os arquivos abertos. Em POSIX tal estrutura de dado é chamada tabela do descritor de arquivo, e cada processo possui sua própria tabela. Uma aplicação passa o descritor de arquivo para o núcleo através duma chamada de sistema, e o kernel acessa o arquivo representando a aplicação, baseado no descritor. A aplicação não pode manipular a tabela do descritor de arquivo diretamente.” – Wikipedia sobre Descritor de arquivos
Nas minhas palavras X) , índice(endereço) dos arquivos abertos por um processo. Somente para constar o termo refente em ambientes windows é handle.
Pronto consiente sobre isto, agora vamos analizar os motivos pelo qual um programa como o squid pode estourar este limite.
1 – Como o squid pode atender várias requisições de autenticação, várias requisições de sockets dos N usuarios isto pode acarretar e um grande número de abertura de descritores de arquivos. Vejamos por exemplo uma página como a do terra, essa tem muitas imagens, cada imagem de cada link é aberto um descritor de arquivo para guardar o cache da informação ou mesmo obter as informações.
Mas como posso pegar informações sobre as configurações de utilização dos descritores de arquivos do squid?
R: squidclient, assim como não só dados sobre os descritores de arquivos
Exemplo:
squidclient mgr:info | grep -A 8 "File descriptor usage for squid"
* Mostrará os dados sobre os descritores de arquivos do seu squid
File descriptor usage for squid:
Maximum number of file descriptors: 1024
Largest file desc currently in use: 14
Number of file desc currently in use: 11
Files queued for open: 0
Available number of file descriptors: 1013
Reserved number of file descriptors: 100
Store Disk files open: 0
IO loop method: epoll
A linha “Maximum number of file descriptors” mostra o número máximo de descritores utilizado pelo squid, este valor é setado pela entrada max_filedesc no arquivo de configuração do squid.conf ou no momento da compilação do squid com o parametro –with-maxfd. Caso a entrada no squid.conf não esteja setada ela captura esta configuração do sistema ulimit da máquina. Normalmente esta configuração é 1024. Para obter use o seguinte comando:
ulimit -n
Para alterar o limite de arquivos abertos por um processo no seu ambeinte linux use o seguinte comando.
ulimit -n 4096
Para que isto se torne fixo altere o seu arquivo de configuração de limites que geralmente fica em /etc/security/limits.conf adicionando a seguinte linha.
* - nofile 4096
( Obs: configurações do PAM podem sobreescrever as configurações do limits.conf então caso tenha problemas de uma checada nele também )
Agora restart o seu squid.
service squid restart
/etc/init.d/squid restart
squid -k reconfigure
( como quiser ou seu sistema suportar )
( Em caso do debian que tem o costume de ficar alterando os arquivos padrões e pacotes você também deve alterar em /etc/defaults/squid a variável SQUID_MAXFD para o número requisitado )
Daí seguido disto vamos ver o resultado
Em ambiente freebsd para altera na sessão corrente
sysctl kern.maxfilesperproc=4096
sysctl kern.maxfiles=65535
Para manter as configurações altere o /etc/sysctl.conf adicionado as entradas:
echo 'kern.maxfilesperproc=4096' >> /etc/sysctl.conf
echo 'kern.maxfiles=65535' >> /etc/sysctl.conf
Observações interessantes:
“max_filedescriptors
can now be set runtime. Was previously hardcoded at build time and further limited by ulimit” – Notas do ultimo release estável do squid 2.7 sobre max_filedescriptors [4].
Para listar mais dados sobre os descritores de arquivos utilizado pelo squid use:
squidclient mgr:filedescriptors
Referência:
[1] - http://www.cyberciti.biz/faq/squid-proxy-server-running-out-filedescriptors/
[2] - http://en.wikipedia.org/wiki/File_descriptor
[3] - http://pt.wikipedia.org/wiki/Descritor_de_arquivo
[4] - http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9-RELEASENOTES.html
[5] - http://www.cyberciti.biz/faq/squid-increase-file-descriptors-limits-under-freebsd/ ( alteração para ambiente Freebsd )
Como sempre, com excelentes dicas, parabéns Marco!
ps.: Desenho legao o do polvo =P
Diego Damasceno
01/09/2010 at 12:04