[FUG-BR] RES: RES: RES: Script perl consome muito CPU
Fabio Kaminski
fabiokaminski em gmail.com
Terça Agosto 17 17:46:40 BRT 2010
Zhu Sha Zang escreveu :
"Sugiro pesquisar por técnicas de pooling em perl. Esse "while (1)" é
absurdo."
exatamente.. tem que usar algum pooling pra IO(de preferencia assincrona) e
uma logica de eventos no estilo publisher/subscriber
no freebsd nativamente existe o kqueue.. e no linux o epool.. tem que ver
qual o nivel de acesso do perl a isso ai
infelizmente(ou felizmente) estou afastado do perl desde 97 por ai.. entao
tem que dar uma pesquisada.
dependendo do seu servidor web..quem sabe não exista um suport nativo , pra
escrever em outras fontes?!
se vc tiver escolha de linguagem, e querendo fazer isso em script, sugeriria
python ou até mesmo erlang(outra embutida no servidor .. a php), que são
menos cripticas e onde vc teria mais suporte.. enfim.. acho que solução
pronta pra isso..vai ser meio dificil.. sempre tem que customizar..dai a
utilidade de usar uma linguagem de script pra isso
2010/8/17 Fernando Buzon Macedo <fernando em bebedouro.sp.gov.br>
> Leonardo, muito obrigado pelas informações.
> Eu pensei que essa parada de FIFO do Perl fizesse o papel desse evento
> "onfilechange", afinal file input file output, mas então não é o caso
> então... rs
>
> Já tinha pensado em fazer eu mesmo, minha dúvida tinha sido sobre essa do
> fseek na próxima leitura, como você sugeriu registrar o numero de bytes da
> leitura anterior, está certo mesmo...
>
> Foi apenas uma ilusão pelo nome FIFO que me confundiu.
> Pensei ter descoberto o "onfilechange", por isso nem pensei em outra opção.
>
> Vou rever meus conceitos.
> Muito obrigado a todos da lista, aqui você encontra mesmo! Hehehe
>
> abs
>
> -----Mensagem original-----
> De: freebsd-bounces em fug.com.br [mailto:freebsd-bounces em fug.com.br] Em nome
> de Leonardo Augusto
> Enviada em: terça-feira, 17 de agosto de 2010 13:31
> Para: Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)
> Assunto: Re: [FUG-BR] RES: RES: Script perl consome muito CPU
>
> Mas qual o proposito desse script ?
>
> Pegar o que vai sendo gravado no var/log/dansguardian/access.log e
> inserir no mysql ??
>
> Se for isso, o problema é que vc fica num loop e lendo o arquivo....
>
> Pq nao faz o seguinte, usa o crontab, pra executar esse script a cada
> minuto, aí o script
> le o log, registra o numero de bytes lidos para dar um fseek na
> proxima leitura... e grava no mysql..
> Vai entrar, ler, gravar e sair...
>
> Qualquer coisa que vc faca que fique num loop lendo um arquivo do
> filesystem vai ficar com alto nivel de consumo
> de cpu, pois nao tem um evento do SO "onfilechange" eheh pra chamar
> teu perl. Se voce quer um processo que faca isso
> acho que tens que usar threads ou de C ou java para que nao consuma
> tanta cpu, um processo com while + sleep consome.
>
> Acho que é isso
>
> 2010/8/17 Fernando Buzon Macedo <fernando em bebedouro.sp.gov.br>:
> > Como disse, peguei esse script já pronto no site do dansguardian.
> > De programação eu conheço muito pouco.
> >
> > Zhu Sha Zang, sem querer ser folgado, mas você não teria uma opção
> simples
> > pra ficar no lugar de while (1) aí?
> >
> > De qualquer forma obrigado, vou pesquisar sobre pooling Perl.
> > Valeu.
> >
> >
> > -----Mensagem original-----
> > De: freebsd-bounces em fug.com.br [mailto:freebsd-bounces em fug.com.br] Em
> nome
> > de Zhu Sha Zang
> > Enviada em: terça-feira, 17 de agosto de 2010 11:28
> > Para: freebsd em fug.com.br
> > Assunto: Re: [FUG-BR] RES: Script perl consome muito CPU
> >
> > Em 17-08-2010 11:21, Rafael Henrique Faria escreveu:
> >> 2010/8/17 Fernando Buzon Macedo <fernando em bebedouro.sp.gov.br>
> >>
> >>> Obrigado.
> >>> Eu acho que entendi sua idéia, vou ver em Perl e vou fazer, mas seria
> > tipo:
> >>>
> >>> next LOG unless defined $message;
> >>> if (!$message)
> >>> sleep 1
> >>> else
> >>> {
> >>> //Resto do código
> >>> }
> >>>
> >>>
> >> Você colocou o sleep depois do retorno do loop. O comando que faz o
> >> look é o "next LOG".
> >>
> >> Eu tentaria algo do tipo:
> >>
> >> LOG: sleep 1; while (1) {
> >> my $message = <FIFO>;
> >> next LOG unless defined $message;
> >>
> >> Seria isso né?
> >>> Valeu, se conseguir algo posto aqui.
> >>>
> >>> -----Mensagem original-----
> >>> De: freebsd-bounces em fug.com.br [mailto:freebsd-bounces em fug.com.br] Em
> >>> nome de Rafael Henrique Faria Enviada em: terça-feira, 17 de agosto
> >>> de 2010 10:27
> >>> Para: Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)
> >>> Assunto: Re: [FUG-BR] Script perl consome muito CPU
> >>>
> >>> 2010/8/17 Fernando Buzon Macedo <fernando em bebedouro.sp.gov.br>
> >>>
> >>>> LOG: while (1) {
> >>>>
> >>>>
> >>> Bom dia Fernando.
> >>> O problema, é esse while (1)
> >>>
> >>> O código do script é realmente compacto, ele não realiza processamento.
> >>> Então, ele não deveria, e não poderia consumir CPU.
> >>> Porém, como ele está em um loop infinito, ele acaba consumindo CPU.
> >>>
> >>> O que você pode fazer, é melhorar esse script, com outras formas de
> >>> obter os dados. Eu não conheço PERL, por isso não posso ajudar muito,
> >>> mas posso dar uma sugestão:
> >>>
> >>> next LOG unless defined $message;
> >>>
> >>> Nessa parte do código, em vez de já pular para o loop novamente
> >>> quando não existir nenhum dado a ser processado, poderia ser dada uma
> >>> pausa... de 1 segundo por exemplo. Iria diminuir drasticamente o
> > processamento.
> >>>
> >>>
> >>> --
> >>> Rafael Henrique da Silva Faria
> >>> -------------------------
> >>> Histórico: http://www.fug.com.br/historico/html/freebsd/
> >>> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> >>>
> >>> -------------------------
> >>> Histórico: http://www.fug.com.br/historico/html/freebsd/
> >>> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> >>>
> >>
> >>
> > Sugiro pesquisar por técnicas de pooling em perl. Esse "while (1)" é
> > absurdo.
> >
> > Att
> >
> >
> > -------------------------
> > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> >
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>
Mais detalhes sobre a lista de discussão freebsd