[Cascavel-pm] Gerenciando conexoes

Cristiano Torres listas.perl em gmail.com
Segunda Janeiro 22 16:03:44 PST 2007


Olá Marco, obrigado pela resposta.

Eu até que consegui fazer "mal e porcamente" um script em shell, usando
output de comandos
que conhecia "ps, netstat, etc" , nao é um obra de arte mas conseguia
extrair as inforamaçoes que usei
para saber onde estava o problema.

Mas como as vezes o "load avarage" e cpu do servidor estavam altos, o output
ficava deturpado devido ao delay de resposta.

Vou testar esse seu codigo e agregar alguma coisa que já fiz (em perl
tambem), muitissimo obrigado.

Ah um outro fato que contribui para o caos é que o DBA, responsavel pelo
banco é um grande
sacana que não me ajuda muito. Alias, ha muito tempo o problema já não está
em minhas mãos,
mas como ninguém faz nada ... de qualquer forma é  uma boa oportunidade para
aprender alguma coisa.





Em 21/01/07, Marco A P D'Andrade <mdacwb em gmail.com> escreveu:
>
> Cristiano,
>
> Bem, devidamente explicada sua situação e dificuldades, já com as
> sugestões do Nilson, seu questionamento me chamou a atenção, então
> estou quebrando meu silêncio de férias ;)
>
>
> O que vc precisa será basicamente extraído de aplicativos básicos do
> *nix, e é claro... manipulado para produzir as informações relevantes:
>
> ps -C httpd
> - Lista todos os processos HTTPD (apache) ou outro que porventura seja
> criado com o Kylix, isso vc terá de descobrir!
>
> # ps -C httpd | head
>   PID TTY          TIME CMD
> 9011 ?        00:04:12 httpd
> 21582 ?        00:02:00 httpd
> 11717 ?        00:00:34 httpd
> 1381 ?        00:01:30 httpd
> 8005 ?        00:02:15 httpd
>
>
> lsof -p <pid>
> - Lista todos os filehandles abertos, sejam eles locais ou tcp, sendo
> que lhe interessaria somente as conexões TCP:
>
> # lsof -n -p 13581 | grep TCP
> httpd   13581  web    6u  IPv4 631869262               TCP
> 200.x.y.z:59927->200.x.y.b:mysql (ESTABLISHED)
> httpd   13581  web   20u  IPv4 525847182               TCP *:https
> (LISTEN)
> httpd   13581  web   21u  IPv4 525847183               TCP *:http (LISTEN)
>
> De resto, é fazer o código Perl propriamente...
>
> Segue um esboço não testado...
>
> #!/usr/bin/perl -w
> #
> use strict;
> my ( $pid, @pid, $mysql, $http );
>
>   unless ( open(PS, "ps -C httpd |") ) {
>       print "Falha ao abrir PS: $!\n";
>       exit 1;
>   }
>
>   while ( defined( $_ = <PS> ) ) {
>      ( $pid ) = /^\s+(\d+)\s+/;
>      next unless ( $pid );
>
>      unless ( open(LSOF, "lsof -p $pid | grep TCP") ) {
>            print "Falha ao verificar open files para $pid: $!\n";
>            next;
>      }
>      $http=0; $mysql=0;
>      while ( defined( $_ = <LSOF> ) ) {
>          if ( /:http/ ) {
>             $http=1;
>           } elsif ( /:mysql/ ) {
>             $mysql=1;
>          }
>      }
>      unless ( $mysql && $http ) {
>           push(@pids, $pid);
>       } else {
>           $full++;
>      }
>    }
>
>   if ( @pids ) {
>      printf "Foram identificados %s processos sem acesso simultaneo e
> %s em ambos.\n",
>           scalar(@pids), $full;
>    } else {
>      printf "Foram identificados apenas %s processos, sem acesso a
> banco!\n", $full;
>   }
>
>   exit 0;
>
> #--------------
>
> PS: Observe que utilizei mysql em vez de oracle, mas isto é apenas
> para seguir o meu ambiente... não quiz acessar os servidores com que
> usam banco oracle ... ;)
>
> Outra abordagem, que pode ser mais interessante, seria vc listar todas
> as conexões com seu banco de dados, e a partir disto identificar os
> processos que as mantem:
>
>
> # netstat -na | grep :3306 | grep ESTAB
> >> Lista todas as conexões de rede, isola somente os ips desejados,
> conexões ativas tcp        0      0 200.x:59701        200.y:3306
>    ESTABLISHED
> tcp        0      0 200.x:59471        200.y:3306         ESTABLISHED
> tcp        0      0 200.x:59459        200.y:3306         ESTABLISHED
> tcp        0      0 200.x:59530        200.y:3306         ESTABLISHED
> tcp        0      0 200.x:59574        200.y:3306         ESTABLISHED
> tcp        0      0 200.x:59614        200.y:3306         ESTABLISHED
> tcp        0      0 200.x:60223        200.y:3306         ESTABLISHED
>
> root em webmail1(click21):~# fuser -n tcp 59701
>   >> Verifica qual processo está utlizando a porta TCP localmente
> 59701/tcp:           13709
>
> root em webmail1(click21):~# ps -p 13709
> >> responde QUAL é o processo
>   PID TTY          TIME CMD
> 13709 ?        00:01:12 httpd
>
>
> Bem, creio que já divaguei demais em administração e de menos em Perl,
> mas a ideia é só ajudar né !
>
> PS: sugiro também verificar na linguagem a existencia/uso de pool de
> conexões com o banco, ou o encerramento pelo lado do servidor para
> conexões inativas a partir de X minutos!
>
>
> Sds,
> Marco Antonio
> Rio-PM
>
>
> 2007/1/20, Cristiano Torres <listas.perl em gmail.com>:
> > Caros mestres, bom dia.
> >
> > Uma breve introdução desse humilde aprendiz, e claro uma solicitação de
> > ajuda ou referência.
> >
> > Onde trabalho sou um dos responsáveis pela área de TI e configuração de
> > servidores WEB. Basicamente configuro e
> > monitoro servicos WEB para que a aplicacao desenvolvida pela empresa
> rode
> > sem problemas. Porém recentemente
> > começaram a desenvolver um modulo para apache ( desenvolveram em Kylix
> para
> > versao 1.3.37 do Apache) que
> > recebe as conexoes via http, processa a requisicao, abre conexao com
> oracle
> > e retorna o resultado para o cliente.
> >
> >
> > O que acontece é que esse modulo esta abrindo mais conexoes com o banco
> do
> > que devia, e os malditos
> > desenvolvedores em delphi disseram que a culpa é do servico web.
> >
> > Já mostrei para o pessoal que o apache só gerencia as requisicoes com a
> > porta na qual o processo "escuta" (80),
> > e que as outras conexoes deveriam ser gerenciadas pelo modulo/driver que
>
> > eles utilizam. Fiz isso usando
> > um modulo do CPAN "Apache::Scoreboard" (entao tive uma breve nocao do
> poder
> > do perl)
> >
> >
> > Bom, podem ficar tranquilos que não vim pedir ajuda em kylix ou em
> delphi,
> > meu intuito é elaborar um programa
> > que faça o seguinte, pegue o PID do processo do apache, se esse PID não
> > tiver simultaneamente conexoes abertas
> > na porta 80 e 1521 (porta do banco), que gere uma lista.
> >
> >
> > Nao pretendo corrigir a falha do modulo do desenvolvimento, queria
> aprender
> > como linguagens de
> > programacao mais apropriadas lidam com isso, por isso peço uma
> referencia.
> > Acho que
> > para corrigir isso o ideal seria que trocassem o pessoal do
> desenvolvimento
> >
> >
> > Comprei o Learning Perl, mas ainda estou apanhando um pouco.
> >
> > Se alguem poder dar uam dica para esse pequeno gafanhoto, agradeço.
> >
> > E desculpem pelo tamanho do e-mail
> >
> >
> > Cristiano Torres
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
> >
> >
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070122/3429e555/attachment.html 


Mais detalhes sobre a lista de discussão Cascavel-pm