Pergunta

Eu tenho um programa Java para fazer um conjunto de cálculos científicos em vários processadores, quebrando-o em pedaços e funcionando cada peça em um segmento diferente. O problema é trivialmente partitionable então não há nenhuma disputa ou comunicação entre os tópicos. Os únicos dados comuns que acessam alguns caches estático compartilhados que não precisam ter seu acesso sincronizado, e alguns arquivos de dados no disco rígido. Os tópicos também são continuamente escrita para o disco, mas para arquivos separados.

O meu problema é que às vezes, quando eu executar o programa eu recebo muito boa velocidade, e às vezes quando eu executo o exato mesma coisa corre muito lentamente. Se eu vê-lo correr devagar e ctrl-C e reiniciá-lo, ele irá normalmente começar a correr rápido novamente. Parece-fixou-se em qualquer modo lento ou modo rápido no início da corrida e nunca muda entre os modos.

Eu conectei a jconsole e não parece ser um problema de memória. Quando eu travei-lo funcionando lentamente, eu tentei ligar um profiler para ele, mas o profiler não irá se conectar. Eu tentei correr com -Xprof mas as lixeiras entre uma corrida lenta e rápida corrida não parece ser muito diferente. Eu tentei usar diferentes coletores de lixo e diferentes dimensionamentos das várias partes do espaço de memória, também.

Minha máquina é um Mac Pro com partição RAID listrado. O uso da CPU nunca cai fora se o seu lento ou rapidamente, o que você esperaria se tópicos foram gastando muito tempo de bloqueio em lê a partir do disco, então eu não acho que poderia ser um disco ler problema.

A minha pergunta é, quais os tipos de problemas com meu código poderia causar isso? Ou este poderia ser um problema de sistema operacional? Eu não tenho sido capaz de duplicá-lo em um Windows uma máquina, mas eu não tenho uma máquina Windows com uma configuração RAID similar.

Foi útil?

Solução

Você pode ter fio que ter ido em um loop infinito.

Tente conectar com VisualVM e usar o monitor da linha.

https://visualvm.dev.java.net

Você pode ter que ligar antes que o problema ocorre.

Outras dicas

Eu segundo que você deveria estar fazendo isso com um profiler olhando para os fios visualizar - quantos threads, o que os estados que eles estão em, etc. Pode ser uma condição de corrida estranha acontecendo de vez em quando. Também poderia ser o caso que instrumentar as classes com ganchos de perfil (que provoca desaceleração), Sortes a condição de corrida para fora e você não verá nenhuma desaceleração com o profiler em anexo: /

Por favor, dê uma olhada no este post , ou melhor, a resposta, onde há problema de contenção de cache mencionado.

Você está gerando os mesmos umber de tópicos de cada vez? É que o número menor ou igual ao número de threads disponíveis em sua plataforma? Esse número pode ser verificado ou guestimated com uma precisão razoável.

Por favor, poste qualquer finidngs!

Você tem uma ferramenta para medir a temperatura da CPU? O sistema operacional pode ser estrangulamento do CPU para lidar com problemas de temperatura.

É possível que seu programa está sendo paginada para disco, às vezes? Neste caso, você vai precisar de olhar para o uso de memória do sistema operacional como um todo, em vez de apenas o seu programa. Sei, por experiência, há uma enorme diferença no desempenho de tempo de execução quando a memória está sendo continuamente paginada para o disco e volta.

Eu não sei muito sobre OSX, mas no linux o comando "free" é útil para este fim.

Outra questão que pode causar este abrandamento é arquivos de log? Conheço pelo menos algum código de registro que abrandou o sistema de forma incremental como os arquivos de log cresceu. É possível que seus tópicos estão sincronizando em um arquivo de log que está crescendo em tamanho, em seguida, quando você reiniciar o programa, outro arquivo de log é usado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top