Como posso monitorar o uso de memória para uma JVM baseada em Windows e disparar um alerta se ele ficar muito alto?

5

Eu tenho um aplicativo que é executado como uma JVM no Windows 2008. Gostaria de monitorar seu uso de memória e receber um email se / quando o uso de memória atingir um limite específico. Existe um utilitário ou método gratuito para fazer isso?

    
por Mike B 03.07.2012 / 19:48

5 respostas

4

O sistema operacional Win2008 pode enviar alertas para condições de limite do contador de desempenho.

Part 1 # Perfmon
Launch Performance Monitor (perfmon.msc)
Create a new User Defined Data Collector Set
Choose to create manually after naming
Select Performance Counter Alert
Click Add - choose the Object, Counter and Instance to monitor. Process/Java.exe/Working Set
Specify the alert threshold
Choose "open properties for this data collector set"
Specify a start schedule if the server is on a reboot schedule
Change the sample interval. Alert repeats at this interval when value it above threshold
Under Alert task, give it a name (like sendMail)
Start the Data Collector Set

Part 2 # Schedule Tasks
Open up scheduled tasks (compmgmt.msc/configuration/task scheduler)
Create a task, not a basic task
Name it the exact same name you did in the above section (like sendMail)
Check "user is logged in or not" so that it runs all the time. Change username if necessary.
Create a new email action under the Action tab
Enter all the info for from, to, subject, etc.
Enter the SMTP server.
You will be prompt for the password to run the task when you are not logged on.
    
por 18.07.2012 / 22:20
4

De fato, os limites de memória da JVM são controlados por parâmetros de inicialização como -Xmx2048m -Xms256m -XX:MaxPermSize=512m (é exemplo). A JVM usará essa memória permitida. Aplicação estável não vazando não sairá dos limites.

De volta ao monitoramento, é possível ativar o agente SNMP interno da JVM e, em seguida, monitorar o uso de heaps e PermGen e, através da comunidade SNMP privada, é possível configurar limites quando excedidos. A JVM enviará traps SNMP. Na verdade, é "solução corporativa de monitoramento" por ferramentas como o HP OpenView. Parâmetros de linha direta envolvidos:

-Dcom.sun.management.snmp.port=10001 -Dcom.sun.management.snmp.acl=/home/liferay/snmp.acl -Dcom.sun.management.snmp.interface=0.0.0.0

Eles são auto-explicativos. O modelo de arquivo ACL está em JRE_HOME/lib/management/snmp.acl.template . Para obter respostas legíveis e não apenas SNID OIDs, faça o download do JVM-MANAGEMENT- MIB.mib . Algumas explicações breves são aqui no site da Oracle . Quando o SNMP está ativado, você pode verificar os indicadores retornados executando:

snmpwalk -v2c -c public YourWinHost:10001 -m JVM-MANAGEMENT-MIB jvmMgtMIB

Espera-se que você coloque JVM-MANAGEMENT-MIB.mib no diretório Net-SNMP MIB padrão (linha de comando Unix ou CygWin).

Para não esquecer o envio de e-mails, estou fazendo o monitoramento da JVM pelo Zabbix em conjunto com o SNMP no cluster que executa o cluster de back-end em todo o país do Post Escritório. Ele cobre todos os requisitos de monitoramento de tempo de execução. O Zabbix pode enviar um e-mail ou uma mensagem Jabber IM no caso de algum gatilho ser disparado. O Zabbix suporta o monitoramento de agente SNMP e o SNMP também. Fiz o teste mensal de serviços na nuvem, quando a JVM monitorada estava em algum lugar nos EUA e o servidor Zabbix na Irlanda ... funcionava bem mesmo para tais distâncias / atrasos. Desde a versão 2.0, o monitoramento JMX é possível, mas, para ambientes seguros, pode ser complicado, pois o JMX-RMI configura algumas portas aleatórias.

Em geral, o SNMP é suficiente para o monitoramento do tempo de execução da JVM e o JMX pode ajudar mais em máquinas de desenvolvimento / teste, pois pode monitorar nuances de aplicativos.

Se você estiver na nuvem com sua máquina Windows, poderá usar um dos serviços de monitoramento SaaS. Fiquei bastante impressionado com os serviços NewRelic . É fácil de configurar e realmente útil para fases de desenvolvimento / teste, porque pode fazer coisas como despejos de threads, consultas SQL lentas a.s.o. Pode enviar emails quando o limite é atingido.

    
por 15.07.2012 / 23:03
2

Como o Windows 2012 Server descontinuou o tipo de tarefa "enviar e-mail", você precisará de um script que enviará um e-mail. Por exemplo, um VBScript:

Set Msg = CreateObject("CDO.Message")

With Msg

 .To = "[email protected]"
 .From = "[email protected]"
 .Subject = "low memory"
 .TextBody = "low memory, check the server now"
 .Send
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.yourserver.com"
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
 .Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "smtp-user"
 .Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "smtp-password"

End With

Os outros passos são praticamente os mesmos. Consulte esta postagem no blog para mais informações

    
por 25.04.2014 / 23:56
1

Você pode configurar o monitoramento com o JMX.

Este é um aplicativo de servidor em execução no Tomcat ou em um servidor de aplicativos JEE? ou isso é um aplicativo Java de linha de comando? ou um aplicativo Java do Windows Service Wrapped? Qual JVM? Quais configurações? O Oracle JDK Rockit tem um ótimo monitor de memória, o Oracle JRockit Mission Control 4.1 ou o link .

Você pode escrever um tópico em seu aplicativo que durma e desperte para verificar a memória.

Veja estas postagens: link ou link

    
por 13.07.2012 / 22:05
1

Você pode executar o JMX, mas não mostra, por exemplo. coletor de lixo. Você também pode monitorar o arquivo de log. Não há nenhum utilitário para reiniciar o Java quando ele ficar sem memória. Mas é fácil codificar apenas em Java e ser executado como servidor, que verifica se os aplicativos estão funcionando corretamente e a lógica de negócios que você precisa inventar, por exemplo, if(TotalCPUTime > 1d) restartJava();

De qualquer forma, para reiniciar o Java remotamente através do JMX, é necessário acesso ao servidor, portanto, não há nenhum utilitário para fazer esses dois ao mesmo tempo - para realmente executar, observar, reiniciar e monitorar o Processo Java. Você pode executar esse Java em outro Java também, portanto ele fará o monitoramento e a reinicialização ao mesmo tempo e executaria um pequeno java.exe para fazer isso.

    
por 15.07.2012 / 20:48