MAL - Memória Auxiliar do Lutieri

segunda-feira, setembro 03, 2007

Lentidão no SQUID em FreeBSD

Pra quem quer acompanhar o sofrimento de um pobre admin unix acesse:

http://www.fug.com.br/historico/html/freebsd/2007-08/threads.html#00809

Acho que foi uma das threads mais longas da lista. Mas juro. Eu não queria.

Fui inventar de migrar o firewall e proxy que estão(avam) rodando com Debian para FreeBSD. Que vamos combinar: é muito melhor e mais fácil de usar. Isso mesmo. Eu sempre ouvi que o FreeBSD é casca grossa. Que tudo era difícil. Que difícil o que.. Em menos de um mês, bem folgado, fazendo outras coisas ao mesmo tempo, migrei o meu firewall de iptables para PF, migrei o serviço de DNS, HTTP, NTP, Nagios e migrei também o Squid. E é aí que começa meu problema.

Ouvi dizer por aí, que o squid tem problemas de I/O pra rodar no FreeBSD. Bom.. meu problema foi que quando fiz a migração dos clientes para esse proxy novo, no FreeBSD, após ter uns 45/50 usuários fazendo uso do mesmo, isso significa 10 minutos depois de mudar o IP do registro PROXY no servidor DSN, O acesso a internet ficava lentíssimo e cada vez piorava mais.

Aprendi que quando se instala um sistema operacional novo, antes de mais nada deve-se testar o hardware pra ter certeza de que tudo está em perfeita ordem. Do contrário, vai acontecer que você vai descobrir um problema como lentidão no squid e pode ser disco, memória, kernel, placa de rede, enfim... temos várias opções.

Então o melhor é testar todo o hardware antes de começar acusar um pobre software.

Faça algumas coisas como:
  • Teste a memória RAM;
  • Use ferramentas de benchmark;
  • Teste escrita/leitura de discos;
  • Teste a controladora SCSI;
  • Teste as placas de rede;
  • Obtenha velocidades máximas dos itens citados acima;
  • Instale ferramentas como o munin para acompanhar o status do servidor.

Eu descobri que isso deve ser feito de uma maneira não muito agradável. Comecei threads acusando o squid de lentidão quando lá pelas tantas descobri que podiam ser meus discos. Sorte que não foi.. senão eu ia passar vergonha...

Cheguei a entrar na lista de discussão freebsd-scsi para questionar sobre a velocidade da minha controladora. Sendo que eu achava que era baixa demais e me mostraram que era decente a velocidade que eu estava obtendo.

Portanto antes de sair por aí botando a culpa em alguma coisa, seja software, hardware, firmware tenha certeza disso. As pessoas vão se basear no que você fala para poder te ajudar.

Voltando ao problema:

A migração do squid, rodando em linux, para o novo, rodando em FreeBSD, era feita apenas mudando o IP de um registro DNS. Baixava o TTL do regsitro para 1 minuto e alterava-o para apontar para o servidor novo. No momento que batia a lentidão eu trocava o IP, de novo, para apontar para o servidor velho(linux).

Esse registro está configurado em todos os navegadores da empresa através de um GPO do windows.

É uma forma de fazer migração que eu considero bastante vantajosa. Uma vez que, se não funcionar de primeira é muito simples voltar para a situação anterior.

Acredite: troquei várias vezes esse IP. hehe

Iniciei meus testes recompilando o kernel. Fiz um artigo contendo os arquivos necessários e que devem ser modificados e os passos para compilar o kernel. Link aqui.

Bom alterei o cache do squid para diskd entre outras mudancas no squid.conf que coloco no final do artigo.

Bom as mudancas que fiz foram tantas e de uma vez soh que nao consegui saber exatamente o que solucionou o problema. Mas vamos analizando:

As alterações foram as seguintes:

  • Compilei o squid2.6stable14 com o gcc42
  • Utilizei os seguintes parâmetros para a compilação: make -DNO_KERBEROS SQUID_CONFIGURE_ARGS="--enable-dlmalloc --enable-async-io --with-pthreads --with-aio --enable-ntlm-fail-open" SQUID_LANGUAGES="English Portuguese" install
  • Atualizei o samba da versão que estava na versão 3.0.23 para a mais recente no ports a 3.0.25a. Com isso foi atualizado o /usr/local/bin/ntlm_auth também.

Apesar de ter feito todas as alterações, acima citadas, de uma só vez, acredito que a solução se deu por causa dos parâmetros passados ao squid.

Já havia compilado sem esses parâmetros com o gcc 4.2 e o problema persistia.
Já havia compilado com a opção --enable-async-io e também não havia resolvido.

Acredito ter sido por causa dos parâmetros restates: --enable-dlmalloc --with-pthreads --with-aio --enable-ntlm-fail-open

Na lista squid-users me indicaram setar a opção half_closed_clients para off. Também com ela sozinha não havia solucionado a lentidão.

Ou ainda a solução se deu por atualizar o samba. Uma vez que eu uso autenticação NTLM contra um AD W2k3.

Por fim, quando eu não usava autenticação o proxy funcionava extremamente bem, porém se eu ativasse apenas uma ACL se quer, que envolvesse autenticação, a lentidão dava sua cara.

Infelizmente testar opção por opção para descobrir qual foi a que solucionou o problema se torna inviável. Levando em consideração que esse proxy já deveria estar em produção há mais tempo não posso testar agora.

Lembre-se: São nessas horas de dificuldades que devemos honrar o saco no meio das pernas. Não desista, por mais difícil que esteja sendo. É apenas uma monte de linhas de código. Apenas instruções lógicas empilhadas. Tem que funcionar e ponto.

E vencendo as dificuldades você se sente melhor e se o seu chefe acompanhou seu sofrimento e viu que você venceu e dá crédito a você. E isso é bom... hehe






squid.conf:

grep -v "^#" /usr/local/etc/squid/squid.conf | grep -v "^\ " | grep -v ^$
http_port 1xxx.xxx.xxx.xxx:3128
http_port 127.0.0.1:3128
icp_port 0
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_mem 600 MB
maximum_object_size 64 MB
minimum_object_size 0 KB
maximum_object_size_in_memory 2560 Kb
cache_replacement_policy heap LFUDA
memory_replacement_policy heap GDSF
cache_dir diskd /cache/1 4520 16 256 Q1=128 Q2=100
cache_dir diskd /cache/2 4520 16 256 Q1=128 Q2=100
access_log /usr/local/squid/logs/access.log squid
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp -d 2
auth_param ntlm children 60
auth_param ntlm keep_alive on
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Proxy server
auth_param basic credentialsttl 2 hours
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 900 # Sinercom
acl CONNECT method CONNECT
acl password proxy_auth REQUIRED
acl redelocal src 192.168.0.0/16
acl redelocal src 172.16.0.0/16
acl sitesemcache url_regex -i "/usr/local/etc/squid/semcache.txt"
always_direct allow sitesemcache redelocal
no_cache deny sitesemcache
acl paginapare dstdomain squidweb.xyz.gov.br
acl usuarioslib proxy_auth -i "/usr/local/etc/squid/usuarioslib.txt"
acl usuariosrestritos proxy_auth -i "/usr/local/etc/squid/usuariosrestritos.txt"
acl usuarios_chineses proxy_auth -i "/usr/local/etc/squid/chineses_msn.txt"
acl msn_chineses url_regex -i gateway.messenger.
acl msn_chineses url_regex -i login.live.com
acl msn_chineses url_regex -i gateway.dll
acl msn_chineses url_regex -i msn.com
acl bloqueados url_regex -i "/usr/local/etc/squid/bloqueados.txt"
acl liberados url_regex -i "/usr/local/etc/squid/liberados.txt"
acl servidores src "/usr/local/etc/squid/servidores.txt"
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
deny_info http://malware.hiperlinks.com.br/denied.shtml malwares
http_access allow servidores
http_access allow liberados password
http_access allow usuarioslib
http_access deny usuariosrestritos
http_access deny bloqueados all
deny_info http://squidweb.xyz.gov.br bloqueados
http_access allow localhost
http_access allow redelocal password
http_access deny all
http_reply_access allow all
icp_access allow all
visible_hostname proxy
logfile_rotate 5
forwarded_for off
header_access From deny all
header_access Server deny all
header_access Link deny all
error_directory /usr/local/etc/squid/errors/Portuguese
coredump_dir /usr/local/squid/cache

Marcadores: ,

0 Comentários:

Postar um comentário

<< Home



Chat with Lutieri G. B.

Subscribe in a reader