100% de consumo de CPU  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Alguém sabe por que alguns programas quando rodam certas rotinas ficam com 100% de uso de CPU? Alguém sabe como amenizar isso? Eu poderia usar Threads? Não estou me referindo apenas ao Java.

Estou fazendo um programa que faz uma parada, mas o chato é que ele fica com esses malditos 100%.

Mas o pior é outro programa de um colega meu, que roda como um serviço e fica pingando para um servidor de tempos em tempos. Mas ele fica direto com esses 100%, precisávamos tirar isso. Como os outros programas fazem coisas e não ficam assim?

Alguma luz?
fmeyer
Moderador
[Avatar]
Membro desde: 22/02/2005 17:26:29
Mensagens: 1583
Localização: Sao Paulo
Offline

esses processos que usam muito recurso da CPU com certeza ou fazer um trabalho exorbitante de processamento ou estão com algum tipo de problema em alguma logica (algum loop, teste de IO)
eu não acho q threads va diminuir o processamento se este estiver com erro. mas sim serão uma boa medida para tornar seu sistema mais robusto..

Dica: Se voce usa linux da uma olhada nos temas sobre processo, escalonamento, alocação e compartilhamento de recursos POSIX.

Fernando Meyer http://fernandomeyer.com
[Email] [WWW]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Se sua aplicação possui um CPU burst muito alto, que tal um CPU hyperthreaded ou mais um CPU?

Faça o seguinte, ative o log do GC e veja quanto tempo ele está levando apra fazer um Full GC. Pode ser que você possa amenizar isso com uma otimização no GC, mas se tiver que apelar para isso é sinal que algo provavelmente está errado na sua arquitetura (otimizaçãod e GC é sempre bom, mas quando o GC passa a ser um problema, a culpa é do programador, experiência própria )

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

scottys0, o programa faz uma busca no registro do Windows, usando uma função recursiva. Só que a busca do regedit nem de longe fica com esses 100% de CPU. E o que tem demais dar um ping de tempos em tempos, usando um timer? Eu não consigo ver motivo pro troço consumir toda a CPU. Acho que até um loop grande de soma de dois números ficaria em 100%...
Luca
Moderador
[Avatar]

Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline

Olá

renato3110 wrote:...função recursiva.


E como está a alocação dos objetos disto aí? Como disse o Phillip, parece coisa de programador tipo memory leak ou coisa do gênero.

[]s
Luca

Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/
[Email] [WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Luca wrote:Olá

renato3110 wrote:...função recursiva.


E como está a alocação dos objetos disto aí? Como disse o Phillip, parece coisa de programador tipo memory leak ou coisa do gênero.

[]s
Luca


Desculpem mas não é em Java o programa. Me advirtam se estou errado em buscar ajuda para isso.

Luca, eu não crio objetos dentro da função recursiva, eu passo os objetos fora da chamada da função justamente para evitar processamento desnecessário. Eu gostaria de achar alguém que já tivesse enfrentado esse problema e conseguiu "resolver".

Outra coisa, no Java se eu lançar uma thread no clique de um botão, eu posso parar o processo com outro botão, ou mesmo fechar o programa? É que no Delphi não consigo isso (só com um checkbox e o programa não fecha), não sei se é porque faço alguma coisa errada.

pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

renato3110 wrote:
Desculpem mas não é em Java o programa. Me advirtam se estou errado em buscar ajuda para isso.


Não tme nada de errado, ams como o fórum é sobre Java, por default todo mundo assume que a pergunta também

renato3110 wrote:
Luca, eu não crio objetos dentro da função recursiva, eu passo os objetos fora da chamada da função justamente para evitar processamento desnecessário. Eu gostaria de achar alguém que já tivesse enfrentado esse problema e conseguiu "resolver".


O que tu usa (Delphi?) tem profiler disponível? Se tiver, procure um bom para ver se tem algo errado com sua lógica....

renato3110 wrote:
Outra coisa, no Java se eu lançar uma thread no clique de um botão, eu posso parar o processo com outro botão, ou mesmo fechar o programa? É que no Delphi não consigo isso (só com um checkbox e o programa não fecha), não sei se é porque faço alguma coisa errada.


Parar uma thread na execução? Java tinha o Stop, ms é deprecated. Entretanto, dê uma olahda no texto do JavaDoc que vait e dar uma idéia do que pdoe ser feito.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Luca
Moderador
[Avatar]

Membro desde: 06/09/2002 14:30:10
Mensagens: 5810
Localização: São Paulo/SP ou Paraty/RJ
Offline

Olá

GpProfile is instrumenting profiler for Delphi 2, 3, 4, and 5

Procure por profilers. Tem um monte de produtos comerciais muito bons. Veja os da Borland e da Compuware por exemplo.

[]s
Luca

Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/
[Email] [WWW]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Muito obrigado Luca e Shoes pelas dicas, quando tiver tempo vou ver se uso o profiler e também "enxuto" o código (tiro log, atualização da GUI etc.).

E, Shoes, não é recomendado parar uma Thread?
escordeiro
Java Ninja
[Avatar]
Membro desde: 20/08/2003 09:31:08
Mensagens: 257
Localização: Belo Horizonte
Offline

Acho que não foi isso que o shoes quis dizer

O método stop da classe Thread é depreciado, mas não é que não é recomendado parar uma thread...a implementação de stop da Sun causava deadlocks e, por isso, esse método foi depreciado, mas ainda existem maneiras de parar threads sem causar problemas de sincronização e outras aberrações

Flickr
[Email] [Yahoo!] [MSN] [ICQ]
chicobento
JavaGuru
[Avatar]

Membro desde: 14/06/2004 01:44:04
Mensagens: 226
Localização: Campinas
Offline

renato3110 wrote:
Outra coisa, no Java se eu lançar uma thread no clique de um botão, eu posso parar o processo com outro botão, ou mesmo fechar o programa? É que no Delphi não consigo isso (só com um checkbox e o programa não fecha), não sei se é porque faço alguma coisa errada.


Um modo simples de fazer isso é criar uma Thread Daemon e no botao de fechar colocar um System.exit(0);

SCEA 5
[MSN]
MarcioTavares
Virtual Machine Man
[Avatar]

Membro desde: 09/11/2002 19:33:28
Mensagens: 738
Localização: Rio de Janeiro
Offline

Renato, uma vez eu fiz manutenção em um sistema feito em VB, que tinha um módulo que rodava como um serviço do Windows. Esse módulo tinha que ficar "adormecido" enquanto determinada ação não era feita. A lógica original ficava com um consumo de processamento próximo a 100%, porque quem fez a rotina de sleep fez um "while acao = X" normal. A solução para isso foi simplesmente usar a função sleep da API do Windows, que é, superficialmente falando, muito mais otimizada pra esse tipo de uso do que a maneira usada antes, que utiliza obviamente os recursos normais do processador.
Por esse mesmo motivo é que seu sistema que vasculha o Registro do Windows utiliza pouco processamento, porque usa a API do Windows, e o outro sistema que faz um ping simples não, porque provavelmente utiliza uma lógica normal. Mas eu não considero isso necessariamente errado. Essa lógica na verdade não está otimizada.

- Galera do RJ precisa prestigiar os eventos de Java!!

- Sou a favor da extinção do Cobol da face da Terra!
[Email] [MSN]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

MarcioTavares wrote:
Por esse mesmo motivo é que seu sistema que vasculha o Registro do Windows utiliza pouco processamento, porque usa a API do Windows, e o outro sistema que faz um ping simples não...


Marcio, obrigado pelas dicas! Um colega no fórum de Delphi também falou do Sleep. Só esclarecendo, os dois programas, o do registro e o do ping estão em 100%, é o regedit (editor nativo do Windows) que fica com consumo bem baixo.
MarcioTavares
Virtual Machine Man
[Avatar]

Membro desde: 09/11/2002 19:33:28
Mensagens: 738
Localização: Rio de Janeiro
Offline

Dependendo da Classe que vc use, dá pra otimizar sensivelmente o acesso ao Registro. Dá pra achar milhares de implementações de classes de acesso ao Registro pela internet, mas a maioria delas usam modos de acesso meio genéricos. O ideal mesmo é pegar uma e fazer as suas próprias otimizações. Se bem que eu nunca usei acessos muito pesados no Registro...


- Galera do RJ precisa prestigiar os eventos de Java!!

- Sou a favor da extinção do Cobol da face da Terra!
[Email] [MSN]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Só uma coisa Marcio, poderia explicar melhor essa coisa de Sleep? Não entendi o que tem a ver. Seria algo como "acalmar" uma thread "nervozinha"?
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team