performance-em-java-1195015233870696-5
-
Upload
alan-oliveira -
Category
Documents
-
view
29 -
download
1
Transcript of performance-em-java-1195015233870696-5
Performance em Aplicaes JavaClaudio Miranda Summa TechnologiesConexo Java 2007
ObjetivoDicas para melhoria de performance em aplicaes Java Aprenda tcnicas e ferramentas para diagnosticar e resolver problemas de desempenho em um ambiente Java
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
2
ObjetivoAs tcnicas mostradas aqui so baseadas na experincia do autor, no necessariamente ela deve ser interpretada como uma receita de bolo unicamente
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
3
Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
4
Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
5
Dicas em Performance Ajustes baseados em nmeros Tx/s (mdia de transaes por segundo) Usurios concorrentes Quantidade de sesses
Armadilhas O mais rpido possvel Est muito lento! necessrio definir nmeros de performance
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
6
Dicas em Performance Ao lidar com performance, um jogo de interesses com flexibilidade e manuteno Refactoring com foco em performance TESTES !
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
7
Dicas em Performance Onde est o problema ?Memria, CPU, disco, I/O, rede
Passos Diagnstico Priorizao Anlise Soluo Marretada Ideal
Teste Documentao29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 8
Dicas em Performance Ajustes em cdigo Microbenchmarks Percepo do usurio final
Ajustes de arquitetura O que uma transao ? Tx JDBC Tx Fila Tx connector JCA
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
9
Dicas em Performance Concorrencia Use pool de threads Diminuir o tamanho do stack (-Xss) Use GC Paralelo Mltiplas CPU,multicore, mltiplas threads por core
Aproveitar as classes Java nativas para sincronizao e concorrncia Pacote java.util.concurrency Collections Thread safety
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
10
Dicas em Performancevoid runServer() { serverSocket = new ServerSocket(4444); clientSocket = serverSocket.accept(); new Thread(new ClientOperator(clientSocket)).start(); } class ClientOperator implements Runnable { public void run() { final int BUFFER = 128; InputStream clientIn = clientRunner.getInputStream();
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
11
Dicas em PerformanceExecutor pool = Executors.newFixedThreadPool(10); void runServer() { serverSocket = new ServerSocket(4444); clientSocket = serverSocket.accept(); pool.execute(new ClientOperator(clientSocket)); } class ClientOperator implements Runnable { public void run() { final int BUFFER = 128; InputStream clientIn = clientRunner.getInputStream();
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
12
Dicas em Performance Acesso a Banco de Dados Em atividades read-only (relatrios e consultas) Usar um pool especfico Usar isolamento transacional menos restritivo
Diminuir o isolamento transacional Use JDBC puro para performance Use PL/SQL para transformaes de dados, exigindo alta performance em operaes batch Use cache e poltica para limpeza No usar o protocolo XA
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
13
Dicas em Performance JVM Desabilitar o security manager em ambientes confiveis Desabilitar a verificao de classes -Xnoverify
GC JDK > 5: Desabilitar o verbose GC, usar jstat Usar algoritmos paralelos em mquinas multiprocessadas e multicore -XX:+UseParallelGC -XX:+UseParallelOldGC
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
14
Dicas em Performance I/O Remover System.out Diminuir log Usar if (log.isDebugEnabled()); para evitar concatenao de strings Usar java.io.Externalizable para serializao Usar buffers e java.io.BufferedInputStream
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
15
Dicas em Performance Servidores de Aplicativos Colocar na inicializao, as tarefas de carga, parsing, pr-compilao, etc. Problema: deploymen e inicializao demorado Benefcio: runtime rpido
Ajustes Acceptor threads, pool, timeout, http queue, NIO, EJB commit-option, http session tuning
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
16
Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
17
Heap
HEAP-Xmx2g
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
18
Heap Larga rea de memria que armazena objetos e suas referncias dividido em geraes Gerao Young (ou New ou Eden) Gerao Old (Tenured) Gerao Permanente (PermGem)
O GC ocorre apenas quando a gerao no tem espao para alocao de novos objetos Automaticamente remove objetos da memria que no possuem referncia Possui diferentes algoritmos de GC29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 19
Heap
YOUNG
OLD
-XX:MaxNewSize=256m -Xmx2g29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 20
Heap Gerao Young Onde novos objetos so alocados A alocao de memria de curta durao Objetos que no possuem referncia so removidos pelo GC GC ocorre com mais frequncia Tamanho pequenoprivate String name = Bruce Lee; public Result consumidor(Long id) { Result r = processar(id); return r; }29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 21
Heap
YOUNG
OLD
-XX:MaxNewSize=256m -Xmx2g29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 22
Heap Gerao Old Onde permanecem objetos cujas referncias sobreviveram ao GC da rea Young Objetos de longa durao GC ocorre com menor frequncia Tamanho superior rea Young Exemplos: Atributos estticos, final, Singletonpublic static String name = Bruce Lee; public final Map cache = new HashMap(); private static Loader singleton = new Loader();
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
23
Heap
YOUNG
OLD
Perm
-XX:MaxNewSize=256m -Xmx2g29/12/2011
-XX:MaxPermSize=128m24
Copyright: Claudio Miranda - Evento Conexo Java 2007
Heap Gerao Permanente Pouca ao de GC Armazena a estrutura das classes Armazena informaes de reflexo Objetos de origem nativa (JNI) No participa do heap (-Xmx)
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
25
Heap
Eden
From Eden To Eden (survivor 1) (survivor 2)
Criao de objetos
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
26
Heap
Eden
From Eden
To Eden
Ocorre um GC na rea Young, quando no tem mais espao29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 27
Heap
Eden
From Eden
To Eden
Ocorre outro GC na rea Young
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
28
Heap
To Eden
Old
Outro GC ocorre, ento objetos que contm referncia so transportados para a rea Old29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 29
Heap Na rea de memra Old ocorremRedimensionamento (-Xms -Xmx) Compactao (desfragmentao) Larga rea de memria para ser monitorada GC ocorre de acordo com a poltica do algortmo Old
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
30
Heap Ergonomia (JDK 5 e 6) Dimensionamento automtico das geraes Baseado nas informaes Sistema Operacional Verso da JVM Quantidade de Memria RAM Quantidade de processadores Tipo do processador (Sparc)
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
31
Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
32
Tcnicas Resolvendo problemas de memria OutOfMemoryError (OOME) Outros problemas em geral
Resolvendo problemas de CPU Uso intensivo de CPU e threads Garbage Collector com frequncia Outros problemas em geral
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
33
TcnicasCada tcnica para diagnosticar problemas, tem um nvel de intruso no sistema, que pode variar entre um rpido monitoramento no sistema ou um profiler e debug no sistema. Essa a chave que ir determinar o tempo29/12/2011
para resoluo do problemaCopyright: Claudio Miranda - Evento Conexo Java 2007
34
Problemas de memria Como diagnosticar um OOME ? Olhe nos logs de aplicaes Monitore o comportamento jmap, jstack, visualgc, jconsole, log do GC
Verifique qual a causa do OOME
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
35
Problemas de memria Tipos de OOME Java heap space PermGen space Out of swap space unable to create new native thread
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at ConsumeHeap$BigObject.(ConsumeHeap.java:22) at ConsumeHeap.main(ConsumeHeap.java:41)
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
36
Problemas de memriaJava heap space Causas Pouca memria fsica Monitoramento pelo SO: prstat, top, vmstat, mpstat
Baixo valor do heap Tanto Young (-XX:MaxNewSize)e Old (-Xmx)
Reteno de objetos (memory leak) Monitorar com jconsole ou gcviewer, a evoluo do GC Uso de profiler para monitorar objetos retidos em cada invocao do GC29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 37
Problemas de memriaMonitoramento pelo sistema operacional
top
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
38
Problemas de memriaJava heap space Diagnstico de memory leak, com monitoramento de GC
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
39
Problemas de memriaDiagnstico de memory leak com profiler
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
40
Problemas de memriaDiagnstico de memory leak com profiler
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
41
Problemas de memriaDiagnstico de memory leak com heap dump
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
42
Problemas de memriaJava heap space Correo Aumente o tamanho do heap Tanto Young (-XX:MaxNewSize)e Old (-Xmx)
Memory leak Liberar as objetos alocados Normalmente so colees com finalidade de cache
Aumentar a memria fsica da mquina
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
43
Problemas de memriaPermGen space Causas Pouca memria disponvel para a memria permanente Classloader leak Ocorre quando um classloader ser descartado, mas um objeto carregado por este classloader referenciado por objetos fora deste classloader
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
44
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
45
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
46
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
47
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
48
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
49
Problemas de memriaClassloader leak
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
50
Problemas de memriaPermGen space Correo Aumente o tamanho da memria permanente Geralmente ocorre quando usado frameworks de gerao de classes -XX:MaxPermSize e -XX:PermSize
Classloader leak Gerenciar a dependncia dos objetos, para remover a referncias dependentes
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
51
Problemas de memriaOut of swap space Causas Geralmente ocorre em cdigo nativo (JNI) Geralmente invocado por alguma operao Java
Falta de espao na memria do SO
Correo Aumentar memria fsica da mquina Diminuir tamanho do heap do java
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
52
Problemas de memriaUnable to create new native thread Causas Tamanho elevado do stack (-Xss) Pouca memria disponvel para o SO Pois cada thread em Java mapeada para uma thread do SO (native threads)
Pobre gerenciamento de threads
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
53
Problemas de memriaUnable to create new native thread CorreoDiminuir o tamanho do Stack (-Xss) Aumentar memria fsica Diminuir tamanho do heap, pois sobra espao para o SO Melhor gerenciamento de threads Usar pool de threads, disponvel do Java 5
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
54
Problemas de memria E quando ocorre um crash no servidor ? Habilitar o dump de memria (heap dump) -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpOnCtrlBreak
Analisar o dump gerado O tamanho do dump gerado proporcional ao tamanho do heap
Heap roots e heap analyzer SAP Memory Analyzer jhat
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
55
Problemas de memria Outras ferramentas de suporte a monitoramento de memria vmstat pmap ulimit
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
56
Problemas de memriaMonitoramento pelo sistema operacional vmstat
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
57
Problemas de memriapmap
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
58
Problemas de memriaulimit
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
59
Problemas de CPU Como diagnosticar consumo de CPU? Monitorar uso do sistema operacional Verificar qual aplicao consome os recursos Monitorar o GC Monitorar as threads Uso de profiler
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
60
Atividade do SO
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
61
Problemas de CPU Monitorar uso do sistema operacional Se o problema for da aplicao Java ento outro tipo de monitoramento necessrio
Verificar atividade de GC
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
62
Atividade do GC
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
63
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
64
Atividade do GC Correo Dimensionar as reas de memria adequadamente Mesmo que no ocorra OOME, a frequencia do GC consome CPU exageradamente
Parametrizar o comportamento da JVM Algoritmos de GC
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
65
Problemas de CPU
Verificar atividade de Threads
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
66
Comportamento das threads Causas Pobre gerenciamento de threads Quantidade exagerada de threads No usar pool de threads
Mquina insuficiente para processamento Dead lock Dependncia circular
Pobre implementao da aplicao Processamento intenso de strings Transformao de dados desnecessria
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
67
Comportamento das threads jstack
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
68
Comportamento das threads
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
69
Comportamento das threads
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
70
Comportamento das threads Uso do profiler implica Aplicao compilada em modo debug Modificar as configuraes da JVM para profiler Penaliza performance Modifica o comportamento da JVM (modo interpretado)
Console grfico para anlise on-line
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
71
Ferramentas adicionais para diagnstico
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
72
Ferramentas para diagnstico Outras ferramentas para diagnstico mpstat, prstat, top, vmstat, pmap Estatsticas de CPU e memria
iostat Trfego de I/O (rede e disco)
pstack Stacktrace de processos
strace, truss Rastreio de system calls
ps, pstree, ptree rvore de processos29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 73
Ferramentas para diagnstico Outras ferramentas para diagnstico ldd rvore de dependncias de bibliotecas
dmesg Inicializao do kernel
ulimit Limites de recursos do usurio
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
74
Ferramentas para diagnstico Rede (unixes) Wireshark (Ethereal), tcpdump, snoop Anlise de trfego de rede
dig, nslookup Resoluo de nomes DNS
netstat Status de conexes, tabelas de roteamento, etc
lsof Estatsticas de uso de file descriptors
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
75
Ferramentas para diagnstico
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
76
Ferramentas para diagnstico
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
77
Agenda Performance em Aplicaes e Ambiente Compreenso bsica do gerenciamento de memria Tcnicas e ferramentas para diagnstico Dicas
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
78
Dicas Servidor de Aplicativos Monitoramento de recursos Pool de conexes, threads
Logs Nveis de log
Keep-alive e pipeline Classpath Cluster Sincronizao, I/O, rede
Threads Acceptor, queue, pool, timeout29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 79
Dicas Servidor de Aplicativos Classloader Carga dinmica de aplicaes Compilao de JSP, redeploy, autodeploy, auto discovery
Gerenciamento de sesso HttpSession Stateful Session Bean
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
80
Dicas Seja cauteloso com informaes obtidas No seja prematuro ao informar sobre onde est o problema Ter uma viso do contexto computacional Configurao de mquinas, sistema operacional, estrutura de rede, servios, e dependncias
Compreender quais os servios afetados e nvel de importncia Conhecer as equipes envolvidas e seus responsveis29/12/2011 Copyright: Claudio Miranda - Evento Conexo Java 2007 81
Dicas No entre em pnico Conhea as ferramentas e como us-las No dependa de consoles grficos Isole o problema Tente confirmar todos os relatos Ter acesso ao cdigo fonte da aplicao Ter a mo um bom decompilador (jad) Verificar todos os arquivos de configuraes Ao confirmar o problema, j entregue a soluoCopyright: Claudio Miranda - Evento Conexo Java 2007 82
29/12/2011
Muito Obrigado Claudio Miranda [email protected] http://www.soujava.org.br http://www.summa-tech.com http://www.claudius.com.br
29/12/2011
Copyright: Claudio Miranda - Evento Conexo Java 2007
83